![]() |
[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:
So, nun das Problem: In der Zeile
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; 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:
Vielen Dank schon im Voraus für eure Hilfe!
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; mfG Markus |
Re: EAccessViolation bei Zugriff auf Boolean-Variable in Cre
Zitat:
Tritt das Problem auch beim direkten Aufruf des Basiskonstruktors auf? |
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:
*schäm*
result.Create(stream, sname, resMessage);
Ich bin Überrascht, dass der Fehler an dieser Stelle aufgetreten ist ... Aber Danke, mfG Markus |
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:
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?
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; |
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:
Markus hat seinen Fehler ja inzwischen erkannt.
Df.Create (...)
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