Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.014 c
1-9882
kirilll
2002-06-22 04:50
2002.07.04
фаил->буфер


4-10051
Alexandr__
2002-05-03 07:02
2002.07.04
Как послать в сообщении соченание клавиш?


3-9733
Dark Elf
2002-06-11 16:41
2002.07.04
Процедура поиска в ADO


3-9712
Стас
2002-06-07 11:52
2002.07.04
INSERT в Query с параметрами


1-9829
Геннадий Милехин
2002-06-24 17:59
2002.07.04
Как подключить Help по F1 для RXLIB 2.75