Автозаполнение в TComboBox.Компилятор: C++ Builder В данной статье объясняется, как можно реализовать автозаполнение в TComboBox наподобие того, как это сделано в строке "Адрес" в браузере. Для этого нам потребуется перехватить в TComboBox события OnKeyDown и OnChange. В обработчиках этих событий мы будем производить поиск, замену и выделение. Вообще-то Win32 ComboBox уже имеет встроенную возможность автозаполнения, однако она не всегда включена. Для этого Win32 API имеет несколько сообщений: CB_FINDSTRING - Осуществляет поиск строки, основанный на чувствительном к регистру поиске первых нескольких букв. CB_FINDSTRINGEXACT - Находит первую строчку в списке (list box) комбобокса, которая удовлетворяет указанной строке. CB_SELECTSTRING - Ищет в списке строку которая начинается с символов в указанной строке. Если удовлетворяющий пункт в списке найден, то он копируется в поле редактирования. Мы будем использовать только CB_FINDSTRING. В этом примере, для заполнения списка, данные загружаются из таблицы customers.db из BCDEMOS, а затем перехватыватся события OnKeyDown и OnChange. Перед тем, как начать поиск, CB_FINDSTRING получает в первом параметре (wParam) номер пункта. Так как мы ищем по всему списку, то устанавливаем его в -1. Второй параметр, это адрес строки для поиска. -------------Код--------------
//cb это ComboBox
//lastKey - приветный мембер TForm1
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Table1->Open(); //получаем данные из таблицы
Table1->First();
while (!Table1->Eof)
{
cb->Items->Add(Table1->FieldByName("Contact")->AsString);
Table1->Next();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
lastKey = Key; //получаем последнюю клавишу, нажатую в ComboBox
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbChange(TObject *Sender)
{
String srch = cb->Text; //текст, который будем искать
if ((lastKey == 0x08) || (lastKey == VK_DELETE)) //если была нажата backspace
{ //или delete, то выходим отсюда
lastKey = 0;
return;
}
lastKey = 0;
int ix = cb->Perform(CB_FINDSTRING,-1,(LPARAM)srch.c_str()); //ищем строку в списке
if (ix != CB_ERR)
{
cb->ItemIndex = ix; //устанавливаем соответствующий текст ComboBox
cb->SelStart = srch.Length();
cb->SelLength = (cb->Text.Length()-srch.Length()); //выделяем соответствующий текст
}
}
//---------------------------------------------------------------------------
|