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 EAccessViolation Zugriffsverletzung (https://www.delphipraxis.net/142793-eaccessviolation-zugriffsverletzung.html)

KalZakath 3. Nov 2009 22:34


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:

Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.
Rufe ich gleich danach das Fenster noch einmal auf und schließe es wieder ist alles in Ordnung. Die Funktionalität bleibt erhalten.

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:
// *****************************************************************************
// Formular erstellen: Afgerufen wird in "DoAction"
// *****************************************************************************

function TFAppMain.CreateComponentByClassName(const Formular: String;
   AOwner: TComponent): TComponent;
begin
   Result := TComponentClass(FindClass(Formular)).Create(AOwner);
end;
Ich bekomme die Fehlermeldung nach der Beendigung der Prozedur "DoAction", wenn also das Hauptfenster erscheinen soll.

Ich habe Except.log eingebunden. Nur leider bringt mich die Log-Datei auch nicht weiter.

Zitat:

--------------------------------------------------------
New exception:
Exception code: 3221225477
Exception flags: 2
Number of parameters: 2
(no debug info) Find error: 00000000
call stack - 0 : Routine @Actnmenus@TCustomActionMainMenuBar@TrackMenu Find error: 005D94E5
call stack - 1 : Routine @Actnmenus@TCustomActionMenuBar@CMItemClicked Find error: 005D4A5F
call stack - 2 : Routine @Controls@TWinControl@WndProc Find error: 00466162
call stack - 3 : Routine @Actnmenus@TCustomActionMenuBar@WndProc Find error: 005D6295
call stack - 4 : Routine @Classes@StdWndProc Find error: 0042CFE6
call stack - 5 : (no debug info) Find error: 7E368730
call stack - 6 : (no debug info) Find error: 7E368812
call stack - 7 : (no debug info) Find error: 7E3689C9
call stack - 8 : (no debug info) Find error: 7E3696C3
call stack - 9 : Routine @Forms@TApplication@ProcessMessage Find error: 0047F23D
Hat jemand eine Idee?

Blup 4. Nov 2009 07:25

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:
finally
  NewForm.Release;
  NewForm := nil; // <- für die lokale Variable eigentlich im Beispiel überflüssig.
end;
Wenn es eine globale Variable für das Formalar gibt, dann im OnDestroy auf nil setzen.
Delphi-Quellcode:
TMeineForm.OnDestroy
begin
  FMeineForm := nil;
end;

KalZakath 6. Nov 2009 18:44

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.

entwickler 27. Okt 2012 15:05

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:
FreeAndNil(MyForm)
durch
Delphi-Quellcode:
MyForm.Release
ersetzt habe, funktionierts bei mir. Andere Änderungen musste ich nicht vornehmen. Evtl. tritt der Fehler dann nicht mehr auf, wenn du die Form in
Delphi-Quellcode:
OnDestroy
nicht
Delphi-Quellcode:
= nil
setzt.
Delphi-Quellcode:
caFree
habe ich in
Delphi-Quellcode:
FormClose
auch nicht verwendet. :-D

Gruß

Niklas


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz