Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Suche im ListView (https://www.delphipraxis.net/171126-suche-im-listview.html)

EvoX 22. Okt 2012 06:58

Suche im ListView
 
Hey Leute,
ich habe ein Programm geschrieben wofür ich eine Suchenfunktion noch brauch. Ich benutze zur Auflistung eine ListView Element. Könnt mir bei der Umsetzung helfen, wäre nett.

MFG EvoX

Popov 22. Okt 2012 07:06

AW: Suche im ListView
 
Guck dir mal das Tutorial auf dieser Seite an: http://users.iafrica.com/d/da/dart/z.../TreeView.html

DeddyH 22. Okt 2012 07:29

AW: Suche im ListView
 
ListView <> TreeView. Ich nehme mal an, ViewStyle ist auf vsReport gestellt, richtig? In dem Fall könnte man einfach über die Items iterieren und vergleichen (für die erste Spalte), für Folgespalten dann über die SubItems, wobei die zweite Spalte SubItems[0] entspricht.

mkinzler 22. Okt 2012 07:33

AW: Suche im ListView
 
Aber im Allgemeinen sollte man Anzeigekomponenten nicht als Datenspeicher missbrauchen.

EvoX 22. Okt 2012 07:34

AW: Suche im ListView
 
ja genau so habe ich das gemacht. ah okay wusste ich nciht das man das so machen werde ich mal ausprobieren

jaenicke 22. Okt 2012 07:35

AW: Suche im ListView
 
Das einfachste wäre eine TVirtualStringTree zu benutzen. Dann kannst du unpassende Einträge schlicht unsichtbar machen.

DeddyH 22. Okt 2012 08:01

AW: Suche im ListView
 
Zitat:

Zitat von mkinzler (Beitrag 1187861)
Aber im Allgemeinen sollte man Anzeigekomponenten nicht als Datenspeicher missbrauchen.

Vollkommen richtig, aber ich wollte es jetzt nicht zu "kompliziert" machen. Um das trotzdem etwas auszuführen: man könnte sich einen Record oder eine Klasse deklarieren samt einer entsprechenden Liste. Den jeweiligen Listeneintrag legt man dann in der Data-Eigenschaft des ListItems ab. Somit ist man in der Lage, die Logik (also die Liste) von der Darstellung (der ListView) zu trennen. Außerdem kann man damit die Darstellung einer ListView beschleunigen, indem man sie in den virtuellen Modus setzt und einen Handler für das OnData-Ereignis schreibt.

Popov 22. Okt 2012 08:26

AW: Suche im ListView
 
Evtl. gibt es bessere Methoden, aber hier etwas auf die Schnelle mit Suche in Objekten. Die Infos liegen in Objekten die an Data hängen, Caption & Co dienen nur der Anzeige.

Delphi-Quellcode:
type
  TInfo = class
    Name: String;
    Ort: String;
  end;

  {Gibt den X-ten Teilstring eines mit Kommas getrennten Daten-Strings}
function ExtractSubStr(Str: String; Index: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Index < 1 then Exit;
  Str := Str + ',';
  for i := 1 to Index - 1 do Delete(Str, 1, Pos(',', Str));
  Result := Trim(Copy(Str, 1, Pos(',', Str) - 1));
end;

procedure TForm1.FormCreate(Sender: TObject);

  procedure SetInfo(s: String; var Info: TInfo);
  begin
    Info := TInfo.Create;
    Info.Name := ExtractSubStr(s, 1);
    Info.Ort := ExtractSubStr(s, 2);
  end;

var
  Info: TInfo;
  MyColumn: TListColumn;
  MyItem: TListItem;
  i: Integer;
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;

    MyColumn := Columns.Add;
    MyColumn.Caption := 'Name';
    MyColumn := Columns.Add;
    MyColumn.Caption := 'Ort';

    //Zuerst für Beispiel mit Daten füllen, hier jedoch nur Daten-Objekt in Data
    SetInfo('Anna, Köln', Info);
    MyItem := Items.Add;
    MyItem.Data := Info;

    SetInfo('Kristina, München', Info);
    MyItem := Items.Add;
    MyItem.Data := Info;

    SetInfo('Sonja, Berlin', Info);
    MyItem := Items.Add;
    MyItem.Data := Info;

    SetInfo('Petra, Frankfurt', Info);
    MyItem := Items.Add;
    MyItem.Data := Info;

    SetInfo('Berbel, Lübeck', Info);
    MyItem := Items.Add;
    MyItem.Data := Info;

    //Daten aus Info in Caption und SubItems übertragen
    for i := 0 to ListView1.Items.Count - 1 do
    begin
      Info := TInfo(Items[i].Data);
      Items[i].Caption := Info.Name;
      Items[i].SubItems.Add(Info.Ort);
    end;
  end;
end;

//suchen im Daten-Objekt
procedure TForm1.Button1Click(Sender: TObject);
var
  Info: TInfo;
  s: String;
  i: Integer;
begin
  s := InputBox('Eingabe', 'Namen eingeben', '');

  with ListView1 do
  begin
    for i := 0 to ListView1.Items.Count - 1 do
    begin
      Info := TInfo(Items[i].Data);
      if SameText(Info.Name, s) then
        ShowMessage('Namen gefunden im Item: ' + IntToStr(i));
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  with ListView1 do
    for i := 0 to Items.Count - 1 do
      TInfo(Items[i].Data).Free;
end;
Und nein, ich hab mir jetzt nicht die große Mühe gemacht. Den Code habe ich in Form (mit leichten Anpassungen) in der letzten Woche schon zwei mal gepostet.

DeddyH 22. Okt 2012 08:39

AW: Suche im ListView
 
Zitat:

Zitat von Popov (Beitrag 1187868)
Den Code habe ich in Form (mit leichten Anpassungen) in der letzten Woche schon zwei mal gepostet.

Davon wird er aber auch nicht besser :twisted:

Popov 22. Okt 2012 08:42

AW: Suche im ListView
 
Ne, mach es besser, dann nutze ich deinen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.
Seite 1 von 2  1 2      

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