Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Suchen in einer Liste (https://www.delphipraxis.net/31652-suchen-einer-liste.html)

Alex_ITA01 12. Okt 2004 10:36


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

alcaeus 12. Okt 2004 10:42

Re: Suchen in einer Liste
 
Hi Alex,

wenn du z.B. eine ListView hast, dann könnte der Code so aussehen:

Delphi-Quellcode:
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;
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.

Greetz
alcaeus

_Sebastian_ 12. Okt 2004 10:42

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:
IndexOf()
eigentlich ganz gut.

Alex_ITA01 12. Okt 2004 10:51

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

alcaeus 12. Okt 2004 11:44

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:
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;
Greetz
alcaeus

Alex_ITA01 12. Okt 2004 11:46

Re: Suchen in einer Liste
 
Danke schön!!!
Hat mir sehr weitergeholfen
:dp:

MFG Alex

Alex_ITA01 12. Okt 2004 13:09

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

Alex_ITA01 12. Okt 2004 13:45

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

alcaeus 12. Okt 2004 15:29

Re: Suchen in einer Liste
 
Hi Alex,

du musst den folgenden Typen deklarieren:
Delphi-Quellcode:
type TIntArray = array of Integer;
Den Header musst du dann noch ändern in
Delphi-Quellcode:
function FindStringInListBox(Str: String; var a: TIntArray; iFlag: Integer): Integer;
Und vor dem Ende der Funktion fügst du noch ein:
Delphi-Quellcode:
Result := iFound;
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.

Greetz
alcaeus

Alex_ITA01 13. Okt 2004 10:47

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

scp 13. Okt 2004 11:41

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