Как завершить строку, напечатанную в ComboBox
Обратите внимание: Обработчик события OnKeyPress не работает в случае, когда пользователь нажимает клавишу Delete. Это событие должно перехватываться в обработчике событий OnKeyDown.
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char) ; var Found: boolean; j,SelSt: Integer; TmpStr: string; begin { Сначала нужно обработать нажатие клавиши, чтобы получить текущую строку } { Этот код требует, чтобы все элементы в списке были в верхнем регистре} if Key in ['a'..'z'] then Dec(Key,32) ; { Переводим все в верхний регистр! } with (Sender as TComboBox) do begin SelSt := SelStart; if (Key = Chr(vk_Back)) and (SelLength <> 0) then TmpStr := Copy(Text, 1, SelStart) + Copy(Text, SelLength + SelStart + 1, 255) else if Key = Chr(vk_Back) then {SelLength = 0} TmpStr := Copy(Text, 1, SelStart - 1) + Copy(Text, SelStart + 1, 255) else {Key in ['A'..'Z', etc]} TmpStr := Copy(Text, 1, SelStart) + Key + Copy(Text, SelLength + SelStart + 1, 255) ; if TmpStr = '' then Exit; { Обновить SelSt в текущей позиции } if (Key = Chr(vk_Back)) and (SelSt > 0) then Dec(SelSt) else if Key <> Chr(vk_Back) then Inc(SelSt) ; Key := #0; { указать, что клавиша была обработана } if SelSt = 0 then begin Text:= ''; Exit; end; { Теперь, когда TmpStr напечатан в текущей позиции ищем соответствие } Found := False; for j := 1 to Items.Count do if Copy(Items[j - 1], 1,Length(TmpStr)) = TmpStr then begin Text := Items[j - 1]; { Обновить соответствие, если найдено } ItemIndex := j - 1; Found := True; Break; end; if Found then { Выделить конец строки } begin SelStart := SelSt; SelLength := Length(Text) - SelSt; end else Beep; end; end;
Комментарии