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/)
-   -   Delphi zugriffsverletzung bei Freeandnil (https://www.delphipraxis.net/120531-zugriffsverletzung-bei-freeandnil.html)

renekr 12. Sep 2008 07:32


zugriffsverletzung bei Freeandnil
 
Hi,
Ich habe ein Probelem beim OnClose einer Form.
Öffnen tue ich die Form so.
Delphi-Quellcode:

  form3 := tform3.Create(self);
  try
      form3.showmodal;
      finally
      FreeAndNil(Form3);
      end;
und beim FreeAndNil(Form3) kommt dann eine Zugriffsverletzung bei Adresse 004020CF.
nun habe ich mal die Form in eine neue anwendung kopiert und aufgerufen
Dort funktioniert alles .
Das hat bei der Hauptanwendung auch mal funktioniert aber hab aktuell das Thema das es halt nicht mehr geht.

Kann mir jemand sage nwie ich den Fehelr ev. näher eingrenzen kann?
Also die Form ist beim close noch da ,also noch nicht free.

Danke

mkinzler 12. Sep 2008 07:35

Re: zugriffsverletzung bei Freeandnil
 
Wie sieht der Destruktor aus? Wird das Fenster vielleicht beim Close schn freigegeben (caFree)?

MarcoWarm 12. Sep 2008 07:37

Re: zugriffsverletzung bei Freeandnil
 
teste vor dem FreeAndNil, ob das Form assigned (d.h. <>nil) ist.
Es ist zu empfehlen Forms mit Release freizugeben und nachher die Variable auf nil zu setzen.

renekr 12. Sep 2008 07:42

Re: zugriffsverletzung bei Freeandnil
 
Hi,
also es ist assigned:

Delphi-Quellcode:
  try
      form3.showmodal;
      finally
      if Assigned(form3) = true then
      FreeAndNil(Form3);
      end;
ZV kommt immer noch.
Mich wundert es halt,weil es immer ging,nur seit kurzem kommt der Fehler.
Ich habe aber an dieser Ecke oder an der Form nix geändert.

danke

Bernhard Geyer 12. Sep 2008 07:44

Re: zugriffsverletzung bei Freeandnil
 
Zitat:

Zitat von MarcoWarm
teste vor dem FreeAndNil, ob das Form assigned (d.h. <>nil) ist.
Es ist zu empfehlen Forms mit Release freizugeben und nachher die Variable auf nil zu setzen.

Der in FreeAndNil vorhandene Free-Methodenaufruf checkt das schon selbst auf nil!

Der Fehler wird irgendwo anders liegen. Ist form3 evtl. eine globale Variable die irgendwo anders auch verwendet wird (z.B. im Formular direkt anstatt dort z.B. self zu nehmen?

renekr 12. Sep 2008 07:51

Re: zugriffsverletzung bei Freeandnil
 
Hi,
Also wie gesagt es ging mal *GG*.

Ich habe die Art des Aufrufes noch an anderen Stellen drin und dort gehn die auch alle nicht mehr.

Immer beim Freeannil kommmt die ZV.

mfg

Neutral General 12. Sep 2008 08:05

Re: zugriffsverletzung bei Freeandnil
 
Hi,

Es muss ja nicht zwangsweise an der Form selbst liegen. Vielleicht versuchst du ja im Form.OnDestroy oder OnClose etwas freizugeben, was entweder nie erstellt war, oder was du schon wieder freigegeben hast?

renekr 12. Sep 2008 08:30

Re: zugriffsverletzung bei Freeandnil
 
Wie gesagt es ist an mehreren Forms und ich habe an keiner Form in der Art was verändert.

MarcoWarm 12. Sep 2008 08:44

Re: zugriffsverletzung bei Freeandnil
 
Read the Fine Manual

Mit Release können Sie das Formular aus dem Speicher entfernen.

Release gibt das Formular erst frei, nachdem die Ausführung der Ereignisbehandlungsroutinen des Formulars und seiner untergeordneten Komponenten beendet ist. Die Methode stellt auch sicher, dass alle Botschaften in der Ereigniswarteschlange des Formulars vor dessen Freigabe bearbeitet werden. Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.

renekr 12. Sep 2008 08:47

Re: zugriffsverletzung bei Freeandnil
 
Hi,
also ich habs nun mir
Form3.Release;
probiert,doch leider kommt die ZV nun beim Release.

danke

MarcoWarm 12. Sep 2008 08:49

Re: zugriffsverletzung bei Freeandnil
 
wie sieht der onClose Event des Formulars aus?

sirius 12. Sep 2008 08:50

Re: zugriffsverletzung bei Freeandnil
 
Dann gehe doch mal mit dem Debugger rein.

Bernhard Geyer 12. Sep 2008 08:52

Re: zugriffsverletzung bei Freeandnil
 
Zitat:

Zitat von MarcoWarm
Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.

Bei Show gebe ich dir recht. Bei ShowModal tritt dieses Problem nicht auf da ShowModal schon dafür sorgt das sie erst zurückkommt wenn alle Windows-Messages für das Formular abgearbeitet sind.

MarcoWarm 12. Sep 2008 09:01

Re: zugriffsverletzung bei Freeandnil
 
Zitat:

Zitat von Bernhard Geyer
Bei Show gebe ich dir recht. Bei ShowModal tritt dieses Problem nicht auf da ShowModal schon dafür sorgt das sie erst zurückkommt wenn alle Windows-Messages für das Formular abgearbeitet sind.

wieder was gelernt.... danke :-)

Assertor 12. Sep 2008 09:13

Re: zugriffsverletzung bei Freeandnil
 
Hi,

zusätzlich:

Delphi-Quellcode:
try
  form3.showmodal;
finally
  if Assigned(form3) then
  // so bitte nicht, hatten wir ja schon oft im Forum:
  // if Assigned(form3) = true then
    FreeAndNil(Form3);
end;
Hast Du auch mal geprüft, ob das Form nicht schon in der .dpr erzeugt wird? Guck mal unter den Projektoptionen > Formulare nach.

Gruß Assertor

"Der, der bisher nie mit FreeAndNil(FormXYZ) eine Exception bekommen hat" ;)

Edit: Ich denke, es geht bei Release eher um die Freigabe eines Forms durch sich selbst innerhalb der eigenen Ereignisbehandlungsroutinen, damit die Eventhandler zum Ende trotzdem korrekt abgearbeitet werden und der Event-Routine nicht selbst der Boden unter den Füßen weggezogen wird. Ein externes Free/FreeAndNil sollte prinzipiell kein Problem sein.

hanspeter 12. Sep 2008 09:32

Re: zugriffsverletzung bei Freeandnil
 
Den Fehler hatte ich bisher in zwei Zusammenhängen mal gehabt.
1. Wenn in der Form Com/ActiveX verwendet wurden.
Hing damals wohl mit der Freigabe von Interfaces zusammen.

2. Ich habe TMS-Software Komponenten mit eigener Styleverwaltung verwendet.
Hier kam der Fahler irgendwo in der Nachrichtenschleife der Komponenten beim
freigeben. Da wurde wohl zu schnell der Boden unter den Füssen weggezogen.

Um diese Ursache auszuschließen, kann man erst mal versuchen nach Form.Free mit einem
Timer das Form := nil zu verzögern.

Oder als bessere Lösung:

In onClose Action := cafree setzen.
Schließt das Fenster (fast) immer korrekt.
Interessanter Weise ging hier auch ein nil.

Beispiel:
Delphi-Quellcode:
Form := TForm.Create;
...

FreeandNil(Form); --> Fehler

Form.Close;

onClose:
  Action := cafree;
  Form := nil;

funktionierte.
Ich hoffe eine Anregung wie weiter suchen.

Gruß
Peter

renekr 12. Sep 2008 10:49

Re: zugriffsverletzung bei Freeandnil
 
Hi,
verdamm. Mis..

Ich hatte das Problem auch schon öfters.
Bin durchs reindebuggen wieder draufgestoßen.

Habe letzte Woche die TMS Komponenten upgedatet und leider ist in der
destructor TAdvDBLookupComboBox.Destroy noch ein Fehelr drin.
Beim FreeBookmark krachts .
Werde es mal Untersuchen und an TMS Support mailen.

Sry für die Belästigung.
Aber trotzdem Danke für die Infos.Diese waren in bez. Release und Freigeben auch sehr nützlich.

Schönes Weekend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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