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 <pmb...@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, pmb...@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, pmb...@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, pmb...@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@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@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@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode