Extracting a reference to a stack

David Bovill david at viral.academy
Sat Aug 8 10:45:24 EDT 2015


There was a recent feature added to the language that would help - maybe it
was something to do with the owner....

I have a similarly convoluted function and getprop - one of the issues is
that if you want the long name of the stack the control is part of - this
could be a mainstack or a substack - so to get "the stack on which the
control is placed" has always been a bit of a pain...

On 8 August 2015 at 15:16, Peter M. Brigham <pmbrig at gmail.com> wrote:

> 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
>
>
> _______________________________________________
> 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