Hast wahrscheinlich schon selbst gelöst, aber ich habe so Just4Fun ein Beispiel geprogt. Vielleicht interessiert es mal einen.
Beispiel ist nicht perfekt, kann man besser machen, ich hoffe ohne Fehler. Nicht wundern über Teile des Beispiels, einige Funktionen habe ich aus einem anderen Projekt genommen, vor allem die Daten für Beispiel.
Delphi-Quellcode:
type
TInfo = class
ID: Integer;
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);
var
sl: TStringList;
i: Integer;
NewColumn: TListColumn;
ListItem: TListItem;
Info: TInfo;
begin
with ListView1 do
begin
ViewStyle := vsReport;
//Erstellt Spalten
NewColumn := Columns.Add;
NewColumn.Caption := 'Name';
NewColumn := Columns.Add;
NewColumn.Caption := 'Ort';
NewColumn := Columns.Add;
NewColumn.Caption := 'Freunde';
{Beispieldaten. Letzter Wert ist eine ID}
sl := TStringList.Create;
try
//Beispieldaten in TStringList
sl.Add('Anna, Köln, 1 Gemeinsame Freunde, 0');
sl.Add('Kristina, München, 1 Gemeinsame Freunde, 1');
sl.Add('Sonja, Berlin,,2');
sl.Add('Petra, Frankfurt, 1 Gemeinsame Freunde, 3');
sl.Add('Berbel, Lübeck,, 4');
for i := 0 to sl.Count - 1 do
begin
//Daten an ListView übergeben
ListItem := Items.Add;
ListItem.Caption := ExtractSubStr(sl[i], 1);
ListItem.SubItems.Add(ExtractSubStr(sl[i], 2));
ListItem.SubItems.Add(ExtractSubStr(sl[i], 3));
//Info 4 an die TInfo Klasse
Info := TInfo.Create;
Info.ID := StrToIntDef(ExtractSubStr(sl[i], 4), -1);
//Objekt an Item Data übergeben
ListItem.Data := Info;
end;
finally
sl.Free;
end;
end;
end;
procedure TForm1.ListView1Click(Sender: TObject);
var
Info: TInfo;
begin
with ListView1 do
begin
if ItemIndex < 0 then Exit;
Info := TInfo(Selected.Data);
ShowMessage(IntToStr(Info.ID));
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
Info: TInfo;
i: Integer;
begin
with ListView1 do
begin
for i := 0 to Items.Count - 1 do
begin
//Diese Funktion gibt die Objekte wieder frei.
//Beim löschen eines Items müß immer vorher das Objekt freigegeben werden
Info := TInfo(Items[i].Data);
Info.Free;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Info: TInfo;
i: Integer;
begin
with ListView1 do
begin
if ItemIndex < 0 then Exit;
if Selected = nil then Exit;
//Beim löschen eines Items vorher Objekt freigeben
Info := TInfo(Selected.Data);
Info.Free;
Selected.Delete;
end;
end;
TInfo ist eine simple Klasse die die ID beinhaltet, mehr nicht. Wichtig ist vor allem, dass nicht mehr direkt gelöscht wird, sondern vorher immer zuerst das Object des Items freigegeben wird.