заполнение TEdit, если есть записи, начинающиеся с уже введенных символов
Есть ADO-таблица, в которой, разумеется, хранятся какие-то данные.
На форме есть TEdit в которое вводится название страны. Дальше требуется следующее.
Например хотим ввести "Россия". Вводим "Р", если в БД уже есть такое значение - оно должно добавляться в TEdit, а часть [оссия] должна быть выделена. Кажется понятно объяснил.
Делаю по событию OnChange след. образом:
Код:
TLocateOptions opt;
opt << loCaseInsensitive << loPartialKey;
if(dm->Table->Locate("ACountry",txtCountry->Text,opt))
{
int pos = txtCountry->Text.Length();
txtCountry->Text = dm->Table->FieldByName("ACountry")->AsString;
txtCountry->SelStart = pos;
txtCountry->SelLength = txtCountry->Text.Length();
}
opt << loCaseInsensitive << loPartialKey;
if(dm->Table->Locate("ACountry",txtCountry->Text,opt))
{
int pos = txtCountry->Text.Length();
txtCountry->Text = dm->Table->FieldByName("ACountry")->AsString;
txtCountry->SelStart = pos;
txtCountry->SelLength = txtCountry->Text.Length();
}
Заполнение работает правильно, но если к примеру ввести первую букву "Р", передумать и нажать backspace - ничего не произойдет, потому что удаляется часть [оссия] (так как она выделена), срабатывает событие OnChange ---> снова добавляется удаленная часть.
Жду советов.
Можно обойтись и одним OnChange, хотя я бы так делать не стал - завести строковую переменную с предыдущим значением TEdit (в предыдущем OnChange) и изменять её в конце OnChange. Тогда можно сравнить текущую и предыдущую строки и выяснить, надо автодополнять или нет (самое просто, например, если в старая строка была короче/равна новой, а также если старая содержалась (Pos) в новой).
Цитата: Proger_XP
Ну, так ловите в OnKeyUp VK_BACKSPACE и ставьтте флаг, который затем читайте в OnChange и не делайте ничего, если он стоял.
Блин... Почему я не догадался...
Спасибо, сделал.