Главная страница
    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.46 MB
Время: 0.004 c
4-10045
yastal
2002-05-06 14:50
2002.07.04
Как скрыть все иконки на рабочем столе, все без исключения?


14-9977
Val
2002-06-03 13:37
2002.07.04
список в C/C++


1-9791
Blacgrin
2002-06-23 22:55
2002.07.04
переменые+процедры


3-9691
Натик
2002-06-10 11:53
2002.07.04
Преобразование данных


1-9776
INCOGNITO
2002-06-23 13:04
2002.07.04
Формирование нового компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский