![]() |
In ListView suchen
Hallo!
Ich habe ein ListView mit 5 Spalten. Ich möchte nach einem String/bzw. Teilstring suchen. Jedoch funktioniert es nicht so, wie ich es mir vorgestellt habe:
Delphi-Quellcode:
Hat jemand einen funktionierenden Suchalgorithmus für ein Listview?
var
BackZeile,zeile,spalte:integer; weiter:boolean; ... procedure Suche (SuchString:String; ListView:TListView; Zeile:Integer; Button:TButton); var r,c:integer; gefunden:boolean; begin begin gefunden:=False; if trim(SuchString) <> '' then begin For r:=zeile to ListView.Items.Count-1 do For c:=0 to ListView.Columns.Count-1 do If (AnsiPos(LowerCase(SuchString),LowerCase(ListView.Items.Item[r].SubItems.Strings[c])) <> 0) then begin gefunden:=True; zeile:=r+1; Button.Caption:='Weitersuchen'; BackZeile:=zeile; exit; end; if not gefunden then MessageDlg('" '+SuchString+'" wurde nicht gefunden', mtInformation, [mbOK],0); end else MessageDlg('Das Eingabefeld ist leer', mtInformation, [mbOK],0); end; end; procedure TForm4.Button1Click(Sender: TObject); begin Suche(Esuche.Text,Form1.ListView1,zeile,Button1); zeile:=BackZeile; end; Gruß, dopeline |
Re: In ListView suchen
Erstmal erklär uns bitte was nicht funktioniert so wie du es willst. Ich habe auf den ersten Blick keinen Fehler gefunden.
Zweitens, du suchst nicht in der Caption der einzelnen Items. Dies solltest du hinzufügen, falls es für dich von Relevanz ist. Falls nicht, dann will ich nichts gesagt haben. Greetz alcaeus |
Re: In ListView suchen
Er gibt eine Fehlermeldung aus:
Im Projekt FilmArchiv.exe ist eine Exception der Klasse EStringListError aufgetreten. Meldung: 'Listenindex überschreitet das Maximum (4)'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. Den Suchalgorithmus war ursprünglich eine StringGrid-Suche. Ich dachte mir schon, dass es nict mit einem ListView funktioniert. Es muss doch aber eine Möglichkeit geben, ein Listview zu durchsuchen! Man muss doch das Rad nicht 2x erfinden... Gruß, dopeline |
Re: In ListView suchen
Hai dopeline,
Du solltest schon einmal vermeiden das locale Variablen und globale die selbe Bezeichnung haben ;-)
Delphi-Quellcode:
Aber der Fehler dürfte hier liegen:
var
BackZeile,zeile,spalte:integer; ... procedure Suche (SuchString:String; ListView:TListView; Zeile:Integer; Button:TButton); .. zeile:=r+1; . .
Delphi-Quellcode:
.Columns.Count gibt dir die Anzahl der Spalten zurück (bei 0 beginnend). Du greifst aber "nur" auf die SubItems zu. Also musst Du die erste Spalte auch noch abziehen.
For c:=0 to ListView.Columns.Count-1 do
Delphi-Quellcode:
For c:=0 to ListView.Columns.Count - 2 do
|
Re: In ListView suchen
Ich denke der Fehler liegt in den Subitems
du hast 5 Spalten. und die Werte dafür sind wie folgt verteilt:
Delphi-Quellcode:
du hingegen gehst die SubItems.Strings[] von 0 bis 4 durch. und SubItems.String[4] existiert nicht, ausserdem lässt du dabei die erste Spalte weg.
1. Spalte ==> ListView.Items.Item[r].Caption
2. Spalte ==> ListView.Items.Item[r].SubItems.Strings[0] 3. Spalte ==> ListView.Items.Item[r].SubItems.Strings[1] 4. Spalte ==> ListView.Items.Item[r].SubItems.Strings[2] 5. Spalte ==> ListView.Items.Item[r].SubItems.Strings[3]
Delphi-Quellcode:
Wenn du deinen Sourcecode so änderst müsste es klappen// Spalte 1 durchsuchen If (AnsiPos(LowerCase(SuchString),LowerCase(ListView.Items.Item[r].Caption)) <> 0) ... // Spalten 2-5 durchsuchen For c:=0 to ListView.Items.Item[r].SubItems-1 do ... |
Re: In ListView suchen
Oder um ganz sicher zu gehen:
Delphi-Quellcode:
Weil nicht jede Subitems-Liste unbedingt mit Daten gefüllt sein muss.
For c:=0 ListView.Items.Item[r].SubItems.Count-1 do
EDIT: Ups, schon wieder zu langsam... |
Re: In ListView suchen
Es funktioniert! Vielen Dank! Es lag an der Spalte, die zu viel war... :oops:
Diese Suchfunktion wird auf einem anderen Formular ausgeführt, welches zuvor mit ShowModal aufgerufen wurde. Wenn ein Eintrag gefunden wird, wird er markiert: ListView.items.Item[r].Selected:=True; Allerdings sieht man das nicht, da immer noch das SuchFormular gezeigt wird. Wenn ich dieses jedoch mit Show aufrufe und die suche starte, verschwindet das Suchfenster und in der ListView auf dem Hauptformular wird die entsprechende Zeile markiert. Gibt es eine Möglichkeit, das Suchformular immer im Vordergrund zu halten, auch wenn man auf dem Hauptformular arbeitet? //EDIT Hat sich erledigt: FormStyle:fsStayOnTop Gruß, dopeline :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz