Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Ok, Hauptsache es funktioniert. :thumb:
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
:thumb:
Jetzt könntest Du ggf. noch ohne den Callback auskommen.
Du bekommst ja jetzt im destructor mit, dass das Objekt freigegeben wird.
Jetzt könntest Du auch dort PopUpMenu := nil; ausführen.
Ist aber Geschmacksache und würde sofort nicht mehr funktionieren, wenn durch Änderungen am Projekt irgendwann doch noch irgendwo eine Referenz auf das Objekt hängen würde.
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Du darfst das Objekt nicht freigeben, solange noch darauf oder auf seine Schnittstellen zugegriffen werden kann.
Also Du hast z.B.
myObj := TMyObj.Create;
myIntf1 := myObj;
myIntf2 := myObj;
Wenn Du TMyObj von TInterfacedObj ableitest, wird die automatische Referenzzählung unterstützt.
Wenn Du jetzt
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Ok, dann nur mal als Hinweis, falls Du das mal noch versuchen willst:
Du könntest von TInterfacedObject ableiten.
Dann wird das Objekt freigegeben, wenn die letzte Referenz darauf wegfällt.
Oder Du könntest es so lassen und selbst Free aufrufen.
Beides würde halt ein Speicherleck vermeiden.
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Ok, fein.
Wenn es so klappt, ist es schön.
Ich will auch nicht nochmal zur Verwirrung beitragen, aber vielleicht kannst Du mal noch nach zwei Dingen schauen:
Hast Du Deine Klasse von TInterfacedPersistent abgeleitet oder von TInterfacedObject?
Wird Dein Destructor des Objektes irgendwann aufgerufen?
Ich vermute, dass Dein Objekt aktuell nicht freigegeben wird. Das wäre nicht unbedingt...
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Im Destructor muss man natürlich inherited aufrufen.
Ich finde das übersichtlicher, diesen auch zu überschreiben wenn man Konstruktoren definiert (ist aber nur Gewohnheitssache).
Aber Du kannst halt einen Haltepunkt setzten und sehen, ob das Objekt überhaupt freigegeben wird und wann.
Zu den Objekten und Interfaces, schau mal, ob Dir das zum Verständnis hilft:...
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
In jedem Fall würde ich den Destructor an Deiner Stelle überschreiben.
Du musst ja darin neben dem inherited nichts tun und Du musst ja Free auch nicht aufrufen, aber so kannst Du bei Bedarf mal einen Haltepunkt setzen und sehen, ob und wann Dein Objekt wirklich freigegeben wird (einfach nur zur Ablaufkontrolle).
Und Du solltest m.E. auch nicht davon sprechen, ob ein Objekt oder Interface =...
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Um hier helfen zu können, müsste erst mal klar sein, wer das erstelle Objekt auf Nil setzt.
Das ist letztlich schon die falsche Beschreibung. Ein Objekt kann nicht auf Nil gesetzt werden. Dieses kann man höchstens freigeben (also dessen Speicherbereich wiederverwendbar machen).
Eine Variable kann man auf Nil setzen.
Willst Du also erkennen, ob das Objekt freigegeben wurde oder ob eine...
Forum: Programmieren allgemein
Delphi
by stahli,
11. Sep 2017
Ich habe jetzt Dein Problem und den Hintergrund der Frage nicht eindeutig verstanden.
Wenn Du von TInterfacedPersistent ableitest, gibt es jedenfalls keine Referenzählung und keine automatische Freigabe des Objektes.
Wenn Du eine Referenzzählung benutzt, also z.B.
Var1 := O;
Var2 := O;
Var3 := O;