(Gast)
n/a Beiträge
|
AW: Suche im ListView
22. Okt 2012, 09: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.
|
|
Zitat
|