<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4445495606564470547</id><updated>2012-01-31T22:21:15.291Z</updated><category term='Yuma'/><category term='RBScript'/><category term='REALbasic'/><title type='text'>rbjottings</title><subtitle type='html'>Steve Garman's occasional musings on the REALbasic programming language.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-4790971253589314573</id><published>2009-10-31T21:17:00.009Z</published><updated>2009-10-31T22:53:23.701Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><category scheme='http://www.blogger.com/atom/ns#' term='RBScript'/><title type='text'>RBScript opensource site</title><content type='html'>Back in July, I was wondering aloud how I could help improve RB and whether I should start up and host a testing suite.&lt;br /&gt;&lt;br /&gt;Well I had a few abortive attempts at designing the suite and never really came up with a decent spec.&lt;br /&gt;&lt;br /&gt;I don't have extensive knowledge of the existing bugs, I don't have consistent access to an Intel Mac and I'm not convinced I could do a good job.&lt;br /&gt;&lt;br /&gt;So I was casting around for something I might be able to help with and I came across a few questions about RBScript.&lt;br /&gt;&lt;br /&gt;So I decided to set up an &lt;a href="http://code.google.com/p/rbscriptjottings/"&gt;opensource site&lt;/a&gt; and hope it will make a reasonable contribution to the sum of RBScript knowledge in the RB community.&lt;br /&gt;&lt;br /&gt;The site revolves around a subversion repository. I chose this because I make quite a lot of use of &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; on Windows and &lt;span style="color: rgb(51, 51, 255);"&gt;SVN workbench&lt;/span&gt; on Linux so I'm reasonably comfortable with it.&lt;br /&gt;&lt;br /&gt;I like RBScript and I've used it for a number of personal project, one of which I may tidy up and add to &lt;a href="http://code.google.com/p/rbscriptjottings/"&gt;rbscriptjottings&lt;/a&gt; but the starting point is new harness project.&lt;br /&gt;&lt;br /&gt;This harness will contain a number of RBScript subclasses, some context classes, some RBscript class definitions (some of which should probably be hidden from the RBScript coder) and some sample RBScript code. All this will be organised as mini-projects within the harness program which starts at &lt;a href="http://code.google.com/p/rbscriptjottings/source/browse/trunk#trunk/gui_harness"&gt;harness.rbvcp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So far I've dabbled in RBScript subclasses with extensions to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;print methods&lt;/li&gt;&lt;li&gt;input methods&lt;/li&gt;&lt;li&gt;error-reporting&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I've added contexts which provide&lt;ul&gt;&lt;li&gt;basic ui (multiple msgbox styles, speak, debuglog)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;controlled read/write access to RectControls such as ListBox &amp;amp; ProgressBar&lt;/li&gt;&lt;li&gt;a reasonable emulation of the RB Date class&lt;/li&gt;&lt;/ul&gt;Each context currently has its own demo window. I tend to write major class definitions in the constant editor of the appropriate module.&lt;br /&gt;&lt;br /&gt;The contexts all need more work but they can all be chained together by making them subclasses of each other and therefore provide access to as much current functionality as is required.&lt;br /&gt;&lt;br /&gt;I expect to work on the harness program on and off for quite a while with varying amounts of concentration.&lt;br /&gt;&lt;br /&gt;Hopefully, once I've spent a while on it, there will be something for everyone to learn from the site. I've already found out several things I didn't know about the subject at hand.&lt;br /&gt;&lt;br /&gt;It is my fervent hope that others will come on board at some stage and add to the RB code and/or to a store of scripts.&lt;br /&gt;&lt;br /&gt;The test scripts are in need of lots of rethinking. They tend to be just odd bits of script I used when writing the contexts to make sure they worked. A bit of design effort will need to go into them at some point.&lt;br /&gt;&lt;br /&gt;That's one of the advantages of using version control. It's nice and simple to keep making changes without messing things up.&lt;br /&gt;&lt;br /&gt;A quick look at the &lt;a href="http://code.google.com/p/rbscriptjottings/issues/list"&gt;issues list&lt;/a&gt; will show that I've got a lot of small things planned for the project. I could easily swamp the list with lots more ideas but I need to see how quickly the current work gets done first.&lt;br /&gt;&lt;br /&gt;If anyone has any particular requests or comments, feel free to raise a new issue on the site. Or if you don't have a gmail or google login, leave a comment here.&lt;br /&gt;&lt;br /&gt;And of course if you have any contributions to make, please let me know.&lt;br /&gt;&lt;br /&gt;A couple of comments before I stop writing:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I've used EditFields in the project for backward compatibility and intend to keep them there until Cocoa in RB makes them obsolete.&lt;/li&gt;&lt;li&gt;For those who are just curious, I've put a single file (rbp) version of the project at &lt;a href="http://code.google.com/p/rbscriptjottings/downloads/list"&gt;the downloads page&lt;/a&gt;. It is the same as the version-control version at the time of writing but I make no promises about keeping it up-to-date. The current source is in the repository.&lt;/li&gt;&lt;/ol&gt;And so to bed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-4790971253589314573?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/4790971253589314573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=4790971253589314573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/4790971253589314573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/4790971253589314573'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2009/10/rbscript-opensource-site.html' title='RBScript opensource site'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-5430203944381324780</id><published>2009-10-01T19:47:00.005+01:00</published><updated>2009-10-31T22:53:23.701Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Obfuscating</title><content type='html'>Low-level security is often needed in a compiled app.&lt;br /&gt;Things like hiding a secret string from the casual hacker with a hex-editor.&lt;br /&gt;&lt;br /&gt;When the pro edition of RB of allowed me to use IDEScripts, I had a simple script that changed the currently selected code to a series of &lt;span style="font-weight: bold;font-family:courier new;" &gt;chr()&lt;/span&gt; functions.&lt;br /&gt;&lt;br /&gt;Recently, I found a need for a similar facility but I don't have REAL Studio. So I decided to write the beginnings of a standalone app whose purpose is to allow me to generate useful bits of code to paste into the source I am currently developing.&lt;br /&gt;&lt;br /&gt;Under these circumstances, I was able to do a slightly more thorough job of hiding the string and making it more difficult for future enhancements to the compiler to optimise my code away.&lt;br /&gt;&lt;br /&gt;The general idea is that I give the helper app my password and from it, the code produces a new function with a meaningless name and no reference to the original string.&lt;br /&gt;&lt;br /&gt;In the main app, this function uses a MemoryBlock to convert integers in random sequence to a Base64Encoded string representing the password. The function then returns the Base64Decoded version of the string.&lt;br /&gt;&lt;br /&gt;I've uploaded the source as part of &lt;a href="http://code.google.com/p/rbjottings/source/checkout"&gt;code.google.com/rbjottings&lt;/a&gt; where the whole set of snippets can be downloaded by SVN or you can look at the source for these routines at &lt;a href="http://code.google.com/p/rbjottings/source/browse/trunk/obfuscateTest/Window1.rbfrm"&gt;obfuscateTest Window1&lt;/a&gt; because all the code is contained in that window.&lt;br /&gt;&lt;br /&gt;The methods involved are&lt;blockquote&gt;Function generator _&lt;br /&gt;(inText As String, ByRef functionName As String) As String&lt;/blockquote&gt;&lt;blockquote&gt;Function randomIdentifier _&lt;br /&gt;(minLength As Integer = 6, maxLength As Integer = 10) As String&lt;br /&gt;&lt;/blockquote&gt;which are called using code like&lt;blockquote&gt;  dim fName As String&lt;br /&gt;taCode.Text = generator( tfPlainText.Text, fName )&lt;br /&gt;if chkAddcaller.Value Then&lt;br /&gt; taCode.Text = taCode.Text + EndOfLine + EndOfLine + _&lt;br /&gt; "Sub Caller() " +EndOfLine + _&lt;br /&gt; "  Dim s as String = " + fName + "()" + EndOfLine + _&lt;br /&gt; "End Sub"&lt;br /&gt;end if&lt;/blockquote&gt;where &lt;span style="font-weight: bold;font-family:courier new;" &gt;taCode&lt;/span&gt; is a TextArea and &lt;span style="font-weight: bold;font-family:courier new;" &gt;tfPlainText&lt;/span&gt; is a TextField&lt;br /&gt;&lt;br /&gt;Obviously this simple obfuscation is completely useless where real encryption is required.&lt;br /&gt;&lt;br /&gt;However, where the aim is merely to hide slightly sensitive information from prying eyes, this will force them to work much harder to find the string.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-5430203944381324780?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/5430203944381324780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=5430203944381324780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5430203944381324780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5430203944381324780'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2009/10/obfuscating.html' title='Obfuscating'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-4199291478092015475</id><published>2009-07-26T07:41:00.008+01:00</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>How can I help improve RB?</title><content type='html'>When I was developing large apps for other people to use, one of my recurring nightmares was that old bugs, once fixed, would return in a future version and make me look unprofessional.&lt;br /&gt;&lt;br /&gt;Consequently, one of my most important tools was an ever-growing suite of test scenarios which I ran my app through before issuing a new release. I also asked my beta testers to run these scenarios where practical.&lt;br /&gt;&lt;br /&gt;It seems to me that if my app were a programming language, this sort of suite would be particularly easy to produce.&lt;br /&gt;No doubt RS have an extensive testing suite but they don't make it public for users to test. Also, I sometimes wonder if they share my nightmare.&lt;br /&gt;&lt;br /&gt;I keep wondering about starting an open-source project which would host tests of current and previous bugs. &lt;ul&gt;&lt;li&gt;Have I the time and enthusiasm to produce the original framework?&lt;/li&gt;&lt;li&gt;Do I know enough about the current bugs?&lt;/li&gt;&lt;li&gt;Would someone else be more appropriate as the project owner?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Of course, there was Joe Strout's excellent &lt;a href="http://www.verex.com/opensource/"&gt;ROTOR&lt;/a&gt; which ran several tests that could be automated and which many of us ran on each new beta and release for a while but those tests all seem to pretty much pass these days (except the encoding of external files) and it has fallen out of sight.&lt;br /&gt;&lt;br /&gt;My preference now would be for something that runs unit tests where possible but which also includes tests which required user-involvement.&lt;br /&gt;There would be a project (or projects) with windows describing what the user needed to do and what result was being looked for.&lt;br /&gt;This would allow tests to be run on as many platforms as possible by beta testers, new users and anyone who starts using the latest version.&lt;br /&gt;&lt;br /&gt;Hopefully, if there were user reports quoting problems found by the testing suite, RS would be able to check it out for themselves.&lt;br /&gt;&lt;br /&gt;It seems to me that this would be a more positive step than just producing a list of bugs.&lt;br /&gt;&lt;br /&gt;Perhaps I'll manage to get this started at some point. Or perhaps someone else will come up with the idea and the enthusiasm first and run with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-4199291478092015475?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/4199291478092015475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=4199291478092015475' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/4199291478092015475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/4199291478092015475'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2009/07/how-can-i-help-improve-rb.html' title='How can I help improve RB?'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-5375267362367489304</id><published>2009-02-08T20:51:00.005Z</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Editfields that update each other</title><content type='html'>I've been creating a number of EditFields lately where the &lt;span style="font-weight: bold;"&gt;TextChange&lt;/span&gt; event of each updates all the others.&lt;br /&gt;&lt;br /&gt;I pretty soon got fed up with wrapping every bit of update code in "&lt;span style="font-weight: bold;"&gt;alreadyUpdating&lt;/span&gt;" flags, so I decided to create a simple EditField subclass with a &lt;span style="font-weight: bold;"&gt;Changed&lt;/span&gt; event that only fires if the EditField has the focus.&lt;br /&gt;&lt;br /&gt;As I thought this might be useful for others, I've put a sample project on &lt;a href="http://www.garman.demon.co.uk/rb/bases.rbp"&gt;my website&lt;/a&gt;. it uses the subclass to allow entry of hex, binary or decimal numbers, while the two other fields are updated.&lt;br /&gt;&lt;br /&gt;I've also added the source to the SVN repository at &lt;a href="http://code.google.com/p/rbjottings/source/browse/trunk/bases"&gt;Google Code.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-5375267362367489304?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/5375267362367489304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=5375267362367489304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5375267362367489304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5375267362367489304'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2009/02/editfields-that-update-each-other.html' title='Editfields that update each other'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-3447010460638642608</id><published>2009-01-31T22:54:00.001Z</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Open Source projects on Google Code</title><content type='html'>I went through a patch when I tried to answer quite a number of questions on the &lt;a href="http://forums.realsoftware.com/"&gt;forums&lt;/a&gt; and one or two on the &lt;a href="http://support.realsoftware.com/listarchives/realbasic-nug/"&gt;NUG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Whenever I post code, I always try to test that it at least compiles.&lt;br /&gt;&lt;br /&gt;Many of the test projects I used ended up on a website that is alas no more.&lt;br /&gt;&lt;br /&gt;I am now in the process of moving some of those snippets to &lt;a href="http://code.google.com/p/rbjottings/source/checkout"&gt;an opensource project on Google Code&lt;/a&gt; so that they don't just go missing.&lt;br /&gt;&lt;br /&gt;There's nothing very startling and much of it is incomplete but some of it may prove of use to someone eventually.&lt;br /&gt;&lt;br /&gt;The first class I ever wrote in RB was an attempt at a faster string. You can see it converted to Vesrion Control Format at &lt;a href="http://code.google.com/p/rbjottings/source/browse/trunk#trunk/sjgText"&gt;Google Code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-3447010460638642608?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/3447010460638642608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=3447010460638642608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3447010460638642608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3447010460638642608'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2009/01/open-source-projects-on-google-code.html' title='Open Source projects on Google Code'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-2891269665657345948</id><published>2008-05-08T06:25:00.004+01:00</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Telling the truth</title><content type='html'>We all know that REAL Software can't be bothered to document REALbasic properly, so it comes as no surprise that I can find no reference in the docs to the pairs class, the only new feature RS is advertising for 2008r2.&lt;br /&gt;&lt;br /&gt;Of course, Aaron has stepped in and documented this on his &lt;a href="http://ramblings.aaronballman.com/2008/05/pairs.html"&gt;blog&lt;/a&gt; so it's no great hardship for me personally, as I check his blog most days.&lt;br /&gt;&lt;br /&gt;What does come as a bit more of a surprise is that, even now, the &lt;a href="http://www.realsoftware.com/products/realbasic/deployment.php"&gt;RS website&lt;/a&gt; is claiming &lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Windows:&lt;/span&gt; Unlike most other Windows development tools, REALbasic generates self-contained executables which are not dependent on external dlls or pre-installed frameworks. The single .exe file produced by the REALbasic compiler is all you need to distribute to you customers.&lt;/blockquote&gt;This has been mentioned on the forums, I've PM'd members of RS staff about it hours ago, I've cleared every browser cache in sight and connected via different ISPs. It's still there.&lt;br /&gt;&lt;br /&gt;Does the U.S.A. have no laws about false advertising? In a litigious society like the U.S. are people actually putting up with this sort of thing?&lt;br /&gt;&lt;br /&gt;The single executable is a central claim about the way that RB can be deployed and should have been removed from the website as soon as RS realised they might be going to change it.&lt;br /&gt;&lt;br /&gt;Of course there will be changes to how RB works over time but anyone who has bought or renewed RB recently could be forgiven for feeling they have been badly misled.&lt;br /&gt;&lt;br /&gt;It's a real shame because 2008r2 seems to be a really nice release. Why doe RB's documentation and advertising so often end up wrecking the positive feel we would otherwise get?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-2891269665657345948?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/2891269665657345948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=2891269665657345948' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/2891269665657345948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/2891269665657345948'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/05/telling-truth.html' title='Telling the truth'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-7642391917779272067</id><published>2008-04-22T07:32:00.004+01:00</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Feedback changes</title><content type='html'>I probably should not write this first paragraph publicly. The beta list has been awash lately with phrases like, "I really like this new spirit of openness," "thanks for keeping us informed" and even "thanks for listening, the changes are much better than your original proposal."&lt;br /&gt;&lt;br /&gt;And then comes the announcement that the current feedback system is being replaced and will no longer be searchable. We can no longer see other people's reports.&lt;br /&gt;&lt;br /&gt;Within seconds, I hit the bookmark to my watchlist, so I could pdf my outstanding reports.&lt;br /&gt;But they had already gone.&lt;br /&gt;&lt;br /&gt;That's what really irritates me. The sudden withdrawal of the data I keep around to remind me of workarounds to bugs I or others have already found.&lt;br /&gt;&lt;br /&gt;If RS need a better project management system, it hardly comes as a surprise.&lt;br /&gt;&lt;br /&gt;If they want to use its built-in bug-tracking, I hope and expect it will work better for them.&lt;br /&gt;&lt;br /&gt;If they have decided to use a hosted system rather than host their own copy, who am I to argue.&lt;br /&gt;&lt;br /&gt;And if they don't want to waste resources creating non-standard versions of FogBugz, nobody will suggest they look like a company with engineers to spare.&lt;br /&gt;&lt;br /&gt;Other people complain that thousands of customers are being asked to waste their time to save a bit of centralized time at RS. This may be true but it may well be worthwhile.&lt;br /&gt;&lt;br /&gt;It's the lack of notice that leads to the conspiracy theories.&lt;br /&gt;&lt;br /&gt;What could be a possible motive for withdrawing the old data?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RS don't want the world at large to be able to see how many bugs they have?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;What could be a possible motive for giving no notice?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To make it more difficult for some third-party to compile a website (wiki?) listing outstanding bugs?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It may well be that neither of these is the case.&lt;br /&gt;&lt;br /&gt;It may well be that RS's normal policy of secrecy has engendered an attitude where, when considering a change, nobody even thinks to ask until the last minute, "How should we communicate with our customers to cause least upset?"&lt;br /&gt;&lt;br /&gt;Personally, I really hope FogBugz works well for RS and I'll live with whatever decisions they make about customer access.&lt;br /&gt;&lt;br /&gt;If I find a bug that doesn't affect me personally, it's quite likely I will assume somebody else has reported it.&lt;br /&gt;&lt;br /&gt;If somebody else posts a bug to a mailing list or forum that does affect me, it's quite likely I will assume they may not have reported it and will paste a copy of it (altered as required to fit my personal prejudices) straight into the feedback system.&lt;br /&gt;&lt;br /&gt;I'm sure somebody else will provide hosting for a public bug-list out of RS's control.&lt;br /&gt;If so, I will do my best to contribute.&lt;br /&gt;&lt;br /&gt;And just for the record, my business doesn't rely on RB at all.&lt;br /&gt;&lt;br /&gt;So if I see RS getting heavy-handed with anyone that tries to maintain a public bug-list, I will just decide that RS is not a company with whom I need a business relationship any more.&lt;br /&gt;&lt;br /&gt;It's a real shame I am even beginning to feel that way. My goodwill towards RS has been sky-high lately because stuff seemed to be moving in the right direction.&lt;br /&gt;&lt;br /&gt;If I had had a few days notice that my watchlist was going to disappear, I would be slightly irritated  but would now be posting "give it a while to see how it works" messages in reply to the current storm of complaints.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-7642391917779272067?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/7642391917779272067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=7642391917779272067' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/7642391917779272067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/7642391917779272067'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/04/feedback-changes.html' title='Feedback changes'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-6757563496693620702</id><published>2008-04-02T17:09:00.002+01:00</published><updated>2009-10-31T22:53:54.362Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yuma'/><title type='text'>Yuma</title><content type='html'>I've been playing with &lt;a href="http://www.yumadev.com/"&gt;Yuma&lt;/a&gt; and it's great fun.&lt;br /&gt;&lt;br /&gt;I've got a lot of learning to do but I thought I'd mention one or two bits I've found useful.&lt;br /&gt;&lt;br /&gt;I have an include file called &lt;a href="http://rb.sgarman.net/yuma/myGlobals.yuma"&gt;myGlobals.yuma&lt;/a&gt; which includes methods&lt;blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sub MsgBox(s As String)&lt;br /&gt;Function MsgBox(s As String, buttons as Integer) As Integer&lt;br /&gt;Function MsgBox(s As String, buttons as Integer, Title As String) As Integer&lt;br /&gt;Sub printLine(s As String)&lt;br /&gt;Sub printParagraph(s As String)&lt;br /&gt;Function lineBreak() As String&lt;br /&gt;Const TargetYuma = True&lt;br /&gt;&lt;/blockquote&gt;The msgBoxes are just to stop test code falling over when I compile for RB and Yuma.&lt;br /&gt;&lt;br /&gt;The other methods are for simpler formatting within Yuma and try to make the source a bit more readable when adding breaks or paragraphs to the output.&lt;br /&gt;&lt;br /&gt;TargetYuma helps with conditional compilation.&lt;br /&gt;&lt;br /&gt;In my RB code, I use a similar module which stops the RB code from falling over by having methods&lt;blockquote&gt;Sub print&lt;br /&gt;Sub PrintLine(s As String)&lt;br /&gt;Sub printParagraph(s As String)&lt;br /&gt;Function lineBreak() As String&lt;br /&gt;Const TargetYuma = False&lt;/blockquote&gt;I save the project in VCF format, so picking classes and modules and converting them to Yuma then becomes a breeze.&lt;br /&gt;&lt;br /&gt;Some of the very simple stuff I've tried so far is available for download from &lt;a href="http://rb.sgarman.net/yuma/"&gt;my website&lt;/a&gt; but please be aware that site is not running Yuma. The .yuma files need to be downloaded and tested on your own yuma development server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-6757563496693620702?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/6757563496693620702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=6757563496693620702' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6757563496693620702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6757563496693620702'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/04/yuma.html' title='Yuma'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-5367819574300467973</id><published>2008-03-23T07:10:00.005Z</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Self and Me</title><content type='html'>A question that comes up a lot in REALbasic is &lt;blockquote&gt;What is the difference between the &lt;span style="font-weight: bold;"&gt;Self&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt; keywords?&lt;/blockquote&gt;Everybody eventually thinks they have it sorted out in their own minds but it's surprising how many of us then find we're wrong.&lt;br /&gt;&lt;br /&gt;I think that essentially it goes something like this:&lt;br /&gt;&lt;blockquote&gt;Self and Me always refer to the same thing, except in the specific instance where you are editing the method handlers of a class in a Window. In those circumstances, &lt;span style="font-weight: bold;"&gt;Self&lt;/span&gt; refers to the item you're editing (the window) and &lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt; refers to the class instance which exposes the method.&lt;/blockquote&gt;The best advice I ever received on this was (I think) from Mars.&lt;br /&gt;&lt;br /&gt;If you want to know what Self refers to, while you're coding, look up at the top of the IDE.&lt;br /&gt;&lt;br /&gt;If the title bar says &lt;blockquote&gt;Realbasic - [Untitled] - Class1&lt;br /&gt;&lt;/blockquote&gt;then &lt;span style="font-weight: bold;"&gt;Self&lt;/span&gt; refers to &lt;span style="font-weight: bold;"&gt;Class1&lt;/span&gt;. On the other hand, if the title bar says &lt;blockquote&gt;Realbasic - [Untitled] - Window1&lt;br /&gt;&lt;/blockquote&gt;then &lt;span style="font-weight: bold;"&gt;Self&lt;/span&gt; refers to &lt;span style="font-weight: bold;"&gt;Window1&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-5367819574300467973?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/5367819574300467973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=5367819574300467973' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5367819574300467973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5367819574300467973'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/03/self-and-me.html' title='Self and Me'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-2715477020973930024</id><published>2008-03-16T07:45:00.008Z</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Threads - Cooperative and Preemptive</title><content type='html'>Lots of developers talk about multiple processors in the same dubious&lt;br /&gt;way they've always spoken of bigger screens and higher screen resolutions. &lt;blockquote&gt;If the user happens to have more, how can I fill it up?&lt;/blockquote&gt;All those resources aren't there so the computer can always run one app more greedily. In general, they're about allowing a richer multi-tasking experience.&lt;br /&gt;&lt;br /&gt;I admit that a few apps will benefit from more processing power than one processor can provide but it's not a good idea to rely on high-end CPUs for most programs in any language.&lt;br /&gt;&lt;br /&gt;REALbasic "threads" are not preemptive thread such as programmers coming from other environments might expect, they are cooperative threads which some people are surprised to learn are still exposed by the various operating systems.&lt;br /&gt;&lt;br /&gt;We'll ignore the argument that what Microsoft call "&lt;span style="font-weight: bold;"&gt;fibres&lt;/span&gt;" (I can't bring myself to use MS spelling) might not really be entitled to the name "&lt;span style="font-weight: bold;"&gt;thread&lt;/span&gt;" on Windows any more.&lt;br /&gt;&lt;br /&gt;There are ways (MBS is one but not the only) of attempting to use preemptive threads with RB but RS engineers assure us there is no safe way to use the framework with preemptive threads that does not effectively cripple them back to cooperative.&lt;br /&gt;&lt;br /&gt;I don't try to use preemptive threads in RB because I believe it may eventually give crashes or (possibly worse) unpredictable results.&lt;br /&gt;(This is a very slightly stronger statement than I make about using App.DoEvents in a gui app. I might try that in one particular set of circumstances.)&lt;br /&gt;&lt;br /&gt;Sometimes to get around the lack of preemptive threads and still keep the gui responsive, I have to split long external reads up into shorter chunks. This can sometimes be a pain, especially with databases.&lt;br /&gt;&lt;br /&gt;Sometimes I have to split out lengthy tasks into a helper app. If that is also a RB app, it significantly increases the size of my app's footprint on the disk.&lt;br /&gt;&lt;br /&gt;I'd love to see preemptive threads in RB but my guess is&lt;br /&gt;&lt;ol&gt;&lt;li&gt;we won't see them for a &lt;span style="font-weight: bold;"&gt;long&lt;/span&gt; time&lt;/li&gt;&lt;li&gt;they'll take an even longer time to settle down when they do arrive&lt;/li&gt;&lt;li&gt;they won't really make much difference to me&lt;/li&gt;&lt;/ol&gt; And of course there are many fixes and lots of new features (and their fixes) I'd like to see first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-2715477020973930024?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/2715477020973930024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=2715477020973930024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/2715477020973930024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/2715477020973930024'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/03/threads-cooperative-and-preemptive.html' title='Threads - Cooperative and Preemptive'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-3016116943026620190</id><published>2008-03-14T16:42:00.004Z</published><updated>2009-10-31T22:53:23.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Personal Messages on the Forums</title><content type='html'>I've been trying to be helpful on &lt;a href="http://forums.realsoftware.com/"&gt;the forums&lt;/a&gt; for a while now and in general people seem to appreciate most of my efforts.&lt;br /&gt;&lt;br /&gt;One thing that does happen quite a lot is that I post a reply to a query, then the &lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;riginal &lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;oster (or someone else) wants to start a follow-up discussion by &lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;ersonal &lt;span style="font-weight: bold;"&gt;m&lt;/span&gt;essage.&lt;br /&gt;&lt;br /&gt;Usually I respond to this by giving a general reply to any follow-up questions, followed by a note something like&lt;blockquote&gt;I prefer not to give too much advice by PM. If I'm going to try to be helpful, I like as many people as possible to benefit from it.&lt;br /&gt;&lt;br /&gt;If you have any further questions, it works better if you ask them publicly and I (or someone else) respond on the forums.&lt;br /&gt;&lt;/blockquote&gt;Most people take the hint. Some apologise (for which there is no need at all) and some never speak to me again (or that's the way it seems to me)&lt;br /&gt;&lt;br /&gt;Some people, however, just ignore the note and ask the next question in another &lt;span style="font-weight: bold;"&gt;PM&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I may give them the benefit of the doubt once and assume that our messages crossed, while the poster was composing his question.&lt;br /&gt;&lt;br /&gt;I may reopen the correspondence myself by suddenly remembering something else I didn't put in my original reply. Then it's only reasonable to accept a couple more PMs before giving up.&lt;br /&gt;&lt;br /&gt;To a subsequent question, if I'm feeling reasonably polite, I may reply &lt;blockquote&gt;We really should discuss this publicly in the forum.&lt;/blockquote&gt;But after that, I really can't think of anything polite to write, except to tell them exactly what I charge for consultancy. I normally express this in USD per hour, even though my charges are nearly always in GBP.&lt;br /&gt;&lt;br /&gt;Strangely enough, that usually ends the conversation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-3016116943026620190?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/3016116943026620190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=3016116943026620190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3016116943026620190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3016116943026620190'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/03/personal-messages-on-forums.html' title='Personal Messages on the Forums'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-3685922191460984488</id><published>2008-03-13T21:39:00.003Z</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Names for colours</title><content type='html'>I needed to display names for lots of colours the other day and ended up with an &lt;span style="font-weight: bold;"&gt;Extends&lt;/span&gt; function to return &lt;span style="font-weight: bold;"&gt;x11&lt;/span&gt; names.&lt;br /&gt;&lt;br /&gt;It occurred to me it might be useful to someone else.&lt;br /&gt;&lt;br /&gt;To use it, just create it as a method in a module. It &lt;span style="font-style: italic;"&gt;does&lt;/span&gt; have to be in a module.&lt;br /&gt;&lt;br /&gt;Then you can use it like this&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; c &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Color&lt;/span&gt; = &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;5C&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;5C&lt;/span&gt;&lt;br /&gt;MsgBox c.x11name&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;There is a demo project at &lt;a href="http://rb.sgarman.net/x11colours.rbp"&gt;http://rb.sgarman.net/x11colours.rbp&lt;/a&gt; which is just a small test harness I threw together for this function and its reverse.&lt;br /&gt;&lt;br /&gt;Anyway, here's the method&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;br /&gt;Function&lt;/span&gt; X11name(&lt;span style="color: rgb(0, 0, 255);"&gt;Extends&lt;/span&gt; c &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Color&lt;/span&gt;, allowBlanks &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Boolean&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Static&lt;/span&gt; Dict &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; Dictionary&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; dict &lt;span style="color: rgb(0, 0, 255);"&gt;is&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;nil&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;dict = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Dictionary&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Black"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Navy"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Blue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;64&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Green"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Teal"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkCyan"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;BF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DeepSkyBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D1&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkTurquoise"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;9A&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumSpringGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Lime"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;7F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SpringGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Aqua"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Cyan"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;19&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;19&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;70&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MidnightBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;1E&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;90&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DodgerBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;20&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSeaGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;22&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;22&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"ForestGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;2E&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;57&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SeaGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;2F&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;4F&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;4F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkSlateGray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;32&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;32&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LimeGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;3C&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;71&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumSeaGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;40&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Turquoise"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;41&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;69&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E1&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"RoyalBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;46&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;82&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;B4&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SteelBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;48&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;3D&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkSlateBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;48&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;D1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CC&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumTurquoise"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;4B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;82&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Indigo"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;55&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;6B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkOliveGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;5F&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;9E&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;A0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"CadetBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;64&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;95&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ED&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"CornflowerBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;66&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumAquamarine"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;69&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;69&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;69&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DimGray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;6A&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;5A&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SlateBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;6B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8E&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;23&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"OliveDrab"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;90&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SlateGray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;77&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;88&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;99&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSlateGray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;7B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;68&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EE&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumSlateBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;7C&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FC&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LawnGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;7F&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Chartreuse"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;7F&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D4&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Aquamarine"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Maroon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Purple"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Olive"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Gray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;87&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EB&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SkyBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;87&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSkyBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;8A&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;2B&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E2&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"BlueViolet"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkRed"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkMagenta"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;8B&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;45&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;13&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SaddleBrown"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;8F&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;BC&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkSeaGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;90&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;EE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;90&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;93&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DB&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumPurple"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;94&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D3&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkViolet"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;98&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FB&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;98&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PaleGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;99&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;32&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CC&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkOrchid"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;9A&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;32&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"YellowGreen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;A0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;52&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2D&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Sienna"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;A5&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;2A&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2A&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Brown"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;A9&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A9&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;A9&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkGray"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;AD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;D8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E6&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;AD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;2F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"GreenYellow"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;AF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;EE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EE&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PaleTurquoise"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;B0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;C4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DE&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSteelBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;B0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E6&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PowderBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;B2&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;22&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;22&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"FireBrick"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;B8&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;86&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkGoldenrod"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;BA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;55&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D3&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumOrchid"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;BC&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8F&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"RosyBrown"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;BD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B7&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;6B&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkKhaki"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;C0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;C0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;C0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Silver"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;C7&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;15&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;85&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MediumVioletRed"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;5C&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;5C&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"IndianRed"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;CD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;85&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;3F&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Peru"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;D2&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;69&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1E&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Chocolate"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;D2&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8C&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Tan"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;D3&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;D3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D3&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightGrey"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;D8&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;BF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D8&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Thistle"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D6&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Orchid"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;20&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Goldenrod"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DB&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;93&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PaleVioletRed"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DC&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;14&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;3C&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Crimson"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DC&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;DC&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DC&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Gainsboro"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Plum"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;DE&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;87&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"BurlyWood"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;E0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightCyan"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;E6&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E6&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Lavender"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;E9&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;96&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;7A&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkSalmon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;EE&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;82&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EE&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Violet"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;EE&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PaleGoldenrod"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightCoral"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E6&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;8C&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Khaki"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"AliceBlue"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;F0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Honeydew"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Azure"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F4&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;60&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"SandyBrown"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;DE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;B3&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Wheat"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DC&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Beige"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;F5&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"WhiteSmoke"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MintCream"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;F8&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"GhostWhite"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;72&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Salmon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;EB&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D7&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"AntiqueWhite"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E6&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Linen"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D2&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightGoldenrodYellow"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FD&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E6&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"OldLace"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Red"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Magenta"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Fuchsia"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;14&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;93&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DeepPink"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;45&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"OrangeRed"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;63&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;47&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Tomato"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;69&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;B4&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"HotPink"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;7F&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;50&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Coral"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;8C&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"DarkOrange"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;7A&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSalmon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;7A&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightSalmon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;A5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Orange"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;B6&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;C1&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightPink"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;C0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CB&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Pink"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;D7&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Gold"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;DA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;B9&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PeachPuff"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;DE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;AD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"NavajoWhite"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;B5&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Moccasin"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;C4&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Bisque"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;E4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E1&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"MistyRose"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;EB&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"BlanchedAlmond"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;EF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;D5&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"PapayaWhip"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;F5&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LavenderBlush"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F5&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EE&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Seashell"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;F8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;DC&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Cornsilk"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;CD&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LemonChiffon"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;F0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"FloralWhite"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FA&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FA&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Snow"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;00&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Yellow"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;E0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"LightYellow"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;F0&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"Ivory"&lt;/span&gt;&lt;br /&gt;Dict.Value( &amp;amp;c&lt;span style="color: rgb(255, 0, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 187, 0);"&gt;FF&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;FF&lt;/span&gt; ) = &lt;span style="color: rgb(102, 0, 254);"&gt;"White"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; retval &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;&lt;br /&gt;retval = dict.Lookup( c, &lt;span style="color: rgb(102, 0, 254);"&gt;""&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; retval = &lt;span style="color: rgb(102, 0, 254);"&gt;""&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;and&lt;/span&gt; allowBlanks = &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; v &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Variant&lt;/span&gt;&lt;br /&gt;v = c&lt;br /&gt;retval = mid( v.StringValue, &lt;span style="color: rgb(51, 102, 152);"&gt;3&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; retval&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-3685922191460984488?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/3685922191460984488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=3685922191460984488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3685922191460984488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3685922191460984488'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/03/names-for-colours.html' title='Names for colours'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-3347939302706743832</id><published>2008-02-23T20:16:00.004Z</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>How do I feel about RB?</title><content type='html'>I'm really confused about how I feel about REALbasic.&lt;br /&gt;&lt;br /&gt;I like the engineers. Aaron, Mars, Mike and William are my friends. This is in much the same way that the soap stars are my cousin's friends.&lt;br /&gt;&lt;br /&gt;I like the build engineer, Nathan. And who could fail to like Marco.&lt;br /&gt;&lt;br /&gt;But I don't like the company much. Its public utterances, though mostly truthful, are often misleading and the company is far too secretive for my liking. I do not mean the utterances by &lt;span style="font-style:italic;"&gt;my friends&lt;/span&gt; (see above) are misleading.&lt;br /&gt;&lt;br /&gt;I like what REALbasic wants to be. I quite like a lot of what it is. But it is the most buggy development environment with which I work by a &lt;span style="font-weight:bold;"&gt;long&lt;/span&gt; way.&lt;br /&gt;&lt;br /&gt;It has far too many features which have been included to add to the feature list and have never worked properly or have been left in an unreasonably basic state. Far too many bugs are fixed (or half fixed) and then come back later without anyone seeming to notice. &lt;br /&gt;If your testing doesn't pick up recurrences of old bugs, what &lt;span style="font-weight:bold;"&gt;can&lt;/span&gt; you hope it will pick up?&lt;br /&gt;&lt;br /&gt;Now because criticism of the product implies criticism of my friends, I become very defensive when the number one whiner starts again.&lt;br /&gt;&lt;br /&gt;But then people tell him he should cut RS some slack because my friends are the only engineers. And then I get really irritable because the company refused to tell me how many engineers there are, even when I offered to sign a non-disclosure agreement and so my best customer won't let me write any of his stuff in RB.&lt;br /&gt;&lt;br /&gt;So I join in with the whining. Then I feel guilty because I'm criticising the product that should be so wonderful because it has the right aspirations and is pretty good just as it is now.&lt;br /&gt;&lt;br /&gt;So for now I just keep swapping sides and therefore disagreeing with nearly every post I see about the quality, usefulness and future of REALbasic&lt;br /&gt;&lt;br /&gt;But for all that, most of the programming I do for myself or for fun I do in REALbasic and will continue to do so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-3347939302706743832?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/3347939302706743832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=3347939302706743832' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3347939302706743832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/3347939302706743832'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/02/how-do-i-feel-about-rb.html' title='How do I feel about RB?'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-5667387554564258992</id><published>2008-01-15T17:00:00.000Z</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Another new feature</title><content type='html'>So, rb2008 will introduce introspection.&lt;br /&gt;&lt;br /&gt;Geoff claims it's for the customers' benefit and there will be much screaming from the gallery that RS should be spending their time fixing bugs instead of adding features.&lt;br /&gt;&lt;br /&gt;Of course they're concentrating mostly on bug-fixes but some people believe the new features are marketing-led.&lt;br /&gt;&lt;br /&gt;What I ask myself is this. Are they spending time adding the features they feel they need to enable them to fix the bugs?&lt;br /&gt;&lt;br /&gt;They've been eating their own dogfood for a while now and may be realising there's stuff it ain't so easy to do in RB and they need a few more features to do some of the things they need to do next.&lt;br /&gt;&lt;br /&gt;Remember, writing a toolset exposes you to the unpredictable foibles of other developers, just about as badly as anything I can think of.&lt;br /&gt;&lt;br /&gt;If you were building a toolset, might you not find you'd give your eye teeth for features like:&lt;ul&gt;&lt;li&gt;Introspection&lt;br /&gt;&lt;li&gt;Delegates&lt;br /&gt;&lt;li&gt;Control scope&lt;br /&gt;&lt;li&gt;destination directory and command line arguments for debug applications&lt;br /&gt;&lt;li&gt;plugin debuggin'&lt;br /&gt;&lt;li&gt;turning off implicit instantiation&lt;br /&gt;&lt;li&gt;namespaces&lt;/ul&gt;Is it just me, or are their stomachs just revolting against the lack of meat in the dogfood?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-5667387554564258992?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/5667387554564258992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=5667387554564258992' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5667387554564258992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/5667387554564258992'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2008/01/another-new-feature.html' title='Another new feature'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-6584140023020603014</id><published>2007-11-25T08:10:00.000Z</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Getting even grumpier as I age</title><content type='html'>Sometimes I just want to scream, "Don't you know it's a programming language? Write some code!"&lt;br /&gt;&lt;br /&gt;It's usually on the forums but today's example happened to be in the NUG&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;blockquote&gt;I think it's incredible that the HTMLViewer&lt;br /&gt;does not have two extremely basic functions: Back() and Forward() -&lt;br /&gt;how can we be without those?&lt;/blockquote&gt;I suppose I should have done my usual helpful point to &lt;a href="http://rb.sgarman.net/browser/"&gt;the history class at my website&lt;/a&gt;, (written in 2005r1, I think) but it's the assumptions behind the question that get to me.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-6584140023020603014?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/6584140023020603014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=6584140023020603014' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6584140023020603014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6584140023020603014'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2007/11/getting-even-grumpier-as-i-age.html' title='Getting even grumpier as I age'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-7112165323315122659</id><published>2007-11-21T14:20:00.000Z</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>Creating a simple canvas subclass</title><content type='html'>So I created a simple subclass to answer a question on &lt;a href="http://forums.realsoftware.com/viewtopic.php?p=96738#96738"&gt;the RB Forum&lt;/a&gt; and made the mistake of saying I would write a simple description of how I did it.&lt;br /&gt;&lt;br /&gt;Some of the detail of these instructions is influenced by the fact that I created it in the Windows IDE.&lt;br /&gt;&lt;br /&gt;The sample project is &lt;a href="http://rb.sgarman.net/sjgTextBox.rbp"&gt;on my website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-weight: bold;"&gt;Project&lt;/span&gt; tab of a new project, I created a new class and set its &lt;span style="font-weight: bold;"&gt;Name&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;sjgTextBox&lt;/span&gt; and its &lt;span style="font-weight: bold;"&gt;Super&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;Canvas&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I double-clicked the new &lt;span style="font-weight: bold;"&gt;sjgTextBox&lt;/span&gt; class and in the tab that opened, I created a few properties to store the text details and the mouseDown position.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; BorderColour&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;TextColour&lt;/span&gt; are public Color properties with default values.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; When setting &lt;span style="font-weight: bold;"&gt;Text&lt;/span&gt;, I need to change the width of the control appropriately, so I created a computed property.&lt;/li&gt;&lt;li&gt;Private properties &lt;span style="font-weight: bold;"&gt;mDownX&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;mDownY&lt;/span&gt; as Integer will come in handy for remembering where the mouseDown occurred, when dragging.&lt;/li&gt;&lt;/ul&gt;In the &lt;span style="font-weight: bold;"&gt;set&lt;/span&gt;ter for &lt;span style="font-weight: bold;"&gt;Text&lt;/span&gt;, I added code to resize the control based on the string width plus blank space the size of "W" at each end.&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-weight: bold; font-style: italic;"&gt;Paint&lt;/span&gt; event, I added code to draw a border around the control and the text property inside it.&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-style: italic; font-weight: bold;"&gt;mouseDown&lt;/span&gt; event, I added code to record the position of the mouse on the parent window.&lt;br /&gt;&lt;br /&gt;In the &lt;span style="font-style: italic; font-weight: bold;"&gt;mouseDrag&lt;/span&gt; event, I check whether the control is already positioned according to the mouse and, if not, I move it to the correct position on the parent window.&lt;br /&gt;&lt;br /&gt;Going back to the &lt;span style="font-weight: bold;"&gt;Project tab&lt;/span&gt;, I right-clicked the &lt;span style="font-weight: bold;"&gt;sjgTextBox&lt;/span&gt; class and selected "Property List Behavior...", where I checked the three public properties I had created, so they would appear in the control's property-list.&lt;br /&gt;&lt;br /&gt;The control was now complete, so the next job was to add some to a window.&lt;br /&gt;&lt;br /&gt;I opened the window's code view and in the popupmenu above the control palette on the left, I selected "&lt;span style="font-style: italic;"&gt;Project controls&lt;/span&gt;" and dragged 3 &lt;span style="font-weight: bold;"&gt;sjgTextBox&lt;/span&gt;es onto the Window.&lt;br /&gt;For each I set its Text property and the two Colour properties.&lt;br /&gt;&lt;br /&gt;Compile and test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-7112165323315122659?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/7112165323315122659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=7112165323315122659' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/7112165323315122659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/7112165323315122659'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2007/11/creating-simple-canvas-subclass.html' title='Creating a simple canvas subclass'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-6587415020451160468</id><published>2007-06-18T08:19:00.000+01:00</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>ValidDate function</title><content type='html'>&lt;p&gt;This is just a test posting to see how awful large chunks of code will look on the blog.&lt;/p&gt;&lt;p&gt;The code for the  drop-in replacement for REALbasic's ParseDate can be found on my &lt;a href="http://rb.sgarman.net/validDate.php"&gt;website&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;Thanks to Norman Palardy, Joe Strout, Dennis Birch and Maximilian Tyrtania for their help and advice with this function on the NUG&lt;br /&gt;&lt;hr /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; validDate(text &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;ByRef&lt;/span&gt; value &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Date, assumePastFuture &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; integer= &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Boolean&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// If the year provided has only one or 2 digits, check assumePastFuture&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// negative value means the past, positive means future, 0 means current century&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// If no year is supplied, assumePastFuture has a granularity of 1 year&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Static&lt;/span&gt; yearPos &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt; = -&lt;span style="color: rgb(51, 102, 152);"&gt;9&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Static&lt;/span&gt; monthPos &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt; = -&lt;span style="color: rgb(51, 102, 152);"&gt;9&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Static&lt;/span&gt; dayPos &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt; = -&lt;span style="color: rgb(51, 102, 152);"&gt;9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; yearPos = -&lt;span style="color: rgb(51, 102, 152);"&gt;9&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;// first time through&lt;/span&gt;&lt;br /&gt;yearPos = -&lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;// only try this once&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// try to work out local date format&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// assume Gregorian calendar&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// assume shortDate contains all 3 numbers&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// don't use NthField or Split in case it contains other characters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; d &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; date&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// clear any time numbers, in case of unusual shortDate format&lt;/span&gt;&lt;br /&gt;d.TotalSeconds = &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// set unique values for year, month &amp; date&lt;/span&gt;&lt;br /&gt;d.SQLDate = &lt;span style="color: rgb(102, 0, 254);"&gt;"2005-12-31"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; s &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt; = d.ShortDate&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; pos() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;integer&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; thisPos  &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;thisPos = InStr( &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;, s, &lt;span style="color: rgb(102, 0, 254);"&gt;"05"&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; thisPos &amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt; pos.Append thisPos&lt;br /&gt;thisPos = InStr( &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;, s, &lt;span style="color: rgb(102, 0, 254);"&gt;"12"&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; thisPos &amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt; pos.Append thisPos&lt;br /&gt;thisPos = InStr( &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;, s, &lt;span style="color: rgb(102, 0, 254);"&gt;"31"&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; thisPos &amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt; pos.Append thisPos&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; UBound( pos ) = &lt;span style="color: rgb(51, 102, 152);"&gt;2&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// we've found all three elements&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// sort them by position in shortDate&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; typ() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 255);"&gt;Array&lt;/span&gt;( &lt;span style="color: rgb(102, 0, 254);"&gt;"y"&lt;/span&gt;, &lt;span style="color: rgb(102, 0, 254);"&gt;"m"&lt;/span&gt;, &lt;span style="color: rgb(102, 0, 254);"&gt;"d"&lt;/span&gt; )&lt;br /&gt;pos.SortWith typ&lt;br /&gt;yearPos = typ.IndexOf( &lt;span style="color: rgb(102, 0, 254);"&gt;"y"&lt;/span&gt; )&lt;br /&gt;monthPos = typ.IndexOf( &lt;span style="color: rgb(102, 0, 254);"&gt;"m"&lt;/span&gt; )&lt;br /&gt;dayPos = typ.IndexOf( &lt;span style="color: rgb(102, 0, 254);"&gt;"d"&lt;/span&gt; )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; yearPos &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; monthPos &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; dayPos &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// we don't know how to parse the date&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// some might want to set defaults instead of returning false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// now check the date has just numbers and two delimiters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; sep &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; tmp &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; i &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; noYearSupplied &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Boolean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;tmp = text&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// first figure out what separator they gave us .. have to both be the same one&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;for&lt;/span&gt; i = &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;to&lt;/span&gt; &lt;span style="color: rgb(51, 102, 152);"&gt;9&lt;/span&gt;&lt;br /&gt;tmp = replaceAll(tmp,format(i,&lt;span style="color: rgb(102, 0, 254);"&gt;"0"&lt;/span&gt;),&lt;span style="color: rgb(102, 0, 254);"&gt;""&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;next&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;select&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; len(tmp)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// unable to understand the format entered&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;&lt;br /&gt;sep = tmp&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;case&lt;/span&gt; &lt;span style="color: rgb(51, 102, 152);"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sep = mid(tmp,&lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;,&lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; sep &amp;lt;&amp;gt; mid(tmp,&lt;span style="color: rgb(51, 102, 152);"&gt;2&lt;/span&gt;,&lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;) &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// invalid - two different separators&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;select&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;//make array of elements&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; dats() &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt; = Split( text, sep )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; UBound( dats ) &amp;lt;&amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;2&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// add in the missing year ?&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; tmpDate &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; date&lt;br /&gt;dats.Insert  yearPos, format(tmpDate.year,&lt;span style="color: rgb(102, 0, 254);"&gt;"0000"&lt;/span&gt;)&lt;br /&gt;noYearSupplied = &lt;span style="color: rgb(0, 0, 255);"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; UBound( dats ) &amp;lt;&amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;2&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;//invalid date - should never get here.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; yr &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;integer&lt;/span&gt; = CDbl( dats( yearPos ) )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; yr &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;100&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// fix short year by assuming current century&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// proving that we learned nothing from y2k&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; today &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Date&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; century &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;integer&lt;/span&gt;&lt;br /&gt;century = today.year \ &lt;span style="color: rgb(51, 102, 152);"&gt;100&lt;/span&gt;&lt;br /&gt;century = century * &lt;span style="color: rgb(51, 102, 152);"&gt;100&lt;/span&gt;&lt;br /&gt;yr = yr + century&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// use any assumptions about whether the date is past or future to set century&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; assumePastFuture &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; yr &amp;gt; today.Year &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt; yr = yr - &lt;span style="color: rgb(51, 102, 152);"&gt;100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;elseif&lt;/span&gt; assumePastFuture &amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;and&lt;/span&gt; yr &amp;lt; today.Year &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;yr = yr + &lt;span style="color: rgb(51, 102, 152);"&gt;100&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;dats( yearPos ) = CStr( yr )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;elseif&lt;/span&gt; noYearSupplied &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// use any assumptions about whether the date is past or future to set year&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; mth &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;integer&lt;/span&gt; = CDbl( dats( monthPos ) )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; dy &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;integer&lt;/span&gt; = CDbl( dats( dayPos ) )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; today &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Date&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; assumePastFuture &amp;lt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; mth &amp;gt; today.Month &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; ( mth = today.Month &lt;span style="color: rgb(0, 0, 255);"&gt;and&lt;/span&gt; dy &amp;gt; today.Day )  &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt; yr = yr - &lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;elseif&lt;/span&gt; assumePastFuture &amp;gt; &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;and&lt;/span&gt; ( mth &amp;lt; today.Month &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; ( mth = today.Month &lt;span style="color: rgb(0, 0, 255);"&gt;and&lt;/span&gt; dy &amp;lt; today.Day ) ) &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;yr = yr + &lt;span style="color: rgb(51, 102, 152);"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;dats( yearPos ) = CStr( yr )&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// put detail into a date object&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; retVal &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; date&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;dim&lt;/span&gt; yy,mm,dd &lt;span style="color: rgb(0, 0, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Integer&lt;/span&gt;&lt;br /&gt;yy = val( dats( yearPos ) )&lt;br /&gt;mm = val( dats( monthPos ) )&lt;br /&gt;dd = val( dats( dayPos ) )&lt;br /&gt;&lt;br /&gt;retVal.TotalSeconds = &lt;span style="color: rgb(51, 102, 152);"&gt;0&lt;/span&gt;&lt;br /&gt;retVal.Year = yy&lt;br /&gt;retVal.Month = mm&lt;br /&gt;retVal.Day = dd&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;// check the date object is not making corrections&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; retVal.Year &amp;lt;&amp;gt; yy &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; retVal.Month &amp;lt;&amp;gt; mm &lt;span style="color: rgb(0, 0, 255);"&gt;or&lt;/span&gt; retVal.Day &amp;lt;&amp;gt; dd &lt;span style="color: rgb(0, 0, 255);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;//probably an invalid day of the month&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;//populate value ( ByRef side-effect )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; value = &lt;span style="color: rgb(0, 0, 255);"&gt;nil&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;/span&gt;&lt;br /&gt;value = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Date&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;br /&gt;value.totalseconds = retVal.TotalSeconds&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;hr /&gt;I really should put some sort of free use licence on the code but I need to speak to Norman about that first as he contributed a significant part of the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-6587415020451160468?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/6587415020451160468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=6587415020451160468' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6587415020451160468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/6587415020451160468'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2007/06/validdate-function.html' title='ValidDate function'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4445495606564470547.post-17367008963651002</id><published>2007-06-17T19:18:00.000+01:00</published><updated>2009-10-31T22:53:23.703Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REALbasic'/><title type='text'>So I've finally taken the plunge</title><content type='html'>I renewed my subscription to &lt;a href="http://www.realsoftware.com/products/realbasic/pro/"&gt;REALbasic Professional Windows edition&lt;/a&gt;. Now I'm licensed for all the releases until June 2008, so I feel clean. My last subscription expired in May 2006.&lt;br /&gt;&lt;br /&gt;My wife's copy is licensed through to August this year and I've been playing with that. Probably against the terms of her licence but I've done no paid work with it.&lt;br /&gt;&lt;br /&gt;She doesn't use it and won't be renewing. Pascal has her heart and Delphi her skill. She doesn't like RB's object model much and she doesn't find BASIC satisfying.&lt;br /&gt;&lt;br /&gt;I'm not crazy about the latest version of REALbasic because they haven't addressed the bugs that annoyed me most but I think REAL Software, Inc. should be congratulated on producing a release that concentrates mostly on bug-fixes and much less on new features.&lt;br /&gt;&lt;br /&gt;So I've stumped up my €275 ( including Value Added Tax ) and now I can produce cross-platform apps again with a clear conscience.&lt;br /&gt;&lt;br /&gt;And I've rejoined the Beta program in my own right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4445495606564470547-17367008963651002?l=rbjottings.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rbjottings.blogspot.com/feeds/17367008963651002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4445495606564470547&amp;postID=17367008963651002' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/17367008963651002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4445495606564470547/posts/default/17367008963651002'/><link rel='alternate' type='text/html' href='http://rbjottings.blogspot.com/2007/06/so-ive-finally-taken-plunge.html' title='So I&apos;ve finally taken the plunge'/><author><name>Steve Garman</name><uri>http://www.blogger.com/profile/09822355651627552034</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_uq-oPy3dQqs/S5OjZzxWBQI/AAAAAAAAACk/KECBbyq4Wec/S220/SJGanimlogo3.gif'/></author><thr:total>1</thr:total></entry></feed>
