Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
Delphi 10.4 Sydney
|
AW: Interfaces und nil setzen
2. Jun 2018, 16:35
Bei den Datamodules ist es so, dass die ein generelles programmweites interface zur Verfügung stellen, welches beim programmstart geladen wird.
Bei letzterem hatte ich zuletzt das Problem, dass ich dieses interface auf ein Datamodule für import/export beim start erzeugt wurde, aber nicht auf nil gesetzt am Ende. Das bereitete mir Probleme bei der unit-finalization. nachdem ich das IImportExport := nil eingebaut habe, ging es wieder.
Das hört sich so an als würde dein Datenmodul direkt das Interface implementieren. Davon würde ich abraten, wenn es so ist, da deine Interfacereferenz noch weiterleben kann, wenn das Objekt zerstört wurde (automatisch per Owner oder auch manuell).
Beim Programmende kommt aber die Deinitialisierung dieser Interfaces, aber wenn das Objekt dahinter schon zerstört wurde, knallt es ggf. beim Aufruf von _Release.
Wir haben das so gelöst, dass unsere visuellen Komponenten und Datenmodule lediglich durch ein Interface gesteuert werden. Wird das Objekt freigegeben, wird die Referenz darauf im Interfaceobjekt auf nil gesetzt, aber das Interfaceobjekt lebt weiter. Man kann nicht mehr viel damit machen, aber man kann dies sauber abfangen und prüfen. Und vor allem hat man noch alle Daten usw., da diese nicht in der visuellen Komponente stecken, sondern in einem weiteren Interface, das sowohl die visuelle Komponente als auch das Interfaceobjekt kennen.
IM Event Datamodule.OnCreate habe ich das interface gesetzt mit "Supports", aber durch unwissen im OnDestroy nicht entladen. Jetzt mache ich es und es fährt alles sauber runter wieder. Deswegen ja die Frage in welchen kombinationen man es manuell freigeben muss und wann nicht, um meinen Code nach möglichen problemen zu durchsuchen
|
|
Zitat
|