Конференция "Основная" » как накладывать фильтр на строки Combobox`а нестандартн. маской? [D7, WinXP]
 
  • Максим (20.11.07 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 непонятным образом. Если кто решал подобную задачу, поделитесь плиз опытом.
  • ЮЮ © (21.11.07 03:51) [1]
    > В принципе код работает.проблема в том, что постоянно меняется
    > ComboBox.Text непонятным образом

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

  • Максим (21.11.07 06:10) [2]

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

    нет, это не поможет. видимо дело в том, что
    procedure TForm1.ComboBoxKeyPress(Sender: TObject; var Key: Char);

    работает так, что при выходе из нее var Key: Char обязательно присваивается буферу ComboBox.Text, причем добавляется в его начало. При этом если ComboBox.Text был выделен, а так и есть по умолчанию после действий по добавлению строк, то буфер перезаписывается, вот и получается что часть набранной фразы пропадает. Думаю, с этим можно бороться только написав потомка TComboBox и переопределив событие ComboBoxKeyPress. Как думаете?
  • ЮЮ © (21.11.07 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 и тебе самому придется определить, что же должно было там оказаться
  • Максим (22.11.07 08:27) [4]
    да ЮЮ, спасибо. получилось боле мене.
    не идеально, но работать можно)
 
Конференция "Основная" » как накладывать фильтр на строки Combobox`а нестандартн. маской? [D7, WinXP]
Есть новые Нет новых   [133935   +112][b:0][p:0.002]