[Delphi] Поиск в ListView, хелп ми

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by HyperOne, 2 May 2013.

  1. HyperOne

    HyperOne New Member

    Joined:
    23 Nov 2010
    Messages:
    44
    Likes Received:
    4
    Reputations:
    3
    Есть ListView, в нем 4 столбца.
    Как сделать так, чтобы при вводе в Edit1 например "Вася", происходил поиск по 3-му столбцу и в ListView оставались только те записи, где присутствует это слово.
    Гуглил, ничего толкового не нашел.. Может есть у кого примерчик?
     
    #1 HyperOne, 2 May 2013
    Last edited: 2 May 2013
  2. Diamantx

    Diamantx New Member

    Joined:
    17 Feb 2012
    Messages:
    64
    Likes Received:
    1
    Reputations:
    0
    Используй цикл, в котором сравниваешь текст в Edit и текст в ячейке ListView
     
  3. HyperOne

    HyperOne New Member

    Joined:
    23 Nov 2010
    Messages:
    44
    Likes Received:
    4
    Reputations:
    3
    Нашел процедуру, которая выделяет в списке найденные элементы:




    Возникли вопросы:

    1. При поиске например слова "Вася", процедура выделяет строку где есть только это слово. Т.е. если строка имеет текст "Вася Пупкин", то процедура эту строку не находит... Как исправить?

    2. Как переделать эту процедуру, чтобы в ListVIew строки НЕ ВЫДЕЛЯЛИСЬ, а ОСТАВАЛИСЬ. Т.е. если найдено - в ListView остаются только найденные элементы.

    ???
     
  4. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    Функция AnsiCompareText сравнивает на равенство. А тебе нужно определить, входит ли в первый аргумент второй.
     
  5. HyperOne

    HyperOne New Member

    Joined:
    23 Nov 2010
    Messages:
    44
    Likes Received:
    4
    Reputations:
    3

    Да, это понятно.. А как это сделать ))
     
  6. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    ну хз. мб стандартная функция pos поможет?
     
  7. HyperOne

    HyperOne New Member

    Joined:
    23 Nov 2010
    Messages:
    44
    Likes Received:
    4
    Reputations:
    3
    нет. в ListView есть стандартная ф-ция поиска:

    Code:
    function FindCaption(StartIndex: Integer; Value: string;
     Partial, Inclusive, Wrap: Boolean): TListItem; 
    

    Вот пример ее использования:

    Code:
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    lvItem: TListItem;
    begin
    lvItem := ListView1.FindCaption(2, // StartIndex: Integer;
    Edit1.Text, // Search string: string;
    True, // Partial,
    True, // Inclusive
    False); // Wrap : boolean;
    if lvItem <> nil then
    begin
    ListView1.Selected := lvItem;
    lvItem.MakeVisible(True);
    ListView1.SetFocus;
    end;
    end; 
    

    Только не пойму, не работает она почему-то (хотя брал из оф.источника).. Как ее переделать так чтобы чтобы поиск (по вхождению) был по второму столбцу и если найдено - в ListView оставались только найденные элементы???
     
    #7 HyperOne, 3 May 2013
    Last edited: 3 May 2013
  8. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    а смысл этой функции, что ты написал последней, если я тебе написал как переделать предыдущую функцию
     
  9. HyperOne

    HyperOne New Member

    Joined:
    23 Nov 2010
    Messages:
    44
    Likes Received:
    4
    Reputations:
    3

    Я думаю через стандартную функцию поиска в ListView было бы быстрее, чем через pos. Всё таки в ListView у меня не пару строчек текста.
     
  10. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    быстрее это писать на асме. встроенную функцию здесь прикрутить врятли удастся.