![]() |
Freigabe, aller Formulare meiner Anwendung, debuggen
Hallo zusammen,
ich habe in meiner Anwendung relativ viele Fenster, die beim Anwendungsstart geladen werden (in der DPR Datei Application.CreateForm). Delphi kümmert sich ja beim Beenden der Anwendung selber um die Freigabe dieser Fenster. Jetzt ist in einer dieser Freigabe (also im FormDestroy) irgendwo eine Zugriffsverletzung drinne. Die Frage ist, wo müsste ich meinen Breakpoint hinsetzen, damit ich Schritt für Schritt die Freigabe der einzelnen Fenster durchgehen kann? Viele Grüße |
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
IN Vcl.Forms.pas die Methode
Delphi-Quellcode:
oder speziell TApplication.DestroyComponents (da das aber in TComponent deklariert ist, ist ein Breakpoint dort eventuell hinderlich).
DoneApplication
|
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Danke schön. Ich hatte das irgendwie auch schonmal selber da hin gefunden aber diesmal kam ich nicht mehr drauf ;-)
|
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Moin,
bin mir doch nicht ganz sicher ob das die Stelle ist, die ich gesucht habe. An "DoneApplication" wird ja wirklich jede einzelne Komponente freigegeben. Gibt es denn nicht irgendwo eine Art Schleife, die alle registrierten Formulare durch geht und dann z.B.
Delphi-Quellcode:
aufruft?
RegForm.Free;
Grüße |
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Liste der Anhänge anzeigen (Anzahl: 4)
Der Ablauf des Fehlers ist wie folgt, siehe Screenshots.
Habt ihr noch eine Idee wie ich da weiter kommen kann? Grüße |
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
In TApplication.CreateForm wird irgendwann Instance.Create(Self) aufgerufen. Damit ist die TApplication Instanz Owner des Forms. Die Freigabe erfolgt dann wie bei jedem anderen Owner auch über DestroyComponents. Das wird aber wiederum in DoneApplication aufgerufen.
Man darf natürlich keinen Breakpoint in DestroyComponents setzen, da das ja noch von anderen Stellen aufgerufen wird. Du kannst nur mit F8 durchsteppen und sehen, wo es knallt. Es gibt noch zwei Alternativen:
Der zweite Ansatz bringt allerdings eine andere Ablaufreihenfolge, die den Fehler womöglich kaschiert. |
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Der Stacktrace nach/bei der Exception sagt dir nichts?
Und eventuell noch ein Self.Name/ClassName oder dergleichen angucken. Warum werden überhaupt soviele Forms immer automatisch erzeugt? Werden die denn wirklich alle ständig benötigt? Man kann natürlich auch die eigenen Forms ableiten, im Vorfahren den Destructor überschreiben und mit einem Try-Except befüllen, welches einem zumindestens die Form nennt, bei welcher es knallt.
Delphi-Quellcode:
Muß ja nichtmal eine "wirkliche" Ableitung sein, sondern einfach das vor die TMyForm-Deklaration, bzw. in eine eigene Unit und die als Allerletztes ins Uses vor die eigenen Forms-
type
TForm = class(Forms.TForm) destructor Destroy; override; end; destructor TForm.Destroy; var S: string; begin try S := ClassName + ' ' + Name + ': '; // wird ja theoretisch im inherited freigegeben inherited; except on E: Exception do ShowMessage(S + E.Message); end; end; Zitat:
Notfalls deaktiviert man den Haltepunktpunkt einfach und lässt ihn von einem passendem Trigger aktivieren. Oder man gibt ihm eine Bedingung, damit er nur bei TForms anhält. Ein Haltepunkt nach Application.Run; (wenn nichts mehr da ist, dann auf das
Delphi-Quellcode:
danach) und dann manuell durchsteppen (F7/F8/F10).
end.
Dabei natürlich vorher vergessen die RTL/VCL-DebugDCUs abzuschalten, welche ja nur standardmäßig immer an sind. |
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Zitat:
Aber die Bedingung ist wirklich ein brauchbarer Weg:
Delphi-Quellcode:
InheritsFrom(TForm)
|
AW: Freigabe, aller Formulare meiner Anwendung, debuggen
Ja, die Fenster werden alle benutzt.
Habe es gefunden jetzt. War doch nicht in einem Fenster sondern entstand bei der Freigabe in einem Thread... Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz