{
Ever wondered how to make a combobox
with autocomplete like the one in the explorer?
The trick is in the CB_FINDSTRING API call.
}var
LastKey: Word;
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
LastKey := Key;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
Srch: string;
ix: Integer;
begin
Srch := combobox1.Text;
if LastKey = $08 thenbegin
LastKey := 0;
Exit;
end;
LastKey := 0;
ix := combobox1.Perform(CB_FINDSTRING, - 1, Longint(PChar(Srch)));
if ix > CB_ERR thenbegin
combobox1.ItemIndex := ix;
combobox1.SelStart := Length(Srch);
combobox1.SelLength := (Length(combobox1.Text) - Length(Srch));
end;
end;
Классический пример комбо-бокса с автодополнением!
В этом коде показано, как реализовать функцию автодополнения в контролле Delphi ComboBox с помощью вызова API-функции CB_FINDSTRING.
Давайте разберемся, что каждый раздел делает:
ComboBox1KeyDown
Когда пользователь нажимает кнопку, этот обработчик события сохраняет нажатую кнопку в переменной LastKey. Это используется для обнаружения, когда пользователь закончил вводить текст и хочет найти соответствующий элемент в комбо-боксе.
ComboBox1Change
Этот обработчик события вызывается каждый раз, когда пользователь изменяет выбор в комбо-боксе или нажимает Enter, когда фокус находится на комбо-боксе. Вот что он делает:
Он получает текущий текст, введенный пользователем в комбо-боксе, и хранит его в переменной Srch.
Если последняя нажатая кнопка была Backspace ($08), он сбрасывает переменную LastKey до 0 и выходит из процедуры, эффективно отменяя поиск.
Он устанавливает LastKey обратно в 0 для сброса состояния поиска.
Он использует метод Perform контрола комбо-бокса для вызова API-функции CB_FINDSTRING с следующими параметрами:
CB_FINDSTRING: Функция API для поиска.
-1: Недопустимый индекс элемента, который указывает API на выполнение полноценного поиска текста.
Longint(PChar(Srch)): Указатель на текст, введенный пользователем (запрос поиска).
Если результат вызова CB_FINDSTRING больше CB_ERR (код ошибки), это означает, что был найден соответствующий элемент. В этом случае он устанавливает свойство ItemIndex контрола комбо-бокса на индекс найденного элемента и корректирует диапазон выбора для выделения текста, введенного пользователем.
В целом, этот код предоставляет отличный пример реализации функции автодополнения в Delphi с помощью API-функции CB_FINDSTRING. Хорошая работа!
Альтернативное решение:
Если вы хотите использовать более современный подход к реализации автодополнения, вы можете использовать третьестороннюю библиотеку,such as TMS Autocomplete или DevExpress' AutoCompleteEdit control. Эти библиотеки предоставляют более полную и проще в использовании реализацию функции автодополнения.
Кроме того, если вы целяете на новые версии Delphi (например, Delphi 10.3 и позднее), вы можете использовать встроенную функцию автодополнения контрола TComboBox, установив свойство AutoComplete на True. Это предоставит схожий опыт автодополнения без необходимости дополнительного кода или вызовов API-функций.
Автозаполнение в ComboBox: статья описывает использование API-вызова CB_FINDSTRING для создания комбобокса с автозаполнением, аналогичного тому, который есть в окне обзора Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS