Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [gelöst] EAccessViolation bei Zugriff auf Boolean in Create? (https://www.delphipraxis.net/71524-%5Bgeloest%5D-eaccessviolation-bei-zugriff-auf-boolean-create.html)

markusj 16. Jun 2006 10:46


[gelöst] EAccessViolation bei Zugriff auf Boolean in Create?
 
Hallo @ all, ich hab mal wieder sonderbare Probleme.

Ich habe eine Klasse TDataFile mit drei verschiedenen Konstruktoren.
Diese Klasse hat zwei Boolean-Felder, zum einen loadState, zum anderen lockState.
Beide werden im "Basis-Konstruktor" auf false gesetzt.
Wie man im Code sehen kann, greift der spezialisierte Konstruktor auf den normalen zu, lässt die Grundeinstellungen festlegen.
Später soll die Klasse dann den Stream sowie den Dateinamen laden, was der erweiterte Konstruktor dann macht.

Delphi-Quellcode:
 constructor TDataFile.Create;
  begin
  inherited;
  loadState := false; //Hier krachts
  lockState := false;
  Data := TMemoryStream.Create;
  fName := '';
  fSize := 0;
  end;

 constructor TDataFile.Create(stream : TMemoryStream; sfName : string; var stateMessage : byte);
  begin
  Create;
  try
   Data.Free;
   Data := stream;
   fSize := Data.Size;
   fName := sfName;
   loadState := true;
   stateMessage := 0;
  except
   loadState := false;
   Data := TMemoryStream.Create;
   fName := '';
   fsize := 0;
   stateMessage := 2;
   end;
  end;
So, nun das Problem: In der Zeile
loadState := false;
kassiere ich eine Exception:
Erste Zufalls-Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 004C7EB9 in Modul 'Nicht wichtig.exe'. Schreiben von Adresse 00000008'. Prozess Nicht wichtig.exe (2704)
Wie kann das sein? Ich greife doch nur auf das eigene Boolean-Feld zu. Der inherited-Konstruktor wurde auch schon aufgerufen, also sollten die Felder ausgerichtet sein ...

Ein inherited Create bringt auch nichts, ebensowenig das Kopieren des Codes von Create nach Create(...)+ändern der Zeile inherited; nach inherited Create;

Hier noch der Klassenkopf:

Delphi-Quellcode:
 type TDataFile = class(TObject)
       protected
        var Data : TMemoryStream;
        var loadState, lockState : boolean;
        var fName : string;
        var fSize : longword;

       procedure doUnlock;

       public
        property loaded : boolean read loadState;
        property Name : string read fName;
        property Size : longword read fSize;

        constructor Create; overload;
        constructor Create(stream : TMemoryStream; sfName : string; var stateMessage : byte); overload;
        constructor Create(pfad : string; var stateMessage : byte); overload;
        destructor Destroy; override;

        function getStreamP(var unlocker : TPUnlock) : TMemoryStream; overload;
        function getStreamP(var stateMessage : byte; var unlocker : TPUnlock) : TMemoryStream; overload;
        function loadFromFile(pfad : string) : byte;
        function saveToFile(pfad : string) : byte;
        function close : byte;
Vielen Dank schon im Voraus für eure Hilfe!

mfG

Markus

mkinzler 16. Jun 2006 11:05

Re: EAccessViolation bei Zugriff auf Boolean-Variable in Cre
 
Zitat:

Wie kann das sein? Ich greife doch nur auf das eigene Boolean-Feld zu. Der inherited-Konstruktor wurde auch schon aufgerufen, also sollten die Felder ausgerichtet sein ...
Der auf ruf des Konstruktors der Superklasse, richtet nur diese ein, also erzeugt hier ein TObject-Objekt.
Tritt das Problem auch beim direkten Aufruf des Basiskonstruktors auf?

markusj 16. Jun 2006 11:14

Re: EAccessViolation bei Zugriff auf Boolean-Variable in Cre
 
Asche über mein Haupt!
Problem gelöst.
Es lag nicht an der Klasse, die ist komplett in Ordnung.
Vor 3 Min lese ich noch Luckies Tut durch und lese was von Object.Create;
Bei durchlesen des Codes, der das Objekt erzeugt, finde ich dann das hier:
Delphi-Quellcode:
result.Create(stream, sname, resMessage);
*schäm*
Ich bin Überrascht, dass der Fehler an dieser Stelle aufgetreten ist ...
Aber Danke,

mfG

Markus

Union 16. Jun 2006 11:30

Re: [gelöst] EAccessViolation bei Zugriff auf Boolean in Cre
 
Hi,

bei mir tritt der Fehler nicht auf. Sowohl bei D7 (wenn man die Keyword var wegläßt) als auch bei D2006. Vielleicht startest Du noch mal die IDE neu?

So habe ich es aufgerufen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Df : TDataFile;
  Ms : TMemoryStream;
  Sm : Byte;
begin
  Sm := 77;
  Ms := TMemoryStream.Create;
  Df := TDataFile.Create(Ms, 'BlaBla', Sm);
  Df.Free;
  Ms.Free;
end;
Auch ein Aufruf vom Create ohne Parameter funktioniert. Aber vielleicht tritt der Fehler auch ganz woanders auf. Hast Du es schon mal mit dem Debugger durchgesteppt?

Hawkeye219 16. Jun 2006 11:39

Re: [gelöst] EAccessViolation bei Zugriff auf Boolean in Cre
 
@Union

Der Fehler resultierte aus einem falschen Aufruf. Mit deinen Variablen sähe das etwa so aus:

Delphi-Quellcode:
Df.Create (...)
Markus hat seinen Fehler ja inzwischen erkannt.

Mit deinem Code wird es aber auch ein Problem geben: der übergebene MemoryStream geht in den Besitz des TDataFile-Objekts über und darf außerhalb des Objekts nicht freigegeben werden.

Gruß Hawkeye


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