Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In ListView suchen (https://www.delphipraxis.net/25834-listview-suchen.html)

dopeline 13. Jul 2004 13:10


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:
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;
Hat jemand einen funktionierenden Suchalgorithmus für ein Listview?

Gruß, dopeline

alcaeus 13. Jul 2004 13:34

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

dopeline 13. Jul 2004 14:05

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

Sharky 13. Jul 2004 14:21

Re: In ListView suchen
 
Hai dopeline,

Du solltest schon einmal vermeiden das locale Variablen und globale die selbe Bezeichnung haben ;-)
Delphi-Quellcode:
var
  BackZeile,zeile,spalte:integer;
...
procedure Suche (SuchString:String; ListView:TListView; Zeile:Integer; Button:TButton);
..
          zeile:=r+1;
.
.
Aber der Fehler dürfte hier liegen:
Delphi-Quellcode:
For c:=0 to ListView.Columns.Count-1 do
.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.
Delphi-Quellcode:
For c:=0 to ListView.Columns.Count - 2 do

rantanplan99 13. Jul 2004 14:26

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:
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]
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.

Delphi-Quellcode:

// 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
...
Wenn du deinen Sourcecode so änderst müsste es klappen

scp 13. Jul 2004 14:27

Re: In ListView suchen
 
Oder um ganz sicher zu gehen:
Delphi-Quellcode:
For c:=0 ListView.Items.Item[r].SubItems.Count-1 do
Weil nicht jede Subitems-Liste unbedingt mit Daten gefüllt sein muss.

EDIT: Ups, schon wieder zu langsam...

dopeline 13. Jul 2004 19:17

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 14:15 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