LiveCode is the premier environment for creating multi-platform solutions for all major operating systems - Windows, Mac OS X, Linux, the Web, Server environments and Mobile platforms. Brand new to LiveCode? Welcome!
Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller, robinmiller
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 2:37 pm
I wanted a function to hilite the first row of a data grid that contained any characters the user entered and I wanted it to be a case sensitive search. After hiliting the row, I would then like the the function to continue with the next row as long as the search argument is not changed. I do not care that the function find a second occurrence in the same row, only another row. If the argument is changed the search should start again at the top and if the find is not successful then the hilite should return to the top with a beep. Here is what I have:
Code: Select all
function FieldFind tSearch
global gToFind
global gLastLine
set the caseSensitive to true
if tSearch <> gToFind then
put 0 into gLastLine
put tSearch into gToFind
end if
put the dgText of group "DataGrid 1" into tText
add 1 to gLastLine
put the number of lines of tText into tNumLines
repeat with i=gLastLine to tNumLines
put line i of tText into tLine
put offset(gToFind,tLine) into nPos
if nPos > 0 then
put i into gLastLine
exit repeat
end if
end repeat
if i >= tNumLines then
put 0 into gLastLine
beep 1
end if
return gLastLine
end FieldFind
This function seems to work find as long as the characters I want to find are near the top pf the data grid. As I search for things later down the grid, the line that gets hilited is one or two lines below the line that should be hilited. What am I doing wrong? ( I won't dismiss the fact that LiveCode could be having a problem since when I drug down the left side if the IDE to select the code to display here, one of the lines did not select and was missing from what I wanted to paste to this forum. But that is another rant...)
Larry
-
Klaus
- Posts: 14199
- Joined: Sat Apr 08, 2006 8:41 am
-
Contact:
Post
by Klaus » Sun May 18, 2014 2:52 pm
Hi Larry,
looks OK, can you please also post the calling script?
Best
Klaus
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 3:15 pm
Here it is Klaus. It is from my edit menu.
Code: Select all
on menuPick pWhich
switch pWhich
case "Cut"
cut
break
case "Copy"
copy
break
case "Paste"
If the clipboard is "text" then paste
break
case "Clear"
delete
break
case "Undo"
undo
break
case "Find"
global gToFind
global gLastLine
put the focusedObject into tFocused
ask question "What would you like to find?" with gToFind
put it into tAnswer
if answer is empty then exit menuPick
put 0 into glastLine
put FieldFind(tAnswer) into tLine
If tLine <> 0 then
set the dghilitedLines of group "DataGrid 1" to tLine
else
set the dghilitedLines of group "DataGrid 1" to 1
beep 1
end if
break
case "Find Next"
global gToFind
global gLastLine
put FieldFind(gToFind) into tLine
If tLine <> 0 then
set the dghilitedLines of group "DataGrid 1" to tLine
else
set the dghilitedLines of group "DataGrid 1" to 1
end if
break
case "Preferences"
global gRadiDBName
set the dialogData to gRadiDBName
modal stack "Preferences Dialog"
set the dialogdata to ""
break
end switch
end menuPick
-
Klaus
- Posts: 14199
- Joined: Sat Apr 08, 2006 8:41 am
-
Contact:
Post
by Klaus » Sun May 18, 2014 3:25 pm
OK, thanks.
Do both items "Find" and "Find gain" show the same problems you decsribe?
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 3:52 pm
I have been concentrating on the Find but a quick test of the Find Next seems to display the same thing.
Thanks Klaus,
Larry
-
Klaus
- Posts: 14199
- Joined: Sat Apr 08, 2006 8:41 am
-
Contact:
Post
by Klaus » Sun May 18, 2014 6:01 pm
Hi Larry,
aha, as I said, looks OK!?
Could you eventually post a (stripped down) stack here?
Best
Klaus
-
Dixie
- Livecode Opensource Backer

- Posts: 1336
- Joined: Sun Jul 12, 2009 10:53 am
Post
by Dixie » Sun May 18, 2014 6:35 pm
Try using 'lineOffset' to find the line you are looking for in the dgText
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 6:37 pm
Klaus,
I'll give it a try. Thanks .
Larry
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 7:22 pm
Klaus,
You are so smart. In trying to get you a 'stripped down' stack, I have discovered the error of my ways. (You knew that was going to happen!) It seems that my dataGrid has a few rows that have a column where there is more than 1 line in the value, thus the extra line offsets. I am not going to be able to use dgText but instead go to a bit more work and use dgData.
I'm sorry for making you do so much work but thanks again for being there for help.
Larry
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Sun May 18, 2014 10:31 pm
Well so much for dgData. The index of a line and the number of a line have no relation to each other so any lines found are not found sequently. I went back to dgText and have something pretty inefficient but LiveCode doesn't seem to blink at the inefficiency. I guess I could put the "compressed" text in an invisible field but then I would have to make sure it was always recalculated when any sorting was done.
Code: Select all
function FieldFind tSearch
global gToFind
global gLastLine
set the caseSensitive to true
set the itemdelimiter to tab
if tSearch <> gToFind then
put 0 into gLastLine
put tSearch into gToFind
end if
put the dgText of group "DataGrid 1" into tText
put empty into tCompressed
put the number of lines of tText into tLines
repeat with i=1 to tLines
put line i of tText into tLine
put item 1 of tLine into tKey
if isnumber(tKey) then
put tLine & return after tCompressed
else
put tab & tLine after the last line of tCompressed
end if
end repeat
add 1 to gLastLine
put the number of lines of tCompressed into tNumLines
repeat with i=gLastLine to tNumLines
put line i of tCompressed into tLine
put offset(gToFind,tLine) into nPos
if nPos > 0 then
put i into gLastLine
exit repeat
end if
end repeat
if i >= tNumLines then
put 0 into gLastLine
beep 1
end if
return gLastLine
end FieldFind
-
sritcp
- Posts: 431
- Joined: Tue Jun 05, 2012 5:38 pm
Post
by sritcp » Tue Aug 12, 2014 12:51 pm
You can also search the DataGrid directly.
Put the following in the script of the DataGrid; this will highlight all the rows containing your search string.
Code: Select all
command searchMe tString
local tIndexList, tRecord, tHLIndexes
put the dgIndexes of me into tIndexList
repeat for each item tIndex in tIndexList
put getDataOfIndex(tIndex) into tRecord
repeat for each element tElement in tRecord
if tElement contains tString then
put tIndex & comma after tHLIndexes
exit repeat
end if
end repeat
end repeat
delete the last char of tHLIndexes
set the dgHilitedIndexes of me to tHLIndexes
end searchMe
You can trigger it with a button whose code could be
Code: Select all
on mouseUp
local tSearchString
ask "Search Term?"
if it is not empty then put it into tSearchString
dispatch "searchMe" to group "DataGrid1" with tSearchString
end mouseUp
Regards,
Sri
-
lohill
- Posts: 770
- Joined: Tue Dec 08, 2009 6:37 pm
Post
by lohill » Mon Aug 18, 2014 6:47 pm
Thanks for this Sri. Sorry it took me so long to get back to it.
Regards,
Larry
-
sphere
- Posts: 1145
- Joined: Sat Sep 27, 2014 10:32 am
Post
by sphere » Mon Jun 29, 2015 9:39 pm
Thank you Sri!
This works perfect and super fast !
Cheers, Sphere