Denkbar wäre auch eine eigene kleine Klasse mit 2 String-Feldern, deren Instanzen man in einer TObjectList verwaltet. Über diese Liste iteriert man und fügt jede Instanz der ListBox hinzu. Im OnCick oder sonstwo kann man dann auf die gespeicherte Referenz zugreifen und den dahinterliegenden Wert abfragen. Kleines Beispiel (ohne Generics, da Delphi 5 angegeben), zuerst die simple Klasse:
Delphi-Quellcode:
type
TWuppdi = class
public
// Ich habe hier bewusst auf Properties verzichtet
DisplayString: string;
IDString: string;
constructor Create(const ADisplay, AID: string);
end;
...
{ TWuppdi }
constructor TWuppdi.Create(const ADisplay, AID: string);
begin
inherited Create;
DisplayString := ADisplay;
IDString := AID;
end;
Und jetzt das Formular mit der ListBox:
Delphi-Quellcode:
type
TfrmDemo = class(TForm)
lbWuppdis: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lbWuppdisClick(Sender: TObject);
private
{ Private-Deklarationen }
FWuppdis: TObjectList; // aus Contnrs
procedure CreateWuppdis;
procedure DisplayWuppdis;
public
{ Public-Deklarationen }
end;
...
procedure TfrmDemo.CreateWuppdis;
var
i: integer;
begin
FWuppdis.Clear;
for i := 1 to 10 do
FWuppdis.Add(TWuppdi.Create(Format('Display %d', [i]),
Format('ID %d', [i])));
end;
procedure TfrmDemo.DisplayWuppdis;
var
i: integer;
lWuppdi: TWuppdi;
begin
lbWuppdis.Items.BeginUpdate;
try
lbWuppdis.Clear;
for i := 0 to FWuppdis.Count - 1 do
begin
lWuppdi := FWuppdis[i] as TWuppdi;
lbWuppdis.Items.AddObject(lWuppdi.DisplayString, lWuppdi);
end;
finally
lbWuppdis.Items.EndUpdate;
end;
end;
procedure TfrmDemo.FormCreate(Sender: TObject);
begin
FWuppdis := TObjectList.Create;
CreateWuppdis;
DisplayWuppdis;
end;
procedure TfrmDemo.FormDestroy(Sender: TObject);
begin
FWuppdis.Free;
end;
procedure TfrmDemo.lbWuppdisClick(Sender: TObject);
var
lWuppdi: TWuppdi;
begin
if lbWuppdis.ItemIndex > -1 then
begin
lWuppdi := lbWuppdis.Items.Objects[lbWuppdis.ItemIndex] as TWuppdi;
ShowMessage(lWuppdi.IDString);
end;
end;