Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Kein release in Finalization (https://www.delphipraxis.net/192919-kein-release-finalization.html)

idefix2 1. Jun 2017 13:26

Kein release in Finalization
 
ich habe jetzt seit einigen Tagen einen extrem hartnäckigen und lästigen Fehler erfolgreich eingegrenzt. Meines Erachtens handelt es sich um einen Fehler in der IDE.

Ich hatte implizit in mein Package eine Unit eingebunden, die in der initialization section ein Formular erstellt und dieses in der finalization section mittels release wieder freigibt.
Das Package lässt sich problemlos installieren, aber jeder Versuch, es zu deinstallieren, führt zu einem Totalabsturz der IDE.

Lange war ich der Meinung, es würde bei der Installation des Package crashen, und habe endlos danach gesucht, welche Veränderung des Source Codes meiner Komponenten zum Crash führt. Tatsächlich hat es mit den Komponenten des Package gar nichts zu tun, es crasht, wenn man bei installiertem Package irgend etwas (beliebiges) verändert, und das Package neu kompiliert, schon beim Versuch, das alte Package zu deinstallieren. Es wirkt sich derart aus, dass nur mehr Exception-Meldungen kommen, und man die IDE per Taskmanager killen und vor dem Neustart der IDE das BPL-File löschen muss.

himitsu 1. Jun 2017 13:55

AW: Kein release in Finalization
 
Delphi-Quellcode:
procedure TCustomForm.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;
http://www.delphipraxis.net/80112-un...orm-close.html

Form.Release macht garnichts, außer der Form zu sagen, dass sie sich demnächst bitte freigeben soll.
Wenn die Form aber dazu kommt, ist das Package schon lange weg, die Methoden und RTTI dieser FormKlasse existieren nicht mehr
und wie soll diese Form-Instanz nun freigegeben werden, wenn ihr ganzes Inneres verschwunden ist?
Da muß es zwangsläufig knallen!

Delphi-Quellcode:
.Free
:!:


Forms sind global in der VCL registiert, also in deinem Fall der Form-Zeiger auf "Schrott"
und da die VCL immer mal wieder die globale Form-Liste durchläuft, knallt es immer wieder, wenn dieser Zeiger behandelt werden soll.

idefix2 1. Jun 2017 14:57

AW: Kein release in Finalization
 
Hols der Teufel!
release habe ich extra genommen, weil in der Dokumentation steht, dass man Gefahr läuft, dass es knallt, wenn man Formulare mit free statt mit release freigibt.
Aber in dem Fall ist es offensichtlich genau umgekehrt...

Danke jedenfalls für die Aufklärung.

P.S. Wenn diese Unit in ein normales Programm eingebunden war, hat das release beim Schliessen des Programms immer normal funktioniert.

himitsu 1. Jun 2017 15:06

AW: Kein release in Finalization
 
Zitat:

Zitat von idefix2 (Beitrag 1373247)
P.S. Wenn diese Unit in ein normales Programm eingebunden war, hat das release beim Schliessen des Programms immer normal funktioniert.

Jupp, da blieb ja der Code/RTTI erhalten und im selben Zug wurde auch die ganze VCL beendet, bevor die Unit/EXE aus dem Speicher verschwand.


Release statt Free, wenn nach dem Release/Free noch auf die Form zugegriffen werden konnte.
Drum heißt es auch oft, dass man die Form nicht innerhalb der eigenen Methoden freigeben soll, was aber auch Funktioniert, so lange danach nicht auf die Form zugegriffen wird.

Beispiel:
in TButton.OnClick den Button selber freigeben -> geht
in TcxButton.OnClick (DevExpress) den Button selber freigeben > knallt, da DevExpress selber nochmal auf die Buttoninstanz, also auf Self, zugreift (mit einem beherzten Delphi-Referenz durchsuchenAbort wird das umgangen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz