Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#8

AW: Suche im ListView

  Alt 22. Okt 2012, 08:26
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.
  Mit Zitat antworten Zitat