Форум: "Основная";
Текущий архив: 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