Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriffsverletzung bei Minimieren-schließen (https://www.delphipraxis.net/116741-zugriffsverletzung-bei-minimieren-schliessen.html)

Overclocker 5. Jul 2008 14:16


Zugriffsverletzung bei Minimieren-schließen
 
Hi,

habe folgendes Problem:
Habe eine MDI Anwendung die folgendermaßen aussieht:

Links ist ein Menü mit alphacontrols komponente und rechts ist dann sozusagen mein MDI Child.

Wenn ich jetzt das child schließe, kommt keine Fehlermeldung.
Wenn ich das child allerdings minimiere (also das fenster verkleiner) und dann schließe, kommt jedes mal eine zugriffsverletzung.

woran liegt das? er führt doch im endeffekt das normale close durch und wieso macht er nur bei minimiertem fenster probleme?

dankeschön

Grüße

_frank_ 5. Jul 2008 14:27

Re: Zugriffsverletzung bei Minimieren-schließen
 
ich denke ohne den kompletten quelltext (am besten nach eingrenzung) oder zumindest de genaue Fehlermeldung können wir nur rätseln...

ist es eine Zugriffsverletzung mit lesen/schreiben auf 0x0 oder an einer komisch aussehenden adresse (z.b. 0x0000C00)?

wenn nicht wird man das step by step debuggen müssen, wo wir wieder beim quellcode wären :)

hast das mal ohne das alphacontrols-menü probiert? bzw mit einer leeren anwendung nur mit diesem menü...

Gruß Frank

Overclocker 5. Jul 2008 14:34

Re: Zugriffsverletzung bei Minimieren-schließen
 
folgenden code mach ich bei onclose
Delphi-Quellcode:
freeandnil(fenster2);
Folgende Zugriffsverletzung:
Im Projekt test.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: ' Zugriffsverletzung bei Adresse 0041B108 in Modul 'Test.exe'. Lesen von Adresse 00000008'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Wenn ich mit F8 jede Anweisung einzeln durchgeh, kommt eben die Zugriffsverletzung bei der onclose-Ausführung.



ohne dem menü hab ichs noch nicht versucht nein, weil in dem prog ziemlich viel daran hängt.

_frank_ 5. Jul 2008 15:37

Re: Zugriffsverletzung bei Minimieren-schließen
 
hast du fenster2 ohne owner erstellt? weil wenn du als owner ein anderes formular angibst wird es automatisch freigegeben (vom Owner halt).

machst du irgendwas im destructor/onclose von fenster2?

die Zugriffsverletzung sieht jedenfalls stark nach einer un- bzw. falsch initalisierten variable aus...evtl. wurde das formular vorher freigegeben....sollte aber auch im nich-minimierten Modus fehlschlagen.

nur mal so zur Erklärung...
die 8 sieht deswegen komisch aus, weil in der 32-bit-adresse nur 1 bit (bit 3) gesetzt ist, daher eher auf eine konstante/flag deutet. evtl wurde die fensteradresse mit genau dieser 8 überschrieben, warum auch immer. evtl. kannst du den ausdruck überwachen und so schauen, wann das passiert.

Gruß Frank

Overclocker 5. Jul 2008 15:39

Re: Zugriffsverletzung bei Minimieren-schließen
 
im onclose von fenster2 ist eben das freeandnil

aber jetzt fängt mein problem schon an, habe noch nie mit ownern gearbeitet :oops:

was ist das und wie geht sowas????

danke für die hilfe!!!

_frank_ 5. Jul 2008 15:45

Re: Zugriffsverletzung bei Minimieren-schließen
 
naja, woher hast du fenster2? das erstellst ja irgendwo per hand (fenster2:=TForm2.create(...) oder so ähnlich).
die 3 punkte sind der owner ;) (auf deutsch Eigentümer), wenn der Owner freigegeben wird, gibt er seine untertanen auch frei. daher musst/darfst du das in dem Fall nicht separat machen.

die formulare, die durch die anwendung erstellt werden (Application.CreateForm() in der dpr) werden auch automatisch freigegeben.

HTH Frank

Overclocker 5. Jul 2008 15:49

Re: Zugriffsverletzung bei Minimieren-schließen
 
das fenster erstell ich ganz normal und lass es aber erst im programm selber erstellen mit

Delphi-Quellcode:
application.createform(Tfenster2,fenster2);
aber was muss mich jetzt wo freigeben??sonst ist dieses fenster nirgends verknüpft oder ähnliches

ich erzeug es einfach so und im onclose mach ich freeandnil...

_frank_ 5. Jul 2008 15:58

Re: Zugriffsverletzung bei Minimieren-schließen
 
dadurch, dass du es über die application-instanz erstellst, brauchst du das imho nicht freigeben...das macht die anwendung selbst. wie die anderen Forms auch.
[oh]TApplication.CreateForm
...
Der Eigentümer des neuen Formulars ist die Anwendung.[/oh]

[oh]TComponent.Create
...
Für manuell (also nicht im Formular-Designer) erzeugte Komponenten rufen Sie Create auf und übergeben die übergeordnete Komponente im Parameter AOwner. Der Eigentümer löst die Komponente auf, wenn er selbst aufgelöst wird. Wenn die Komponente keinen Eigentümer hat, rufen Sie Free auf, um sie aufzulösen.[/oh]

warum der effekt nur im minimierten Zustand auftritt ist mir allerdings ein Rätsel.

Gruß Frank

DP-Maintenance 5. Jul 2008 16:49

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Es geht um Delphi. Und ich ordne das mal als allgemeines Delphi-Sprachproblem ein.

Overclocker 6. Jul 2008 12:05

Re: Zugriffsverletzung bei Minimieren-schließen
 
noch jemand eine idee woran das liegen könnte???

Christian Seehase 6. Jul 2008 13:03

Re: Zugriffsverletzung bei Minimieren-schließen
 
Moin Overclocker,

Zitat:

Zitat von Overclocker
noch jemand eine idee woran das liegen könnte???

Das Standardverhalten beim Schliessen eines MDI-Childs ist minimieren.
Um des freizugeben, müsstest Du im OnClose die Action auf caFree setzen, und nicht mit FreeAndNil freigeben.
Wenn Du es über Application.CreateForm selbst erzeugst, darf das nicht auch noch in der Projektdatei stehen.

Overclocker 6. Jul 2008 14:06

Re: Zugriffsverletzung bei Minimieren-schließen
 
hey,

perfekt. so funktioniert es.

in der projektdatei steht das auch nicht drinnen da ich es ja selbst erzeuge.

könntest du vllt noch kurz erklären wieso ich das so machen muss und weshalb? will ja nicht einfach nur copy paste machen sondern auch dazulernen

vielen dank

Christian Seehase 6. Jul 2008 15:38

Re: Zugriffsverletzung bei Minimieren-schließen
 
Moin Overclocker,

Zitat:

Zitat von Overclocker
könntest du vllt noch kurz erklären wieso ich das so machen muss und weshalb?

Vielleicht, wenn Du noch mal genau erklärst, wie Du es jetzt machst ;-)

Zitat:

Zitat von Overclocker
will ja nicht einfach nur copy paste machen sondern auch dazulernen

:thumb:

Overclocker 6. Jul 2008 15:50

Re: Zugriffsverletzung bei Minimieren-schließen
 
ganz einfach, im onclose von dem fenster anstatt

freeandnil(fensterxy);


habe ich jetzt

action := caFree eingefügt und das freeandnil gelöscht


und so funktioniert es.

mit dem "action" habe ich noch nie gearbeitet deshalb weis ich auch nicht wozu man das benötigt, ging sonst auch ohne *g*

sx2008 6. Jul 2008 16:18

Re: Zugriffsverletzung bei Minimieren-schließen
 
Du solltest auch noch die globale Variable (fensterxy) in der Unit für dein Childformular auskommentieren damit du nie wieder auf die Idee kommst diese zu benützen.
Da es mehr als eine Instanz des Childformulars geben kann, darf es keine Variable geben, die ja nur ein Objekt aufnehmen kann.

Overclocker 6. Jul 2008 16:32

Re: Zugriffsverletzung bei Minimieren-schließen
 
ne in meinem programm soll immer nur max. 1 childformular geben weil die childfenster sozusagen zu jedem menüpunkt eine übersicht sind und die ganzen anderen sachen werden in normalen fenster geöffnet.

aber irgendwie versteh ich den unterschied zwischen freeandnil und action:=caFree nicht

beide befehle geben doch das objekt frei oder nicht???

Christian Seehase 6. Jul 2008 16:42

Re: Zugriffsverletzung bei Minimieren-schließen
 
Moin Overclocker,

durch das FreeAndNil (ein .Free hätte das gleiche Ergebnis) im OnClose zerstörst Du das Objekt in sich selbst (ein self.Free käme auf das gleiche raus).
Jeder weitere Zugriff auf das Objekt, kann dann, je nachdem, was schon mit dem Speicher passiert ist, zu einem Fehler führen.
Durch das caFree weiss Delphi dann intern, was zu tun ist, und die Fehler werden vermieden.

Wenn ein MDI-Child geschlossen wird, wird es standardmässig minimiert, ein "normales" Formular hingegen unsichtbar gemacht (ausser es ist das Hauptformular, dann wird die Anwendung geschlossen).

Overclocker 6. Jul 2008 16:51

Re: Zugriffsverletzung bei Minimieren-schließen
 
ah ok dann hab ich wieda was daugelernt super danke :thumb:


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