AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation Zugriffsverletzung

Offene Frage von "entwickler"
Ein Thema von KalZakath · begonnen am 3. Nov 2009 · letzter Beitrag vom 27. Okt 2012
Antwort Antwort
Benutzerbild von KalZakath
KalZakath

Registriert seit: 22. Feb 2006
Ort: Nordhorn
3 Beiträge
 
Turbo Delphi für Win32
 
#1

EAccessViolation Zugriffsverletzung

  Alt 3. Nov 2009, 23:34
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?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#2

Re: EAccessViolation Zugriffsverletzung

  Alt 4. Nov 2009, 08:25
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;
  Mit Zitat antworten Zitat
Benutzerbild von KalZakath
KalZakath

Registriert seit: 22. Feb 2006
Ort: Nordhorn
3 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: EAccessViolation Zugriffsverletzung

  Alt 6. Nov 2009, 19:44
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.
  Mit Zitat antworten Zitat
Benutzerbild von entwickler
entwickler

Registriert seit: 16. Feb 2011
Ort: Herten
78 Beiträge
 
Delphi 5 Professional
 
#4

AW: EAccessViolation Zugriffsverletzung

  Alt 27. Okt 2012, 16:05
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 FreeAndNil(MyForm) durch 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 OnDestroy nicht = nil setzt. caFree habe ich in FormClose auch nicht verwendet.

Gruß

Niklas
Traue einem PC nur soweit, wie du ihn werfen kannst.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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