AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [gelöst] EAccessViolation bei Zugriff auf Boolean in Create?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von markusj · begonnen am 16. Jun 2006 · letzter Beitrag vom 16. Jun 2006
Antwort Antwort
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: EAccessViolation bei Zugriff auf Boolean-Variable in Cre

  Alt 16. Jun 2006, 12:05
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?
Markus Kinzler
  Mit Zitat antworten Zitat
markusj

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

Re: EAccessViolation bei Zugriff auf Boolean-Variable in Cre

  Alt 16. Jun 2006, 12:14
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:
result.Create(stream, sname, resMessage); *schäm*
Ich bin Überrascht, dass der Fehler an dieser Stelle aufgetreten ist ...
Aber Danke,

mfG

Markus
Markus
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 16. Jun 2006, 12:30
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 16. Jun 2006, 12:39
@Union

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

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
  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 09:59 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