How to set the item index in an alpha sorted TComboBox when searching incrementally (Views: 28)
Problem/Question/Abstract: I have some alpha sorted items in a combo box (style csDropDown). When the user types in text, the combo box incrementally searches but it does not set the itemindex property. Is there a way of making it do this? Answer: You could use the OnChange handler to perform a CB_FINDSTRING with the current edit text, then set the itemindex to the found item. But that is disruptive to typing, if the found item is not the one the user wants he has no way to change it, since each change triggers OnChange, which again finds the item. So you have to invest considerably more effort into this. Attach these handlers to the OnKeyPress and the OnChange event of the combobox, that seems to work fairly well. procedure TForm1.ComboBox1Change(Sender: TObject); var oldpos: Integer; item: Integer; begin with sender as TComboBox do begin oldpos := selstart; item := Perform(CB_FINDSTRING, -1, lparam(Pchar(text))); if item >= 0 then begin onchange := nil; text := items[item]; selstart := oldpos; sellength := gettextlen - selstart; onchange := combobox1change; end; end; end; procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); var oldlen: Integer; begin if key = #8 then with sender as TComboBox do begin oldlen := sellength; if selstart > 0 then begin selstart := selstart - 1; sellength := oldlen + 1; end; end; end; This works with Win2000, but on a Win98 machine, the ItemIndex is getting set incorrectly after the first search. To make it work under both Win2000 and Win98, you could do something like this: procedure TMainForm.ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var s: string; begin if key = VK_RETURN then begin s := TComboBox(Sender).Text; {The search doesn't work in Win 98 with DroppedDown set to true} TComboBox(Sender).DroppedDown := false; TComboBox(Sender).Text := s; end; end; |