Thanks, Peter, that's what I was looking for.

Also, thanks Pete for the advice on using a database. That's what I used in a 
past, non-Livecode project, but unless the database can be embedded in the main 
stack, I can't use that here.

Peter Bogdanoff
UCLA

On Dec 19, 2012, at 2:33 PM, Peter M. Brigham wrote:

> If you use "find" you'll have to "go invisible" to each substack, as has been 
> pointed out, or you'll get each substack flashing to the front. The other 
> thing is that the find command will find the first instance of the string in 
> each stack, so you will have to use the foundchunk function and to store the 
> find then repeat the find/store-chunk routine until all have been found. 
> 
> The alternative is to use offset. This could be sped up if you know which 
> fields are of interest, which you almost certainly will -- you don't want to 
> search label fields and other stuff that doesn't contain actual data. If you 
> go that route, here's a useful function that returns all the offsets of a 
> string in a container. It is quite fast.
> 
> function offsets str,container,includeOverlaps
>   -- returns a comma-delimited list of all the offsets of str in container
>   -- third param is optional:
>   --     offsets("xx","xxxxxx") returns "1,3,5" not "1,2,3,4,5"
>   --     ie, by default, overlapping offsets are not counted
>   --     if you want overlapping offsets then pass "true" in 3rd param
>   -- returns 0 if str is not in container
>   if str is not in container then return 0
>   if includeOverlaps = empty then put false into includeOverlaps
>   put empty into offsetList
>   put 0 into startPoint
>   repeat
>      put offset(str,container,startPoint) into thisOffset
>      if thisOffset = 0 then exit repeat
>      add thisOffset to startPoint
>      put startPoint & comma after offsetList
>      if not includeOverlaps then
>         add length(str)-1 to startPoint
>      end if
>   end repeat
>   return item 1 to -1 of offsetList -- delete trailing comma
> end offsets
> 
> You can indeed avoid going to the individual substacks by first setting up a 
> list of long id's of fields ("fieldlist") for all the fields of interest in 
> all the substacks. Store this as a script local or a customproperty so it's a 
> one-time task.
> 
> repeat for each item f in fieldlist
>   put offsets(tString,f) into tOffsets
>   if tOffsets = 0 then next repeat
>   repeat for each item i in tOffsets
>      put the number of words of char 1 to i of the text of f into nbrWords
>      put "…" && (word nbrWords - 3 to nbrWords + 3 of the text of f) && "…" 
> into tContext
>      -- more scripting to load the context into your display field and
>      -- set the linktext of the line to the occurrence found, or
>      -- whatever your idea is for the user access to the original occurrence
>   end repeat
> end repeat
> 
> I strongly suspect this approach will be faster than going to each stack 
> invisibly and doing repeated finds.
> 
> -- Peter
> 
> Peter M. Brigham
> pmb...@gmail.com
> http://home.comcast.net/~pmbrig
> 
> 
> On Dec 17, 2012, at 6:54 PM, Peter Bogdanoff wrote:
> 
>> I do see that there is much more management with the "offset", however, I 
>> believe I can use the offset without having to actually navigate to the 
>> other stack, and I found that going to another stack and using the "Find" 
>> there unlocks the screen (bad).
>> 
>> I want the entire search done in one go with a list of all the found 
>> occurrences.
>> 
>> 
>> On Dec 17, 2012, at 3:45 PM, dunb...@aol.com wrote:
>> 
>>> I do not know if I am understanding you correctly, but my instincts say 
>>> that "find" is the right way to go. "Offset" would require more management, 
>>> whereas "find" is pretty self reliant.
>>> 
>>> 
>>> How would you use "offset" over multiple stacks anyway? Navigate to each 
>>> card in each stack, and then test each field in turn, noting if the offset 
>>> function returned a value or not? Certainly there is a value to this, in 
>>> that the "offset" function can be tailored to find multiple instances.
>>> 
>>> 
>>> Perhaps a mixture of the two, "find" to get quickly to a card that has a 
>>> hit, and then "offset" to find multiple instances?
>>> 
>>> 
>>> Craig Newman
>>> 
>>> 
>>> 
>>> 
>>> -----Original Message-----
>>> From: Peter Bogdanoff <bogdan...@me.com>
>>> To: How to use LiveCode <use-livecode@lists.runrev.com>
>>> Sent: Mon, Dec 17, 2012 6:31 pm
>>> Subject: Find vs. Offset
>>> 
>>> 
>>> Hi,
>>> 
>>> I have a stack with multiple substacks. One of the substacks is a Search 
>>> tool to 
>>> find text in the other substacks. Given a string to find, it searches the 
>>> other 
>>> stacks, returns a list of the cards where the string was found (there may 
>>> be 
>>> multiple hits on the same card), and puts excerpts of the strings of text 
>>> (3 
>>> words before and after the found chunk) into a field. The user then clicks 
>>> on a 
>>> line of the field to go to a card where the text was originally 
>>> found--there I 
>>> do another Find to put the found box around the text.
>>> 
>>> Am I right in assuming that I should use the offset function to do the 
>>> original 
>>> search rather than the Find command?
>>> 
>>> I see that when I use the Find command, although I lock the screen, it is 
>>> unlocked after going to each stack. Also I suspect it is a much slower 
>>> method.
>>> 
>>> There is a lot more scripting to do with the offset to search multiple 
>>> fields, 
>>> and multiple hits in the same field, to I would like to know if this is the 
>>> best 
>>> method.
>>> 
>>> Any experience with this?
>>> 
>>> Peter
>>> UCLA
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> 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
> 
> 
> _______________________________________________
> 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

Reply via email to