Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Freigabe, aller Formulare meiner Anwendung, debuggen (https://www.delphipraxis.net/181503-freigabe-aller-formulare-meiner-anwendung-debuggen.html)

Alex_ITA01 20. Aug 2014 15:31

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

Uwe Raabe 20. Aug 2014 15:37

AW: Freigabe, aller Formulare meiner Anwendung, debuggen
 
IN Vcl.Forms.pas die Methode
Delphi-Quellcode:
DoneApplication
oder speziell TApplication.DestroyComponents (da das aber in TComponent deklariert ist, ist ein Breakpoint dort eventuell hinderlich).

Alex_ITA01 20. Aug 2014 15:39

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 ;-)

Alex_ITA01 21. Aug 2014 07:33

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:
RegForm.Free;
aufruft?

Grüße

Alex_ITA01 21. Aug 2014 08:12

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

Uwe Raabe 21. Aug 2014 08:17

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:
  1. Setze einen Breakpoint in TCustomForm.Destroy
  2. Iteriere nach dem Application.Run rückwärts über Screen.Forms und gib die Forms manuell frei

Der zweite Ansatz bringt allerdings eine andere Ablaufreihenfolge, die den Fehler womöglich kaschiert.

himitsu 21. Aug 2014 08:56

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:
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;
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-

Zitat:

Zitat von Uwe Raabe (Beitrag 1269318)
Man darf natürlich keinen Breakpoint in DestroyComponents setzen,

Kann man schon.
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:
end.
danach) und dann manuell durchsteppen (F7/F8/F10).

Dabei natürlich vorher vergessen die RTL/VCL-DebugDCUs abzuschalten, welche ja nur standardmäßig immer an sind.

Uwe Raabe 21. Aug 2014 10:02

AW: Freigabe, aller Formulare meiner Anwendung, debuggen
 
Zitat:

Zitat von himitsu (Beitrag 1269326)
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.

Das mit dem Trigger wird nichts helfen, da bei einem TForm.Destroy für jede Komponente in dem Form auch deren DestroyComponents aufgerufen wird.

Aber die Bedingung ist wirklich ein brauchbarer Weg:
Delphi-Quellcode:
InheritsFrom(TForm)

Alex_ITA01 21. Aug 2014 10:03

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 08:03 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