Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriffsverletzung beim Beenden (https://www.delphipraxis.net/159258-zugriffsverletzung-beim-beenden.html)

Privateer3000 20. Mär 2011 17:57

Delphi-Version: 7

Zugriffsverletzung beim Beenden
 
Hiho,
beim beenden der anwendung (gestartet in der IDE)
erfolgt eine Fehlermeldung:

Im Projekt ist eine Exception der Klasse EAccessViolation
Zugriffsverletzung bei Adresse 005CE844 im Modul...
Schreiben von Adresse 000001AC...

Wo knallts, kann das jemand herauslesen aus der Meldung???

mkinzler 20. Mär 2011 18:09

AW: Zugriffsverletzung beim Beenden
 
Nein, weil die Adresse ja variiert. Hast du mal versucht die Anwendung zu debuggen, um zu sehen, wo der Fehler genau auftritt?
Tritt der Fehler auch ausserhalb der IDE auf?

Privateer3000 20. Mär 2011 18:12

AW: Zugriffsverletzung beim Beenden
 
Ja der tritt auch ausserhalb auf. Allerdings kommt nur die Problembericht Faselei.
Hab ich versucht, aber nach der Fehlermeldung kann ich nur per StrgF2 beenden.

Privateer3000 20. Mär 2011 18:17

AW: Zugriffsverletzung beim Beenden
 
Das CPU Fenster zeigt eine Zeile in TButton.Notification.
Wird evtl. die Komponente nicht freigegeben?

vergessen 20. Mär 2011 18:39

AW: Zugriffsverletzung beim Beenden
 
MessageBox(Null oder Handle,'Bin bis hierher gekommen #001'','Kein Fehler',mb_Ok or mb_IconInformation or mb_DefButton1);

mkinzler 20. Mär 2011 18:44

AW: Zugriffsverletzung beim Beenden
 
Oder halt mit dem Debugger Schritt für Schritt den Code durchgehen

Privateer3000 20. Mär 2011 18:47

AW: Zugriffsverletzung beim Beenden
 
Ok Danke,
noch ne Idee zum CPU Fenster?
Wenn es in der Button Notification hängen bleibt?

Privateer3000 20. Mär 2011 18:57

AW: Zugriffsverletzung beim Beenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal Screenshot vom CPU Fenster gemacht

mkinzler 20. Mär 2011 19:02

AW: Zugriffsverletzung beim Beenden
 
Befindet sich ein Popupmenü o.ä. auf der Form oder ein TDBButton?

WM_CLOSE 20. Mär 2011 19:06

AW: Zugriffsverletzung beim Beenden
 
Gibst du zufällig einen im designer erzeugten Buton frei?
Ansonsten das Projekt neu erstellen.
Wenn es dann immernoch nicht geht hilft nur den Code im Einmzelschritt zu durchlaufen.
Es kommt natürlich darauf an,ob die Exception im VCL-Code auftritt, oder in deinem eigenen:
Tritt er im VCL-Code auf, hast du zu 99,9% irgendwo etwas freigegeben, was du nicht freigeben sollst.

Privateer3000 20. Mär 2011 19:58

AW: Zugriffsverletzung beim Beenden
 
Ok Danke Leute
Ich werde das mal prüfen.
Ja mit hoher wahrscheinlichkeit betrifft Buttons die zur Laufzeit generiert wurden.
Obendrein sind Jedi Buttons. Aber damit gabs noch nie Probleme....

mkinzler 20. Mär 2011 20:00

AW: Zugriffsverletzung beim Beenden
 
Tcontrol.Notification betrifft die Freigabe, von abhängigen Komponenten

Privateer3000 21. Mär 2011 06:07

AW: Zugriffsverletzung beim Beenden
 
Danke Markus,
was bedeutet das nun für mich.
Werden Komponenten in falscher Reihenfolge freigegeben?
Beispielsweise wird in meinem Fall zur Laufzeit mehrere
Buttons erzeugt. Bisher gabs damit aber noch Probleme.
Normalerweise müsste das doch alles selbstständig
wieder freigegeben werden.

Sir Rufo 21. Mär 2011 06:27

AW: Zugriffsverletzung beim Beenden
 
"Von Selbst" werden die nur freigegeben, wenn ein entsprechender Owner gesetzt wurde.
Damit übergibst du die Speicherverwaltung für diese Komponente an den Owner ab.

Diese darfst du nun nicht mehr selber freigeben! Sonst knallt es.

Delphi-Quellcode:
TButton.Create( MyForm ); // MyForm kümmert sich um das Freigeben
TButton.Create( nil ); // Niemand kümmert sich um das Freigeben, darum irgendwann selber freigeben

Privateer3000 21. Mär 2011 07:50

AW: Zugriffsverletzung beim Beenden
 
Meiner Meinung ist der richtige Owner gesetzt.
Zitat:

aBut:=TJvTransparentButton.Create(schablone);
aBut.Parent:=schablone;
schablone ist ein frame.
wie kann ich nun herausfinden obs bei diesen Buttons knallt oder doch bei einem anderen?

DeddyH 21. Mär 2011 07:58

AW: Zugriffsverletzung beim Beenden
 
Gib doch einmal nil als Owner an.

Privateer3000 21. Mär 2011 08:22

AW: Zugriffsverletzung beim Beenden
 
Ich habe mal einen Haltepunkt ans FormClose geheftet.
Alle Proceduren werden bis zum Schluss abgearbeitet,
der letzte Punkt ist die Programm Datei
letzte Zeile:
Zitat:

Application.Run; end.
Danach knallts.

Satty67 21. Mär 2011 08:30

AW: Zugriffsverletzung beim Beenden
 
Wurde hier ja schon erwähnt, Du gibst ein Objekt manuell frei, dass eigentlich durch einen Owner freigegeben würde (der Zugriff auf ein bereits freigegebenes Objekt löst den Fehler aus).

Alternativ greifst Du in einer OnDestroy-Methode nochmal auf ein bereits freigegebenes Objekt zu.

***

Ich würde alle manuellen Freigaben bei Programm-Ende ausklammern, ReportMemoryLeaksOnShutdown auf True setzen und damit prüfen, was ich wirklich selber freigeben muss. (Alternativ FastMM4, wenn TDE das noch nicht kennt)

Privateer3000 22. Mär 2011 12:07

AW: Zugriffsverletzung beim Beenden
 
Danke an alle,
nach langem suchen hab ich nun rausgefunden, dass
es an einem Glyph lag.

Vielen Dank nochmal


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