AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Freigabe, aller Formulare meiner Anwendung, debuggen
Thema durchsuchen
Ansicht
Themen-Optionen

Freigabe, aller Formulare meiner Anwendung, debuggen

Ein Thema von Alex_ITA01 · begonnen am 20. Aug 2014 · letzter Beitrag vom 21. Aug 2014
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 20. Aug 2014, 16:31
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 20. Aug 2014, 16:37
IN Vcl.Forms.pas die Methode DoneApplication oder speziell TApplication.DestroyComponents (da das aber in TComponent deklariert ist, ist ein Breakpoint dort eventuell hinderlich).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 20. Aug 2014, 16:39
Danke schön. Ich hatte das irgendwie auch schonmal selber da hin gefunden aber diesmal kam ich nicht mehr drauf
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#4

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 08:33
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.

RegForm.Free; aufruft?

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 09:12
Der Ablauf des Fehlers ist wie folgt, siehe Screenshots.
Habt ihr noch eine Idee wie ich da weiter kommen kann?

Grüße
Miniaturansicht angehängter Grafiken
1.png   2.png   3.png   4.png  
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 09:17
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 09:56
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-

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 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (21. Aug 2014 um 09:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 11:02
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: InheritsFrom(TForm)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#9

AW: Freigabe, aller Formulare meiner Anwendung, debuggen

  Alt 21. Aug 2014, 11:03
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ß
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 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