Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Fragen zur TStringList.AddObject und Objekten
bms - Mi 14.01.04 16:50
Titel: Fragen zur TStringList.AddObject und Objekten
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.
Delphi-Quelltext
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.
Keldorn - Mi 14.01.04 17:24
Hallo,
so wie du das machst geht das nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Test := TTest.Create; try Test := TTest(Items.Objects[ItemIndex]); ShowMessage(Test.sText); finally Test.Free; end; |
1) Test:= ein anderes objekt
hier kopierst du nicht, du biegst einfach den Zeiger um (kopieren wäre test.assign(ein anderes objekt) hier brauchst du dann auch ein create und free). das hat zwei Folgen:
1. dein erzeugtest Test-objekt kannst du nicht mehr freigeben und schaffst dir hier ein Speicherleck
2. wenn du jetzt test.free machst, gibts du nicht dein in der dblclick proc erzeugtes test frei, sondern das bei den items verknüpfte. ein weiterer dblKlick auf das gleiche Item wird dir dann eine Zugriffsverletzung bringen.
hier langt, wenn du schreibst (ohne das erzeugen etc.), aber evtl wäre ein typprüfung sinnvoll (if Items.Objects[ItemIndex] is TTest then ...)
Delphi-Quelltext
1: 2:
| Test := TTest(Items.Objects[ItemIndex]); ShowMessage(Test.sText); |
| Zitat: |
Meine Frage ist wie ich die Objekte später wieder freigeben kann
|
Eine Tobjectlist macht das automatisch, wenn du beim erstellen true übergibst. Bei Listboxen etc ist dies nicht so. Ich habe jetzt hier nur D5, ich weiß nicht, wie sich höhere Versionen verhalten. aber du kannst bei dem einzelnem löschen erst dein objekt und dann das eigentliche item löschen. und für die gesamte Listbox kannst du dann im ondestroy der form deine Objekte wieder freigeben.
Du kannst auch mal im Forum hier oder auf der DP suchen, irgendwo hat Luckie da auch mal ein größeres Codebeispiel dazu gemacht.
Mfg Frank
Moderiert von
Motzi: Code- durch Delphi-Tags ersetzt
bms - Do 15.01.04 20:00
Danke für den Hinweis. Ich arbeite zu selten mit Delphi und hab die Kleinigkeit übersehen. Allerdings ist somit auch das Problem mit dem Löschen des Objekts beseitigt. Wenn ich durch das Zuweisen eines Objekts zum Anderen den Zeiger kopiere, so kriege ich das Objekt aus Button1Click wieder gelöscht. Hab schon ausprobiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!