2013-03-13 3 views
1

Привет, у меня проблема с инкрементным поиском в delphi.Как сделать инкрементный поиск в delphi FM2?

Я смотрел на этой http://delphi.about.com/od/vclusing/a/lb_incremental.htm Но это не работает в FireMonkey, так что я пришел с этим:

for I := 0 to lstbxMapList.Items.Count-1 do 
    begin 
    if lstbxMapList.Items[i] = edtSearch.Text then 
    begin 
     lstbxMapList.ItemByIndex(i).Visible := True; 
    end; 

    if lstbxMapList.Items[I] <> edtSearch.Text then 
    begin 
     lstbxMapList.ItemByIndex(i).Visible := False; 
    end; 
    end; 

Когда я использую этот ListBox просто пустой.

+0

Ах теперь имеет смысл (facepalm). Как я могу реализовать инкрементный тогда? –

ответ

3

Вы скрываете каждый элемент, который точно не соответствует edtSearch.Text. Попробуйте это вместо (проверено в XE3):

// Add StrUtils to your uses clause for `StartsText` 
uses 
    StrUtils; 

procedure TForm1.edtSearchChange(Sender: TObject); 
var 
    i: Integer; 
    NewIndex: Integer; 
begin 
    NewIndex := -1; 
    for i := 0 to lstBxMapList.Items.Count - 1 do 
    if StartsText(Edit1.Text, lstBxMapList.Items[i]) then 
    begin 
     NewIndex := i; 
     Break; 
    end; 
    // Set to matching index if found, or -1 if not 
    lstBxMapList.ItemIndex := NewIndex; 
end; 
+0

Спасибо, что работает хорошо. –

0

Исходя из KENS ответа, если вы хотите, чтобы скрыть элементы, как на ваш вопрос, просто установите Visible свойство, но обратите внимание, что с выражением, если заявление возвращает логическое и Visible - это логическое свойство, которое можно значительно упростить. Обратите также внимание на то, что я также использовал ContainsText, который будет соответствовать строке в любом месте текста элемента:

procedure TForm1.edtSearchChange(Sender: TObject); 
var 
    Item: TListBoxItem; 
begin 
    for Item in lstbxMapList.ListItems do 
    Item.Visible := ContainsText(Item.Text.ToLower, Edit1.Text.ToLower); 
end; 
Смежные вопросы