![]() |
Suchen in einer Liste
moin moin...
ich wollte mal wissen, wie z.B. Winamp die Suchfunktion ermöglicht!? Also ich habe eine Liste (voll mit irgendwelchen Daten) und gebe jetzt ein Buchstabe ein und nun wird geprüft, ob dieser Buchstabe in dem ersten,zweiten,dritten... Listeneintrag vorkommt. Also genau wie bei Winamp die Liedersuche... Hoffe ihr habt da eine Lösung!? MFG Alex |
Re: Suchen in einer Liste
Hi Alex,
wenn du z.B. eine ListView hast, dann könnte der Code so aussehen:
Delphi-Quellcode:
Im array "a" befinden sich anschließend die Indizes aller Elemente, auf die die Suchkriterien zutreffen. Gesucht wird in der Caption und in den einzelnen SubItems.
procedure FindStringInListView(Str: String; var a: array of Integer);
var bFound: Boolean; i, iFound, j: Integer; begin iFound := 0; SetLength(a, ListView1.Items.Count); for i := 0 to ListView1.Items.Count-1 do begin bFound := Pos(Str, ListView1.Items[i].Caption) > 0; j := 0; while (j < ListView1.Items[i].Subitems.Count) and not bFound do begin bFound := Pos(Str, ListView1.Items[i].Subitems[j]) > 0; Inc(j); end; if bFound then begin Inc(iFound); a[iFound-1] := i; end; end; SetLength(a, iFound); end; Greetz alcaeus |
Re: Suchen in einer Liste
ich hab in winamp die suche zwar noch nie benutzt, aber einträge in einer liste suchen funktioniert mittels
Delphi-Quellcode:
eigentlich ganz gut.
IndexOf()
|
Re: Suchen in einer Liste
Moin alcaeus...
danke für den source. Ich verwende allerdings eine ListBox in der viele Daten stehen.Aber ich denke, das ich dein Source dahingehend anpassen kann (hoff ich *g*) Danke auch an Sebastian! MFG Alex |
Re: Suchen in einer Liste
Hi Alex,
so sieht der Code für eine ListBox aus. Ich habe ihn auch dahingehend erweitert, dass nicht nur nach dem Vorkommen des Strings gesucht wird. Ist iFlag 0, so werden alle Datensätze zurückgeliefert, welche den String Str enthalten. Ist es jedoch ungleich 0, so werden nur Datensätze zurückgeliefert, welche mit Str beginnen.
Delphi-Quellcode:
Greetz
procedure FindStringInListBox(Str: String; var a: array of Integer; iFlag: Integer);
var bFound: Boolean; i, iFound: Integer; begin iFound := 0; SetLength(a, ListBox1.Count); for i := 0 to ListBox1.Count-1 do begin if iFlag = 0 then bFound := Pos(Str, ListBox1.Items[i]) > 0 else bFound := Copy(ListBox1.Items[i], 1, Length(Str)) = Str; if bFound then begin Inc(iFound); a[iFound-1] := i; end; end; SetLength(a, iFound); end; alcaeus |
Re: Suchen in einer Liste
Danke schön!!!
Hat mir sehr weitergeholfen :dp: MFG Alex |
Re: Suchen in einer Liste
hi alcaeus,
ich habe folgendes Problem: an der Stelle mit dem SetLength meckert der Compiler immer: Inkompatible Typen SetLength(a, Liste.Count); ... SetLength(a, iFound); woran liegt das? MFg Alex |
Re: Suchen in einer Liste
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe das Problem mal in einem kleinen Beispielprog dargstellt...
Ich hoffe ihr könnt mir irgendwie helfen. Versucht einfach mal F9 zu drücken... MFG Alex |
Re: Suchen in einer Liste
Hi Alex,
du musst den folgenden Typen deklarieren:
Delphi-Quellcode:
Den Header musst du dann noch ändern in
type TIntArray = array of Integer;
Delphi-Quellcode:
Und vor dem Ende der Funktion fügst du noch ein:
function FindStringInListBox(Str: String; var a: TIntArray; iFlag: Integer): Integer;
Delphi-Quellcode:
Anscheinend wird ein als array übergebener Parameter nicht als dynamisches Array behandelt. Mit dem Umweg über den Typ funktioniert es aber. Und die Funktion gibt jetzt auch noch die Anzahl der gefundenen Einträge zurück, so dass diese nicht immer über Length(a) herausgefunden werden muss.
Result := iFound;
Greetz alcaeus |
Re: Suchen in einer Liste
Liste der Anhänge anzeigen (Anzahl: 1)
moin alcaeus,
ich bin entweder zu blöd (das hoffe ich mal nicht *g*) oder das Programm geht einfach nicht. habe deine Änderungen reingebaut aber ich bekomme in diesem beispiel (siehe anhang) nicht das gewünschte ergebnis... Kannst du mir mal helfen? MFG Alex |
Re: Suchen in einer Liste
So schreibt er die gefundenen Indexe in Edit2:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Item : TIntArray; i : integer; begin Edit1.Text := IntToStr(FindStringInListBox(Edit3.Text, Item, 0)); If (length(item) > 0) then Edit2.Text := IntToStr(item[0]) else Edit2.Text := ''; for i := 1 to length(item)-1 do Edit2.Text := Edit2.Text + ', ' + IntToStr(item[i]); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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