Was ich gerne wissen würde ist wie man die Objekte verwaltet. Hier ein Beispiel. Man braucht dafür ein leeres Formular, eine ListBox und ein Button.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| type TTest = class sText: String; end;
procedure TForm1.Button1Click(Sender: TObject); var Test: TTest; begin Test := TTest.Create; try Test.sText := DateTimeToStr(Now); ListBox1.Items.AddObject('TestText', TObject(Test)); finally end; end;
procedure TForm1.ListBox1DblClick(Sender: TObject); var Test: TTest; begin with ListBox1 do begin if (Items.Count = 0) or (ItemIndex < 0) then Exit;
Test := TTest.Create; try Test := TTest(Items.Objects[ItemIndex]); ShowMessage(Test.sText); finally Test.Free; end; end; end; |
Alles hier funktioniert ohne Fehler und doch ist der Code nicht richtig.
AddObject speichert nicht das
Objekt selbst, sondern nur den
Zeiger drauf. Würde ich
Button1Click den
TTest in
finally wieder freigeben, so würde ich auch das Objekt wieder freigeben. Also wird er nicht freigegeben und ich kann in der
ListBox1DblClick Prozedur auf das Objekt zugreifen.
Meine Frage ist wie ich die Objekte später wieder freigeben kann. Hin und wieder passiert es schon mal, dass man einen der Listboxeinträge nicht brauch oder einfach die
Listbox.Items komplett löscht. In diesem Fall bleiben die Objekte im Speicher. Nur bitte keine Empfehlungen es mit
Arrays zu machen. Wenn ich es so kompliziert machen muss, dann kann ich es mir auch mit den
AddObject ganz sparen. Was ich also nicht brauchen kann ist eine Verwaltung der Objekte, aber ich will zu jedem
ListBox Eintrag ein Objekt hinzufügen. Nur muss es doch möglich sein mit dem Löschen eines Items auch den dazugehörigen Objekt zu löschen, ohne gleiche eine Objektverwaltung zu machen. Dafür mache ich es mit AddObject, damit ich keine zwei Sachen parallel machen muss.
Ich hoffe auf paar Ideeen.