Hallo,
die Klasse tStrings (welche auch die einträge einer Listbox verwaltet) besitzt die Eigenschaft Objects. Hierbei handelt es sich um ein Array of tObject. Da tObject-Variablen auch nichts anderes als Zeiger sind kannst du diese als Zeiger auf beliebige Datenstrukturen "missbrauchen". Jeder Array Eintrag gehört zum ensprechenden Listeneintrag.
Du erzeugst also einen Record sowie einen Pointer-Typ auf diesen:
Quelltext
1: 2: 3: 4: 5: 6:
| tData = RECORD Wert : Integer; Datum : tDateTime END;
pData = ^tData; |
Um Daten anzuhängen erzeugst du Dynamisch Speicher und füllst diese Daten ein, in diesem Beispiel sind dies der Index in der Liste sowie der Aktuelle Zeitpunkt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); VAR tmp : pData; begin new(tmp) ; // Speicher für die Daten reservieren tmp^.Wert := ListBox1.Items.Count; tmp^.Datum := now; ListBox1.Items.AddObject(TimeToStr(tmp^.Datum), tObject(tmp)); end; |
Wie du siehst muss man behaupten, das tmp vom Typ tObjekt ist. Das fürhrt zu fehlern wenn du versuchst tatasächlich ein Object an dieser Stelle anzusprechen. Das hast du aber nicht vor, und du weisst ja, das du da kein Objekt angehängt hast. Also Typecastest du das Ganze wieder beim auslesen (hier wenn mann doppelt auf einen Listeneintrag clickt):
Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.ListBox1DblClick(Sender: TObject); begin Label1.Caption := IntToStr(pData(ListBox1.Items.Objects[ListBox1.ItemIndex])^.Wert); Label2.Caption := FormatDateTime('c', pData(ListBox1.Items.Objects[ListBox1.ItemIndex])^.Datum); end; |
Da du den speicher Dynamisch reserviert hast, musst du ihn auch selber wieder Freigeben. Diese Funktion puttzt alle angehängten Datentypen weg:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormDestroy(Sender: TObject); VAR i : Integer; begin FOR i := Listbox1.Items.Count - 1 DOWNTO 0 DO Dispose(pData(Listbox1.Items.Objects[i])); end; |
Gruß
Klabautermann
PS: Da holt man nur mal weiter aus und schon sind andere schneller

.