Re: list question
- Posted by Derek Parnell <ddparnell at bigpond.com> Aug 28, 2001
- 432 views
----- Original Message ----- From: "George Walters" <gwalters at sc.rr.com> To: "EUforum" <EUforum at topica.com> Subject: list question > If you've built a list, is there a way of finding an index where you have > the 1st character(s) match. The only way I can think of is to do a search > loop of some kind using setIndex and getText until you find a match. This > seems the hard way. Is there a more direct way? You can't keep track while > you're building the list because win will sort it and get out of the input > order. Hi George, I've included a rather long example of this sort of thing. Its about 130 lines of text but I hope it is worth viewing. ------------- include win32lib.ew without warning constant win = create(Window, "test List", 0, 0, 0, 400, 400, 0), SB = create(StatusBar, "", win, 0, 0, 0, 0, 0), aList = create(SortedCombo, "", win, 5,5, 300, 300, 0), aFld = create(EditText,"", win, 5, 50, 300, 25, 0) integer ebox sequence kids -- Put some stuff in the list. addItem(aList,{ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"} ) -- Here we find the 'editbox' that belongs to the combo. kids = findChildren(aList) ebox = kids[1][1] -- Force the first item to be selected to start with. setIndex(aList,1) -- This is used to detect if the user is editing the field -- with the Delete key, in which case the "matching" is skipped. integer DelKey DelKey = 0 procedure ebox_Change() sequence itemtext, thisitem integer items integer posn -- If the user pressed the delete key, don't try to match -- with any existing entries. if DelKey then return end if -- Find out where the cursor is. posn = getIndex(ebox) -- Get the typed text, convert to lower for easy compare itemtext = lower(getText(ebox)) -- If nothing there then exit if length(itemtext) = 0 then return end if -- Reduce the comparision to whats on the left of the cursor itemtext = itemtext[1 .. posn-1] setText(SB, sprintf("DEBUG: Comparing '%s'", {itemtext})) -- Scan through all the items in the list for a partial match items = getCount(aList) for i = 1 to items do -- get the next item's text, convert to lower. thisitem = lower(getItem(aList, i)) -- Skip items that are shorter than what's been typed. if length(thisitem) >= length(itemtext) then -- Compare the begining of the item if equal(itemtext, thisitem[1 .. length(itemtext)]) then -- If matching, update the list index setIndex(aList,i) -- Reposition the cursor setIndex(ebox, posn) -- Stop searching exit end if end if end for end procedure onChange[ebox] = routine_id("ebox_Change") -- Set the delete key flag. procedure onKeyDown_ebox(integer keycode, integer shifts) DelKey = (keycode = VK_DELETE) end procedure onKeyDown[ebox] = routine_id("onKeyDown_ebox") -- See if I need to add to the list. procedure onLostFocus_ebox() sequence itemtext, thisitem integer items integer found -- Get what's been typed, exit if empty itemtext = getText(ebox) if length(itemtext) = 0 then return end if found = False -- Check to see if it is in the list already. items = getCount(aList) for i = 1 to items do thisitem = getItem(aList, i) if equal(itemtext, thisitem) then -- Found! So mark the spot and stop searching found = True exit end if end for -- if not found, add the new item if found = False then found = message_box( sprintf("Do you wish to add '%s' to the list?",{itemtext}), "Add to List", MB_YESNO) if found = IDYES then addItem(aList, itemtext) setText(SB, sprintf("Added '%s' to list.", {itemtext})) else setText(SB, sprintf("'%s' not used.", {itemtext})) end if else setText(SB, sprintf("Using '%s'.", {itemtext})) end if end procedure onLostFocus[ebox] = routine_id("onLostFocus_ebox") WinMain(win, Normal) ------------- cheers, Derek