Art,

This is what the MSDN docs say about the default processing by the listbox
of the WM_CHAR message:

"Moves the selection to the first item that begins with the character the
user typed. If the list box has the LBS_OWNERDRAW style, no action occurs.

Multiple characters typed within a short interval are treated as a group,
and the first item that begins with that series of characters is selected."

Below is a very simple listbox that demonstrates the default incremental
search.  If I run it and type in A C T and hit enter, I get this back:

User searched for and found: ActionCenter.dll

So, it seems to work pretty good.  The only thing I don't like is the delay
time before it stops treating the letters as a group.  If you type A C and
delay a bit, when you type T it takes you to: t2embed.dll

This would be a dialog to start with and use to implement your own
incremental search:

/* Simple Dialog listBoxSearch.rex */

  symbolMap = .table~new
  symbolMap[IDC_LB_FILEs] = 200
  --symbolMap[] =
  --symbolMap[] =

  .application~setDefaults('O', symbolMap, .false, 'Courier New', 10)

  dlg = .SimpleDialog~new
  if dlg~initCode = 0 then do
    if dlg~execute("SHOWTOP") == dlg~IDOK then do
      say 'User searched for and found:' dlg~searchAndFound
    end
    else do
      say 'User canceled'
    end
  end

return 0
-- End of entry point.

::requires "ooDialog.cls"

::class 'SimpleDialog' subclass UserDialog

::attribute searchAndFound get
  expose selectedText
  return selectedText

::method init
  expose selectedText

  forward class (super) continue
  title = "Directory Listing with Search"
  self~create(30, 30, 186, 124, title, "CENTER")
  selectedText = ''

::method defineDialog

    style = 'VSCROLL HSCROLL PARTIAL SORT NOTIFY'
    self~createListBox(IDC_LB_FILES, 10, 10, 166, 90, style)
    self~createPushButton(IDOK, 126, 105, 50, 14, 'DEFAUT', "Ok")
    self~createPushButton(IDCANCEL, 74, 105, 50, 14, ,"Push Me")

::method initDialog
  expose lb

  lb = self~newListBox(IDC_LB_FILES)
  attributes = "READWRITE READONLY HIDDEN SYSTEM DIRECTORY ARCHIVE"
  lb~addDirectory("C:\Windows\System32\*", attributes)

::method ok unguarded
  expose lb selectedText

  selectedText = lb~selected
  return self~ok:super

::method cancel unguarded

  msg   = 'Haa - tricked you. Push Me is actually cancel'
  title = "You Have Just Been Canceled"
  ret = MessageDialog(msg, self~hwnd, title)
  return self~cancel:super




On Sun, Jun 30, 2013 at 11:49 AM, Mark Miesfeld <miesf...@gmail.com> wrote:

> Hi Art,
>
> I've never tried something like that, but this is how I would start.
>
> Set an exposed variable to the empty string.  Connect the onChar event to
> the listbox.  When the event handler is invoked, append the character to
> the exposed variable.  Then use the find() method using the exposed
> variable string as the textOrPrefix, probably the current index as the
> startIndex, and exact as false.
>
> If you get a hit, move the selection to the returned index.  Each time a
> new character comes in, it is appended to the current search string and
> find() is invoked again.  I think that should get you close, then you run
> it and see what doesn't work.
>
> You want to set up your onChar handler so that the character is not passed
> on to the listbox.  I'm hoping the docs are sufficient for you to determine
> how to do that.  I'm not being secretive, if I remembered off of the top of
> my head I'd just tell you.
>
> One thing that thing I can think of that might take a little thought is
> what to do if the find() does not produce a hit.
>
> Also, you'll need to figure out when to set the search string back to the
> empty string.
>
> Let me know if you are having problems.  If I have a little time, I'll
> probably play with it a bit.
>
> The other thing is, the listbox seems to already have a search function
> built in.  You do realize that don't you?  I suspect you are asking because
> the built in procedure is not sufficient for what you want.  I don't have
> any example programs around that have very many items in a listbox, but it
> seems to work somewhat.
>
> --
> Mark Miesfeld
>
>
>
> On Sun, Jun 30, 2013 at 10:33 AM, Art Heimsoth 
> <artst...@artheimsoth.com>wrote:
>
>> I am trying to locate a string in a listbox by typing the characters, but
>> I want the number of characters to be variable.  For example, in looking
>> for names in a listbox, I would like to start typing and for each
>> character
>> bring up the next matching string.  I am using Find and I understand
>> I can specify a multiple character string, but I would like for the
>> listbox
>> find to select the first item matching the first character, allow me to
>> enter another character and have the find select the string that now
>> matches both characters, repeating until the Enter key is pressed where
>> the Ok button would then cause the currently selected string to be
>> retrieved, but how would I approach this?  How would I define an
>> onChar event on the listbox to allow me to build the string to be
>> passed to the find?  Any suggestions as to approach appreciated.
>>
>> --
>>  Art Heimsoth - artst...@artheimsoth.com
>>
>>
>> ------------------------------------------------------------------------------
>> This SF.net email is sponsored by Windows:
>>
>> Build for Windows Store.
>>
>> http://p.sf.net/sfu/windows-dev2dev
>> _______________________________________________
>> Oorexx-users mailing list
>> Oorexx-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/oorexx-users
>>
>>
>
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Oorexx-users mailing list
Oorexx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-users

Reply via email to