Einzelnen Beitrag anzeigen

markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#1

[gelöst] EAccessViolation bei Zugriff auf Boolean in Create?

  Alt 16. Jun 2006, 11:46
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
Markus
  Mit Zitat antworten Zitat