Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

как накладывать фильтр на строки Combobox`а нестандартн. маской?   Найти похожие ветки 

 
Максим   (2007-11-20 16:38) [0]

ддень.
стоит задача, набирая в комбобоксе ComboBox часть строки, перезаписывать его строки по набранному значению в середине, конце, начале исходного списка.Т.е. встроенный фильтр с поиском по началу строк не подходит.

Исходный список находится в ComboBox1.items
Вот кусок кода, надеюсь понятный:


//меняем список комбобокса, когда пишем в нем строку фильтра
//не реагируем на нажатия стрелок, ентера, ескейпа и проч.
procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key: Char);
begin
if integer(Key)>32 then
filladress(key);
end;

//начинаем перезаписывать список комбобокса, только если набрали минимум 2 символа,
//это ограничивает результаты фильтра
procedure TForm1.filladress(var Key: Char);
begin
 if length(ComboBox.Text)>1 then begin
 fillComboboxText;
 addadress;
 setDropDown;
 end;
end;

//очищаем список комбобокса
procedure TForm1.fillComboboxText;
begin
//    ComboBox.Items.Clear;
   while ComboBox.Items.Count>0 do
   ComboBox.Items.Delete(0);
end;

//пробегаем исходный стринглист и если строка в нем совпадает частично
//с набранной строкой в комбобоксе, то добавляем ее в комбобокс
procedure TForm1.addadress;
var i:integer;
begin
 ComboBox.Items.BeginUpdate;
   for i:=0 to ComboBox1.Items.Count-1 do begin
   if AnsiContainsText(ComboBox1.Items[i],ComboBox.Text) then
   ComboBox.Items.Add(ComboBox1.Items[i]);
   end;
 ComboBox.Items.EndUpdate;
end;

//раскрываем вниз комбобокс чтобы юзер сразу увидел что он нашел
procedure TForm1.setDropDown;
begin
 if ComboBox.Items.Count>1 then begin
   ComboBox.DroppedDown:=false;
   ComboBox.DroppedDown:=true;
 end;
end;

В принципе код работает.проблема в том, что постоянно меняется ComboBox.Text непонятным образом. Если кто решал подобную задачу, поделитесь плиз опытом.


 
ЮЮ ©   (2007-11-21 03:51) [1]

> В принципе код работает.проблема в том, что постоянно меняется
> ComboBox.Text непонятным образом

 Значит установи порядок. Например, выбирай первый элемент из списка:
 
 ...
 ComboBox.ItemIndex := 0;
 ComboBox.Items.EndUpdate;


 
Максим   (2007-11-21 06:10) [2]


> Значит установи порядок. Например, выбирай первый элемент
> из списка:

нет, это не поможет. видимо дело в том, что
procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key: Char);работает так, что при выходе из нее var Key: Char обязательно присваивается буферу ComboBox.Text, причем добавляется в его начало. При этом если ComboBox.Text был выделен, а так и есть по умолчанию после действий по добавлению строк, то буфер перезаписывается, вот и получается что часть набранной фразы пропадает. Думаю, с этим можно бороться только написав потомка TComboBox и переопределив событие ComboBoxKeyPress. Как думаете?


 
ЮЮ ©   (2007-11-21 08:55) [3]

> procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key:
> Char);работает так, что при выходе из нее var Key: Char
> обязательно присваивается буферу ComboBox.Text, причем добавляется
> в его начало


Коль ты Кеy в обработчике уже взял, то в обраблтчике можещь присвоить Key := #0.
Однако в TForm1.filladress(var Key: Char); надо учесть, что последний символ, переданный в Key, ешё отсутствует в ComboBox.Text и тебе самому придется определить, что же должно было там оказаться


 
Максим   (2007-11-22 08:27) [4]

да ЮЮ, спасибо. получилось боле мене.
не идеально, но работать можно)



Страницы: 1 вся ветка

Текущий архив: 2008.07.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
2-1213686010
webpauk
2008-06-17 11:00
2008.07.20
Найти MDI


2-1213966689
mefodiy
2008-06-20 16:58
2008.07.20
Удаленное подключение к серверу MySQL


8-1181942056
GoRdon_2007
2007-06-16 01:14
2008.07.20
Продолжительность видео/аудио


11-1191573192
Delphuk
2007-10-05 12:33
2008.07.20
чтение/запись в ini файл


15-1212582144
123-ий
2008-06-04 16:22
2008.07.20
Skype