Текущий архив: 2002.07.04;
Скачать: CL | DM;
Вниз
Автозаполнение в поле TEdit Найти похожие ветки
← →
Q79 (2002-06-20 09:31) [0]Прикольная проблемка заставила меня обратиться за помощью...
Есть набор данных (список, например, имён). При вводе записи о новом человеке в базу необходимо указать его имя, причём как можно быстрее, а именно:
1)если в БД такое имя есть, то автозаполнение использовать, т.е. как в ComboBox"е - окончание подставляется и остаётся выделенным, затем, при вводе дополнительных символов, заменяется
2)если в БД нет имени, то добавить и использовать (это не проблема)
Я использую для выбора имени не ComboBox, а обычный TEdit, используя OnChange-событие для поиска в БД имени и подстановки его в поле, выделения подставленной части.
Загвоздка в следующем: при следующем нажатии на клавишу хочется, чтобы выделенная часть заменялась, а получается следующее:
сначала выделенная часть становится невыделенной,
текстовый курсор остаётся на месте,
затем нажатый символ вставляется в поле.
Если Вы сталкивались с такой задачей, знаете её решение или просто есть свои оображения на эту тему, шлите ответ на е-мелю
Заранее благодарю.
← →
Игорь Шевченко (2002-06-20 10:07) [1]А при вводе нового символа послать сообщение EM_REPLACESEL не поможет ?
← →
McSimm (2002-06-20 12:09) [2]Выделенная часть текста и так должна замениться при вводе нового символа. Что-то делаете не так.
← →
kull (2002-06-20 12:15) [3]А почему не Combobox?
← →
McSimm (2002-06-20 12:21) [4]Вот нашел, когда-то помогал уже человеку с подобной просьбой. Здесь не все, нужна доработка (Суть доработки в том, что поиск надо делать только при добавлении символа, а при Del или BkSpace - нет. Иначе будет вести себя некорректно)
--- --- ---
Пишешь обработчик OnChange для Edit.
procedure TForm1.Edit1Change(Sender: TObject);
var Len: Integer;
S: String;
begin
if Edit1.Tag = -1 then Exit; // смысл этой строчки см. ниже
S := Edit1.Text;
if (S <> "") and Table1.Locate("MyFieldName", S, [loCaseInsensitive,
loPartialKey]) then
begin
Len := Length(S); // запоминаем длину
// Выбираем из поля символы, которые надо добавить к тексту в Edit1
S := Table1.FieldByName("MyFieldName").AsString;
//Теперь надо изменить сам Edit1. Осторожно. Если это сделать,
//программа зациклится. Необходимо использовать флаг. Например:
Edit1.Tag := -1; // Защита от зацикливания
Edit1.Text := S;
//Теперь надо выделить добавленный текст
Edit1.SelStart := Len;
Edit1.SelLength := Length(S);
//Выключаем флаг
Edit1.Tag := 1
end;
end;
Писал сходу. Возможны проблемы.
Успехов
--- --- ---
← →
kull (2002-06-20 13:02) [5]И всетаки, почему бы не использовать Combobox?
Зачем изобретать велосипед?
Ведь вся нужная функциональность там уже есть.
← →
McSimm (2002-06-20 13:43) [6]>kull © (20.06.02 13:02)
Не везде. В смысле не во всех win комбобокс себя так ведет
← →
kull (2002-06-20 14:36) [7]Незнаю насчет win но в Delphi6 Combobox имеет properties разрешающие автозаполнение и автовыпадание. Так что думаю должно функкционировать.
← →
AlexGreg (2002-06-24 14:11) [8]для Игорь Шевченко:
SendMessage() генерирует ошибку, может я не там вызываел.
PostMessage() - эффект тот же
для McSimm и kull:
сначала я тоже взял комбобокс и эдит
... из библиотеки EhLib
а сегодня взял стандартную компоненту эдит и попробовал те же действия, что задумывал сначала - ЗАРАБОТАЛО !
Вот так. А ведь для EhLib стандартные компоненты, as I know, базовыми являются стандартные ...
Всем бесконечно благодарен.
← →
AlexGreg (2002-06-24 14:14) [9]P.S.:
AlexGrag мой новый ник после Q79
Страницы: 1 вся ветка
Текущий архив: 2002.07.04;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.004 c