Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Вниз

Автозаполнение в поле 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-9916
nitro313
2002-06-23 10:17
2002.07.04
Народ, подскажите, как скопировать данные из списка в ...


1-9905
Mashinist
2002-06-16 23:31
2002.07.04
Как заставить форму стоять позади всех окон ?


1-9813
jenbbond
2002-06-24 10:20
2002.07.04
FreeReport


3-9711
PTE
2002-06-10 09:02
2002.07.04
Помогите с Insert разобраться


3-9726
Oleg_er
2002-06-11 15:09
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский