Extracting a reference to a stack

Peter M. Brigham pmbrig at gmail.com
Sat Aug 8 10:16:03 EDT 2015


Here's a quick solution:

function ownerStack pObjLongID
   replace " of " with numtochar(8) in pObjLongID
   set the itemdel to numtochar(8)
   return item -1 of pObjLongID
end ownerStack

A more general solution is what I use in my library. The getItem() function is so useful that I use it *everywhere*.

function ownerStack pObjLongID
   -- returns the name of the stack containing pObjLongID
   -- by Peter M. Brigham, pmbrig at gmail.com — freeware
   -- requires getItem(), getDelimiters()
   
   put getItem(pObjLongID,-1," of ") into tStack
   put the name of tStack into stackName
   return stackName
end ownerStack

function getItem pContainer, pIndex, pDelim
   -- returns item # pIndex of pContainer, given itemdelimiter = pDelim
   -- could just "get item pIndex of pContainer" in the calling handler but
   --    then have to set and restore the itemDelimiter, so this is less hassle
   -- for instance, the following returns the filename from the filepath:
   --    put getItem(tPath,-1,"/") into tFileName
   -- defaults to pDelim = tab
   -- allows pIndex to be a range, eg "3-5"
   --    in that case enclose the range in quotes
   -- also allows pDelim to be a string of characters
   --    so you could do this:
   --       getItem("a//b//c//d//e//f",4,"//") -> d
   --    or:
   --       getItem("a or b or c or d or e or f","3-5"," or ") -> c or d or e
   --    which expands the possibilities for use enormously
   -- by Peter M. Brigham, pmbrig at gmail.com — freeware
   -- requires getDelimiters()
   
   -- first, if pDelim is a string then get a delimiter that is not found
   --    in pContainer and use it in place of pDelim
   if pDelim = empty then put tab into pDelim
   if len(pDelim) > 1 then
      put getDelimiters(pContainer) into tempDel
      if tempDel begins with "Error" then
         return "Error in getDelimiters()"
      end if
      replace pDelim with tempDel in pContainer
   else
      put pDelim into tempDel
   end if

   -- now parse pIndex to take care of ranges and negative values
   --    and get the item(s) requested
   put offset("-",pIndex) into dashPos
   set the itemdelimiter to tempDel
   if dashPos > 1 then
      -- don't catch if pIndex is something like -1, -2, etc
      put char 1 to dashPos-1 of pIndex into tStart
      put char dashPos+1 to -1 of pIndex into tEnd
      put item tStart to tEnd of pContainer into theItem
      replace tempDel with pDelim in theItem
   else
      put item pIndex of pContainer into theItem
   end if
   return theItem
end getItem

function getDelimiters pText, nbr
   -- returns a cr-delimited list of <nbr> characters
   --    not found in the variable pText
   -- use for delimiters for, eg, parsing text files, manipulating arrays, etc.
   -- usage: put getDelimiters(pText,2) into tDelims
   --        if tDelims begins with "Error" then exit to top -- or whatever
   --        put line 1 of tDelims into lineDivider
   --        put line 2 of tDelims into itemDivider
   --             etc.
   -- by Peter M. Brigham, pmbrig at gmail.com — freeware
   
   if pText = empty then return "Error: no text specified."
   if nbr = empty then put 1 into nbr -- default 1 delimiter
   put "2,3,4,5,6,7,8,16,17,18,19,20,21,22,23,24,25,26" into baseList
   -- low ASCII values, excluding CR, LF, tab, etc.
   put the number of items of baseList into maxNbr
   if nbr > maxNbr then return "Error: max" && maxNbr && "delimiters."
   repeat with tCount = 1 to nbr
      put true into failed
      repeat with i = 1 to the number of items of baseList
         put item i of baseList into testNbr
         put numtochar(testNbr) into testChar
         if testChar is not in pText then
            -- found one, store and get next delim
            put false into failed
            put testChar into line tCount of delimList
            exit repeat
         end if
      end repeat
      if failed then
         if tCount = 0 then
            return "Error: cannot get any delimiters."
         else if tCount = 1 then
            return "Error: can only get one delimiter."
         else
            return "Error: can only get" && tCount && "delimiters."
         end if
      end if
      delete item i of baseList
   end repeat
   return delimList
end getDelimiters


On Aug 8, 2015, at 8:23 AM, David Bovill wrote:

> Given the long id of a control - how do I extract the reference to the
> stack ti belongs to? I have a function that i have used since the dawn of
> time for this - but I recall seeing a new chunk / target / reference
> feature of Livecode in the last year that makes this easier. Did I imagine
> it?
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the use-livecode mailing list