![]() |
EAccessViolation Zugriffsverletzung
Wenn ich von meinem Hauptfenster ein anderes Fenster mit "ShowModal" öffne und es anschließend wieder schließe, bekomme ich nur beim 1. mal eine Zugriffsverletzung :
Zitat:
Delphi-Quellcode:
// *****************************************************************************
// Menüaktion ausführen // ***************************************************************************** procedure TFAppMain.DoAction(Sender: TObject); var NewForm: TForm; sName: String; begin If not (Sender is TAction) Then exit; sName := (Sender as TAction).Name; Delete(sName, 1, 2); If AppBenutzerId = -99 Then {=Administrator} begin MyRechte.Show := True; MyRechte.Edit := True; MyRechte.Insert := True; MyRechte.Delete := True; end else MyRechte := GetRechte(CoMain,AppGruppeId,(Sender as TAction).Category,sName); sName := 'TF' + sName; try NewForm := CreateComponentByClassName(sName,Self) as TForm; NewForm.ShowModal; finally FreeAndNil(NewForm); end; end;
Delphi-Quellcode:
Ich bekomme die Fehlermeldung nach der Beendigung der Prozedur "DoAction", wenn also das Hauptfenster erscheinen soll.
// *****************************************************************************
// Formular erstellen: Afgerufen wird in "DoAction" // ***************************************************************************** function TFAppMain.CreateComponentByClassName(const Formular: String; AOwner: TComponent): TComponent; begin Result := TComponentClass(FindClass(Formular)).Create(AOwner); end; Ich habe Except.log eingebunden. Nur leider bringt mich die Log-Datei auch nicht weiter. Zitat:
|
Re: EAccessViolation Zugriffsverletzung
CloseAction in einem Formular das Modal angezeigt wird nicht auf caFree setzen.
Free oder FreeAndNil ruft direkt Destroy auf, Release schickt eine Nachricht an das Fenster. So können andere Nachrichten aus der Warteschlange vorher noch verarbeitet werden.
Delphi-Quellcode:
Wenn es eine globale Variable für das Formalar gibt, dann im OnDestroy auf nil setzen.
finally
NewForm.Release; NewForm := nil; // <- für die lokale Variable eigentlich im Beispiel überflüssig. end;
Delphi-Quellcode:
TMeineForm.OnDestroy
begin FMeineForm := nil; end; |
Re: EAccessViolation Zugriffsverletzung
Danke für die Antwort und Deine Mühe!
Leider löst sie noch nicht das Problem. :( Ich habe "caFree" aus "FormClose" entfernt und statt "FreeAndNil" ein "Release" verwendet, sowie die Form in "OnDestroy" auf "nil" gesetzt. Die Fehlermeldung erscheint immer noch einmalig und die Log-Datei hat sich leider auch nicht verändert. |
AW: EAccessViolation Zugriffsverletzung
Hallo KalZakath, hallo DP,
auch wenn das Thema schon lange nicht mehr im Gespräch war, so ist das Problem anscheinend noch immer nicht gelöst :) Ich hatte bis vor Kurzem auch diese Zugriffsverletzung, wenn ich eine Form terminieren wollte und im nächsten Schritt wieder erzeugen wollte (um die Anfangsdaten wiederherzustellen). Jetzt wo ich
Delphi-Quellcode:
durch
FreeAndNil(MyForm)
Delphi-Quellcode:
ersetzt habe, funktionierts bei mir. Andere Änderungen musste ich nicht vornehmen. Evtl. tritt der Fehler dann nicht mehr auf, wenn du die Form in
MyForm.Release
Delphi-Quellcode:
nicht
OnDestroy
Delphi-Quellcode:
setzt.
= nil
Delphi-Quellcode:
habe ich in
caFree
Delphi-Quellcode:
auch nicht verwendet. :-D
FormClose
Gruß Niklas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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