Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Автоматическое завершение вводимой фразы для TComboBox

Delphi , Компоненты и Классы , Списки

Автоматическое завершение вводимой фразы для TComboBox

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  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 then
   begin
     LastKey := 0;
     Exit;
   end;
   LastKey := 0;
   ix := combobox1.Perform(CB_FINDSTRING, - 1, Longint(PChar(Srch)));
   if ix > CB_ERR then
   begin
     combobox1.ItemIndex := ix;
     combobox1.SelStart  := Length(Srch);
     combobox1.SelLength := (Length(combobox1.Text) - Length(Srch));
   end;
 end;

Привет! Я переведу текст на русский язык.

Это фрагмент кода на Delphi, который реализует функцию автодополнения для компонента TComboBox. Идея заключается в использовании API-вызова CB_FINDSTRING для поиска совпадающих элементов в списке элементов комбо-бокса при вводе пользователем.

Вот шаг за шагом, как это работает:

  1. Переменная LastKey используется для хранения последнего нажатого пользователем клавиши.
  2. В обработчике события ComboBox1KeyDown, значение LastKey обновляется каждый раз, когда пользователь нажимает клавишу.
  3. В обработчике события ComboBox1Change, код проверяет, была ли последняя нажатая клавиша клавишей "Backspace" ($08). Если это так, то значение LastKey сбрасывается и процедура заканчивается, чтобы предотвратить дальнейшую обработку.
  4. Код затем ищет совпадающие элементы в списке элементов комбо-бокса с помощью API-вызова CB_FINDSTRING. Этот вызов принимает три параметра: текст для поиска (хранится в переменной Srch), начальное положение (-1 в этом случае, что означает начать с начала списка) и длинное целое значение (PChar( Srch)).
  5. Если совпадение найдено, код устанавливает индекс элемента комбо-бокса на соответствующий элемент, выбирает все текст после поисковой строки с помощью SelStart и SelLength, а затем обновляет выбранный текст.

Альтернативное решение:

Вместо использования API-вызова CB_FINDSTRING можно использовать метод ComboBox1.Items.IndexOf() для поиска совпадающих элементов в списке элементов комбо-бокса. Это может быть более простым и понятным подходом.

Вот обновленный код, который демонстрирует это альтернативное решение:

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  Srch: string;
  ix: Integer;
begin
  Srch := combobox1.Text;
  if LastKey = $08 then
  begin
    LastKey := 0;
    Exit;
  end;
  LastKey := 0;
  ix := combobox1.Items.IndexOf(Srch);
  if ix >= 0 then
  begin
    combobox1.ItemIndex := ix;
    combobox1.SelStart := Length(Srch);
    combobox1.SelLength := (Length(combobox1.Text) - Length(Srch));
  end;
end;

Обратите внимание, что это код предполагает, что список элементов комбо-бокса не пуст. Если вам нужно обрабатывать случай, когда список элементов пуст, вам придется добавить дополнительную проверку и обработку ошибок.

Автоматическое завершение вводимой фразы для TComboBox позволяет создавать комбо-боксы с автодополнением, используя API-вызов CB_FINDSTRING и обработку событий Change и KeyDown.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 19:09:41/0.0038111209869385/0