the visible of a stack

Richard Gaskin ambassador at fourthworld.com
Wed Sep 24 19:49:57 EDT 2008


Mikey wrote:
 > VERY funny.  Did you poke a hole in your cheek with your tongue?

Yep, and damn, now every time I take a drink the water spills out of the 
side of my face like a dribble glass.  That'll teach me... :)


 > I have a substack  -  "Preferences" that has settings for various
 > things, along with numerous cards of HTML templates and CSS, so I can
 > update the look and feel of my output without having to screw around
 > with the code.
 >
 > So, I want to get all the HTML and CSS out for use in the reports I'm
 > building.
 >
 > The other thread I started today (indirect addressing) was to try to
 > avoid using the
 > put field x of card y of stack "preferences" into somearray[a][b],
 > because it quickly becomes wider than I want, since, as you can
 > imagine, "x", "y" and the somearray[a][b] are longer than what is
 > implied here.
...
 > So, barring the ability to indirectly address the cards and the stack,
 > I was going to try the old HC method of lock messages, lock screen,
 > and iterating through the cards I want, which makes the code longer,
 > but narrower.
 >
 > Richard?  Wake up Richard.

Sorry, I was testing so I'd stepped out of the room.

Unlike SC and HC, Rev is much more forgiving with object references 
comprised of combinations of variables and literals.

For example, in SC you could say:

   put the long id of btn 1 of cd 2 of stack "MyPrefs" into tBtn

...and that would work, but you couldn't do this:

   put the long id of cd 2 of stack "MyPrefs" into tCd
   put the long id of btn 1 of tCd into tBtn

...but in Rev you can. :)

I'm not sure why the compiler is so much friendlier to these sorts of 
mix-n-match operations, but I rarely come across any combination that 
doesn't work.

So in your case you could do something like this:

   put specialFoldePath("preferences") &"/MyPrefs.dat" into tStack
   if there is not a stack tStack then
       -- create one
   else
       -- do your thing:
       put the long id of cd 1 of stack tStack into tCd
       --
       put the uMyProp of tCd into tMyStuffA[a][b]
       put the uMyProp2 of tCd into tMyStuff[a][c]
       -- and so on...
   end if


If performance is absolutely critical, moving the stuff from props into 
an array will buy you a few millisecs over the long haul.  But accessing 
props directly is fast enough that you might find it even more 
convenient to just make accessors for your preference settings:

   SetPref "TemplateCSS", "some CSS stuff"
   put GetPref("TemplateCSS") into fld 1

   --
   -- SetPref
   -- Generic handler for setting a preference value
   --
   on SetPref pLabel, pValue
      put PrefsStack() into tStack
      set the pLabel of stack tStack to pValue
      save stack tStack
   end SetPref

   --
   -- GetPref
   -- Generic handler for obtaining a preference value
   --
   function GetPref pLabel
      return the pLabel of stack PrefsStack()
   end GetPref

   --
   -- PrefsStack
   -- Returns the full path to the prefs stack, creating
   -- one if it doesn't already exist so the path is always good.
   --
   function PrefsStack
     put specialFoldePath("preferences") &"/MyPrefs.dat" \
        into tStack
     if there is not a stack tStack then
       -- create if it doesn't already exist:
       create invisible stack
       set the filename of it to tStack
       save stack tStack
     end if
     --
     return tStack
   end PrefsStack


If you had attended my session at RevCon in May we covered this sort of 
thing in detail. :)

More generalized variants of these handlers are being added to StdLib at 
the RevInterop site:
<http://tech.groups.yahoo.com/group/revInterop/>

-- 
  Richard Gaskin
  Managing Editor, revJournal
  _______________________________________________________
  Rev tips, tutorials and more: http://www.revJournal.com



More information about the use-livecode mailing list