![]() |
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 |
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 |
Re: Zugriffsverletzung bei Minimieren-schließen
folgenden code mach ich bei onclose
Delphi-Quellcode:
Folgende Zugriffsverletzung:
freeandnil(fenster2);
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. |
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 |
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!!! |
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 |
Re: Zugriffsverletzung bei Minimieren-schließen
das fenster erstell ich ganz normal und lass es aber erst im programm selber erstellen mit
Delphi-Quellcode:
aber was muss mich jetzt wo freigeben??sonst ist dieses fenster nirgends verknüpft oder ähnliches
application.createform(Tfenster2,fenster2);
ich erzeug es einfach so und im onclose mach ich freeandnil... |
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
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. |
Re: Zugriffsverletzung bei Minimieren-schließen
noch jemand eine idee woran das liegen könnte???
|
Re: Zugriffsverletzung bei Minimieren-schließen
Moin Overclocker,
Zitat:
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. |
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 |
Re: Zugriffsverletzung bei Minimieren-schließen
Moin Overclocker,
Zitat:
Zitat:
|
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* |
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. |
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??? |
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). |
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