Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Volltextsuche in Listview (https://www.delphipraxis.net/123302-volltextsuche-listview.html)

Larsi 30. Okt 2008 12:25


Volltextsuche in Listview
 
Hi,
ich hatte vor einiger Zeit schonmal das Problem dass ich nicht wusste wie ich in einer Listview suchen kann (samt Subitems). Dank eurer Hilfe habe ich es dann doch aber hingekriegt. Jetzt habe ich wieder das Problem, dass ich in einer Listview suchen will aber nicht nach dem exaktem Text sondern so wie bei Itunes, dass wenn ich den Titel "Hallo" habe, dass dann schon das eingeben von beispielsweise "Ha" den Titel findet. Ich hoffe mein Vorhaben ist einigermaßen zu verstehen. Ich habe mal im Forum gesucht (ja ich kann das :-D ) und habe einen Thread gefunden bei dem es um so ziemlich das gleiche ging doch die einzige Lösung die genannt wurde, war auf das "VirtualTreeview" umzusteigen, welches angeblich so eine Suchfunktion hat. Da ich das aber nur sehr ungern will möchte ich von euch wissen wie man das vielleicht auch mit der Standard Komponente machen kann.

MFG Lars Wiltfang

Die Muhkuh 30. Okt 2008 12:28

Re: Volltextsuche in Listview
 
Wenn Du mit Pos arbeitest, sollte das funktionieren.

littleDave 30. Okt 2008 12:34

Re: Volltextsuche in Listview
 
Also eine einfache Methode ist die Suche mit Delphi-Referenz durchsuchenPos:

Delphi-Quellcode:
// Überprüft, ob in "Item" irgendwo "aText" steht
function ItemHasText(Item: TListItem; const aText: string): boolean;
var i: integer;
begin
  result := True;
  if Pos(AnsiUpperCase(aText), AnsiUpperCase(Item.Caption)) > 0 then
     exit;

  for i:=0 to Item.SubItems.Count-1 do
    if Pos(AnsiUpperCase(aText), AnsiUpperCase(Item.SubItems[i])) > 0 then
      exit;

  result := False;
end;

// Durchsucht "aListView" nach "aText"
function FindItemText(aListView: TListView; const aText: string): TListItem;
var i: integer;
begin
  for i:=0 to aListView.Items.Count-1 do
  begin
    result := aListView.Items[i];
    if ItemHasText(result, aText) then
       exit;
  end;
  result := nil;
end;
Delphi-Quellcode:
// Aufruf:
procedure TForm1.Button1Click(Sender: TObject);
var FoundItem: TListItem;
begin
  FoundItem := FindItemText(ListView1, Edit1.Text);
  if not Assigned(FoundItem) then
     ShowMessage('Text nicht gefunden')
  else
     FoundItem.Selected := True;
end;
Ungetestet, einfach mal so eingegeben

Tyrael Y. 30. Okt 2008 12:34

Re: Volltextsuche in Listview
 
- Leite eine neue Klasse von TListView ab
- in diese neue Klasse fügst du eine zusätzliche TList(TStringList) ein
- in diese zusätzliche Liste fügst du alle Texte ein, die möglich sind
- bei der Suche gehst du diese Liste durch und suchst mit Pos() nach einer Entsprechung
- alle dei dem pos entsprechen fügst du der Listview Liste zur Ansicht hinzu

fettisch

DeddyH 30. Okt 2008 12:35

Re: Volltextsuche in Listview
 
StrUtils und AnsiContainsText/AnsiContainsStr würde den Code noch kürzen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz