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

Вниз

как накладывать фильтр на строки 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.045 c
2-1213697997
Beluy
2008-06-17 14:19
2008.07.20
Quick Report For Delphi


4-1192524467
skywriter
2007-10-16 12:47
2008.07.20
Более одной камера через Video For Windows API


15-1212355196
panov
2008-06-02 01:19
2008.07.20
Автоматическая регистрилка


2-1213960748
DFT
2008-06-20 15:19
2008.07.20
изменение размеров родителя


2-1213942409
TUserClass
2008-06-20 10:13
2008.07.20
Путь к своей DLL ...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский