Jacque, thanks for your timeless effort to educate me. I think one of my problems is the same as the thing that caused me to initially buy dozens of computer books on the same topic, searching for authors who used "my" vocabulary. Amazingly, sometimes I managed to do that, or, maybe from reading all of the other volumes I just got "smarter"; but at some point I started understanding what I read. In both your and Jim's explanations/examples you've used the word "keys". I don't like that word because it doesn't have a meaning that I understand in this context. I'm not sure what word I would use, perhaps "Index" or "matrixLocator" or ?? To me a "key" is used to unlock something, not locate or find it.

I thank all of you for your diligence and patience. Before too long, this whole set of curiosities will be assembled into a really informative Macinstruct.com article on RR. But I'm still waiting for my own "Aha!" moment. I loved what you said about the Script Vars. We used them in FutureBasic many times. I wish we'd had them in HC. I, too, had several applications with 20 to 25 Start using Stacks that required globals to communicate with one another. In my case, I used one of the stacks to maintain control of the globals. On startup, one of the first things that happened was this stack was opened and fields were loaded into memory; at which time each line of the fields was put into a global. During operation, when these values were changed by the user, the line items in that stack were modified. This worked great for a huge number of catalog/inventory items used for pricing and a bunch of other things. I've a hunch this was not a lot different than customproperties.

For those interested, it only took me a couple of hours to completely redo my "lost" menu bar.

Have a good weekend all of you. I've got some architecture to do.

Joe Wilkins

On Mar 30, 2007, at 8:35 PM, J. Landman Gay wrote:

Joe Lewis Wilkins wrote:
Please enlighten me. With HC I never really had any problem using Globals pretty extensively. I know all of the "old" adverse thoughts and how it was felt to be bad programming practice; and, perhaps, before we could have some pretty long vars, maybe it was tough coming up with names that didn't create conflicts, but I think we're past all of that now. So... why is using Custom Properties any better than using globals.

Like Richard, I use variables and custom properties for different reasons. If data needs to be saved permanently with the stack (like a set of user prefs, for example) custom properties are perfect. Rev stores your preferences this way. For data that is only used during the current session, I think it is preferable to use variables.

But I avoid globals in general, and prefer script-local variables instead. Globals clutter up the name space and the variable watcher, they are hard to keep track of, and there can be naming conflicts with other stacks. Mostly it's the cluttter I don't like. I've translated a lot of HC stacks that make me cringe from global overload. I've also noticed that many novice HC authors used globals simply because they didn't know how to pass parameters. That's easy to fix.

I once worked on a large HC conversion that used globals all over the place, there must have been more than a hundred of them. This was often necessary in HC because there wasn't any other way to do certain things, but by the time your variable watcher fills up with that many globals you can hardly keep track of any of them. In this particular stack, I was able to change the globals to script-locals in almost every case, and reduced the number of globals down to a small handful. I usually only employ globals for data that needs to be frequently accessed across stacks or objects. For infrequent access I sometimes use custom properties intead; it depends.

A script-local variable acts just like a global, but with a more limited scope. It only "belongs" to the script that contains it, rather than being accessible from anywhere. When that script isn't being executed, the variable is out of the way. It is easier to keep track of these variables because they only appear in a single script; they don't populate the variable watcher anywhere else.

For example, how many times in HC did you have to do something like this:

on doThing
 global gBoolean
 put true into gBoolean
end doThing

on doThingTwo
 global gBoolean
 if gBoolean = true then doThingThree
 put false into gBoolean
end doThingTwo

Though these handlers are in the same script, HC requires a global variable to retain the value of gBoolean between handler executions. With Rev, a script local variable can do this instead. Just pop the variable up at the top of the script and it is available to any handler in that script:

local sBoolean -- this is the only declaration you need

on doThing
 put true into sBoolean
end doThing

on doThingTwo
 if sBoolean = true then doThingThree
 put false into sBoolean
end doThingTwo

Outside of this script, the variable is not available and stays out of the way. However, the script itself retains the value of the variable for the entire session; you don't need to reset it between handler executions. I really like script local variables. They are like mini-globals.

Custom properties are a different animal. They provide permanent storage because they are saved with the stack, but you can also use them as temporary storage if you want to. The down side to using them as temporary, session-specific storage is that when the stack closes (or opens) you have to remember to initialize them to empty. With script-local variables, that isn't an issue because, like any variable, script-locals disappear when the engine quits.

Custom properties take slightly longer to access than either global or script-local variables. The increased access time is small, so in most cases it's moot. But if speed is an issue or you have a lot of data to retrieve frequently, use variables instead of custom properties.

Custom properties, like variables, are created automatically whenever you first reference them:

  set the cUser of this cd to "joe"

creates a custom property of the card called "cUser", if it doesn't already exist. The value of the "cUser" custom property is "joe". Now whenever you need to get that value, you can retrieve it:

  put the cUser of this cd into tUserName

Now the variable "tUserName" contains "joe". The custom property will be saved with the stack. We used to use hidden fields for this stuff in HC. Custom properties are much better; they are like infinite hidden field space with some additional enhancements besides -- and you don't have to clutter up your stack with invisible objects. Remember the stacks that used to store data at the top of scripts? The ones with big "DO NOT MOVE THIS DATA" comments around them? (Apple shipped the calendar stack with one of those.) Those lines of script would have been in custom properties, if HC had had them.

Custom properties can also be stored in custom property sets, which you can create at will. Custom property sets are arrays with keys and values -- basically just a group of related properties. You can have the same keys in different sets if you want; for example, you could have a custom property set called "English" and another one called "French". Each array could have the same keys; perhaps each key would be a field name. The values in the keys of each set would be different though -- the English set would store the English names for the fields, and the French set would store them in that language.

It then becomes very easy to change all the field labels to the language of choice when the stack opens. You simply set the customPropertySet of the stack to the language you want, and set each label field to the value of the matching key in the array.

I generally use custom properties for different things than I use variables. They can be somewhat interchangeable, and I do that sometimes, but in general I like variables for session use and properties for permanent storage.

--
Jacqueline Landman Gay         |     [EMAIL PROTECTED]
HyperActive Software           |     http://www.hyperactivesw.com
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to