Listview durchsuchen

Für Fragen von Einsteigern und Programmieranfängern...
Carina
Beiträge: 13
Registriert: Di 18. Jun 2013, 18:50

Listview durchsuchen

Beitrag von Carina »

Hallo,

wie kann ich denn eine Listview (mit mehreren Spalten) nach einem Begriff durchsuchen den der Benutzer in ein Edit Feld eingegebn hat und anschließend nur die zeile(n) anzeigen lassen in denen der gesuchte begriff vorkommt?

ich habe jetzt schon ewig nach einer Lösung für mein Problem gesucht aber keine gefunden. Vielleicht könnt ihr mir ja weiterhelfen ;)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Listview durchsuchen

Beitrag von Christian »

Code: Alles auswählen

  for i := 0 ListView1.Items.Count-1 do
    begin
      if ListView1.Items[i].Caption = Edit1.Text then break;
      for a := 0 to ListView1.Items[i].SubItems.Count-1 do
        if ListView1.Items[i].SubItems[a]=Edit1.Test then break;
    end;
 
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Carina
Beiträge: 13
Registriert: Di 18. Jun 2013, 18:50

Re: Listview durchsuchen

Beitrag von Carina »

Danke erstmal ;)
Aber kannst du mir sagen was das "break" macht...das hab ich noch nie benutzt vorher.
Und wie kann ich jetzt die Zeilen mit dem gesuchten bzw. gefundenen Wort ausgeben?

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Listview durchsuchen

Beitrag von Achtzig »

Mit break wird die Schleife beendet. Wenn Du anstatt break die Werte beispielsweise in ein Memo einträgst, bekommst Du die Treffer dort angezeigt.

Code: Alles auswählen

for i := 0 ListView1.Items.Count-1 do
  begin
    if ListView1.Items[i].Caption=Edit1.Text then Memo1.Lines.Add(ListView1.Items[i].Caption);
    for a := 0 to ListView1.Items[i].SubItems.Count-1 do
      if ListView1.Items[i].SubItems[a]=Edit1.Text then Memo1.Lines.Add(ListView1.Items[i].SubItems[a]);
  end;
Wenn Du auch Teilzeichenketten berücksichtigen möchtest, kannst Du Pos verwenden:

Code: Alles auswählen

for i := 0 ListView1.Items.Count-1 do
  begin
    if Pos(Edit1.Text,ListView1.Items[i].Caption)>0 then Memo1.Lines.Add(ListView1.Items[i].Caption);
    for a := 0 to ListView1.Items[i].SubItems.Count-1 do
      if Pos(Edit1.Text,ListView1.Items[i].SubItems[a])>0 then Memo1.Lines.Add(ListView1.Items[i].SubItems[a]);
  end;

Carina
Beiträge: 13
Registriert: Di 18. Jun 2013, 18:50

Re: Listview durchsuchen

Beitrag von Carina »

mein code sieht jetzt folgendermaßen aus

Code: Alles auswählen

procedureTForm_Meine_Buechersammlung.Btn_durchsuchenClick(Sender: TObject);
 
var e: integer;
    a: integer;
 
begin
 
for e := 0 to ListView_Buchuebersicht.Items.Count-1 do     
    begin
      if ListView_Buchuebersicht.Items[e].Caption = Edt_Suchen.Text
         then Form_gefunden.Memo_gefunden.lines.add(Listview_Buchuebersicht.items[e].caption);
 
for a := 0 to ListView_Buchuebersicht.Items[e].SubItems.Count-1 do  
      if ListView_Buchuebersicht.Items[e].SubItems[a]=Edt_Suchen.Text
         then Form_gefunden.Memo_gefunden.lines.add(Listview_Buchuebersicht.items[e].SubItems[a]);
    end;
Form_gefunden.show;
 
 end;  

aber es passiert i.wie gar nichts...es kommt keine fehlermeldung aber wenn ich auf den btn klicke passiert nichts :(
Zuletzt geändert von Lori am So 23. Jun 2013, 12:22, insgesamt 1-mal geändert.
Grund: Highlighter

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Listview durchsuchen

Beitrag von DonMigos »

Hast du beim Suchwort (im Editfeld) auch Groß- und Kleinschreibung beachtet ?
Bei mir funktioniert der Code von Achtzig.

Carina
Beiträge: 13
Registriert: Di 18. Jun 2013, 18:50

Re: Listview durchsuchen

Beitrag von Carina »

ich weiß auch nicht was da schief gelaufen ist...aufeinmal funktionierts...nur krieg ich jetzt nich hin dass die komplette zeile in der das wort gefunden wurde in der memo angezeigt wird sondern nur das wort selbst -.-

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Listview durchsuchen

Beitrag von MmVisual »

Ist ja klar, mache in der 2. FOR Schleife das If...Then weg.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Listview durchsuchen

Beitrag von Achtzig »

Wenn das zweite if...then weg ist, werden aber alle Untereinträge im Memo aufgenommen.

Bei dem Quelltext von Carina dürften aber auch nur Einträge gefunden werden, die NUR das gesuchte Wort enthalten. Beim Vergleich mit = müssen beide Seiten exakt gleich sein, um gefunden zu werden. Deswegen sollte besser die Pos-Version genommen werden.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Listview durchsuchen

Beitrag von Christian »

@Carina, du kannst einfach einen Breakpoint setzen (klick vor die Zeile) und das Programm dort anhalten und mit der maus über die Variablen halten um zu schaun was drin steht.
Du solltest vllt auch mal ein Tutorial zum programmieren mit Delphi lesen. Der Code den ich gepostet hab hatte keinen Anspruch darauf dein Problem komplett und auf dein Programm angepasst zu lösen, sondern sollte dir zeigen wies geht. Anpassen und herausfinden wie das funktioniert solltest dus selbst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Listview durchsuchen

Beitrag von DonMigos »

Der Code von Achtzig mit Pos ist hier eigentlich das Richtige für das Problem, man könnte ihn noch anpassen, um ihn case insensitive (also unabhängig von Groß- und Kleinschreibung) zu machen. So z.B. :

Code: Alles auswählen

 
uses {...,} LazUTF8;
 
procedure BibSuche(pSuchWort: TCaption; pSucheIn: TListView; pErgebnisse: TStrings; pCaseSens: Boolean = False);
var
  i,a: Integer;
  SuchWort: String;
begin
  if not pCaseSens then  //Suche die Groß- und Kleinschreibung nicht beachtet 
  begin
    SuchWort := UTF8UpperCase( pSuchWort );
    for i := 0 to pSucheIn.Items.Count-1 do
    begin
      if Pos(SuchWort,UTF8UpperCase(pSucheIn.Items[i].Caption))>0 then pErgebnisse.Add(pSucheIn.Items[i].Caption);
      for a := 0 to pSucheIn.Items[i].SubItems.Count-1 do
        if Pos(SuchWort,UTF8UpperCase(pSucheIn.Items[i].SubItems[a]))>0 then 
          pErgebnisse.Add(pSucheIn.Items[i].SubItems[a]);
    end;
  end
  else  //Suche die Groß- und Kleinschreibung beachtet 
  begin
    SuchWort := pSuchWort;
    for i := 0 to pSucheIn.Items.Count-1 do
    begin
      if Pos(SuchWort,pSucheIn.Items[i].Caption)>0 then pErgebnisse.Add(pSucheIn.Items[i].Caption);
      for a := 0 to pSucheIn.Items[i].SubItems.Count-1 do
        if Pos(SuchWort,pSucheIn.Items[i].SubItems[a])>0 then pErgebnisse.Add(pSucheIn.Items[i].SubItems[a]);
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject); // Aufruf der Prozedur über einen Button
begin
  BibSuche(Edt_Suchen.Text,ListView_Buchuebersicht,Form_gefunden.Memo_gefunden.lines); //-> Case Insensitive 
  Form_gefunden.Memo_gefunden.lines.Add('');
  BibSuche(Edt_Suchen.Text,ListView_Buchuebersicht,Form_gefunden.Memo_gefunden.lines,True); // -> Case Sensitive
end;   
 
[Edit] UpperCase durch UTF8UpperCase ersetzt

Weiter könnte man die Suche auf ganze Worte einschränken...
Mfg
Zuletzt geändert von DonMigos am Sa 22. Jun 2013, 17:40, insgesamt 4-mal geändert.

Carina
Beiträge: 13
Registriert: Di 18. Jun 2013, 18:50

Re: Listview durchsuchen

Beitrag von Carina »

Dankeschön ;)
@Christian: Ja hab ich schon gemacht, aber für mich ist eine Listview nicht so leicht zu durchschauen wenn man vorher noch nie damit gearbeitet hat...sorry :(

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Listview durchsuchen

Beitrag von DonMigos »

Der Vorschlag von Christian mit dem Debugger ist auf jedenfall nicht schlecht, wenn es immer noch nicht klappt. Vielleicht geht ja irgendwas mit der Übernahme aus dem Edit Feld schief, das sieht man dann. Bei Umlauten kann es eventuell Probleme geben und man braucht dann eine Dekodierung von UTF8 in ein anderes String-Format. Bei mir klappt es jedenfalls wie oben ohne Umkodierung.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Listview durchsuchen

Beitrag von theo »

Für die case-insensitive Variante muss man
UTF8UpperCase aus unit LCLProc
verwenden, sonst klappt das nicht ganz mit Umlauten.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Listview durchsuchen

Beitrag von DonMigos »

theo hat geschrieben:Für die case-insensitive Variante muss man
UTF8UpperCase aus unit LCLProc
verwenden, sonst klappt das nicht ganz mit Umlauten.
Ja stimmt man sollte UpperCase mit UTF8UpperCase ersetzen ! Dann klappt es auch ohne Probleme mit den Umlauten. Dazu muss man noch unter Uses den Eintrag LazUTF8 machen (nicht LCLProc, weil das laut Hilfe veraltet ist).

Antworten