AGB  ·  Datenschutz  ·  Impressum  







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

Unerklärliche Zugriffsverletzung

Ein Thema von MPeters · begonnen am 13. Apr 2023 · letzter Beitrag vom 14. Apr 2023
Antwort Antwort
MPeters

Registriert seit: 20. Nov 2022
9 Beiträge
 
#1

Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 09:23
Hallo,

ich bin gerade am Verzweifeln. Ich erhalte eine Zugriffsverletzung in folgendem Code:

Delphi-Quellcode:
constructor TVisibleTreeNode.Create(theParentBox:TAnchestorClass; theName,theImage:string; theX,theY:longint; theCaption:string);
var imgPtr: ImageType;
begin

  FParentBox := theParentBox;
  FName := theName;
  FLeft := theX;
  FTop := theY;
  FCaption := theCaption;
  FOnClick := @Click;

  imgPtr := LoadImage(theImage);
  
  FNodeImage := TVisibleNodeImage.Create(FParentBox,FName,FLeft,FTop,imgPtr.width,imgPtr.height,imgPtr,@ImageClick);
  inherited Create(FParentBox,FName,FLeft+FNodeImage.Width+6,FTop+7,theCaption);

  FClicked := false;
  FExpanded := false;

  FNode.VisibleClass := self; //AN DIESER STELLE DIE ACCESS VIOLATION
end;
Delphi-Quellcode:
  TVisibleTreeNode = class(TAnchestorClass)
  private
    FParentBox: TAnChestorClass;
    FLeft,
    Ftop,
    FWidth,
    FHeight: Integer;
    
    FName: String;
    FImage: String;
    FCaption: String;
    FClicked: Boolean;
    FExpanded: Boolean;
    FOnClick: TClickEvent;
    FNode: TNode;
    FNodeImage: TVisibleNodeImage;
    
    function GetCaption: String;
    procedure SetCaption(AValue: String);
    procedure SetImage(AValue: String);
    procedure SetLeft(AValue: Integer);
    procedure SetTop(AValue: Integer);
    procedure SetWidth(AValue: Integer);
    procedure SetHeight(AValue: Integer);
    procedure ImageClick(param: String);
  public
    constructor Create(theParentBox:TtuiBox; theName,theImage:string; theX,theY:longint; theCaption:string);

    procedure Click(Sender: TObject; mX, mY: Integer);
    property OnClick: TClickEvent read FOnClick write FOnClick;
  end;
Unten die Definition der Klasse und nun noch die Definition des Node:

Delphi-Quellcode:
  TNode = class(TObject)
  private
    FCompare: TCompareFunc;
    FCaption: String;
    FParent: TNode;
    FNext: TNode;
    FNumber: Integer;
    FSubnodes: TNodes;
    FVisibleClass: TObject;

    function GetCount: Integer;
    function GetNodes(Index: Integer): TNode;
  public
    constructor Create(aParent: TNode; CompareFunc: TCompareFunc; aCaption: String);
    destructor Destroy; override;

    procedure Add(ParentNode: TNode; aNode: TNode);
    procedure AddSubnode(aParentNode: TNode; aNode: TNode); //Neuen Sub Knoten hinzufügen

    property Caption: String read FCaption write FCaption;
    property Nodes[Index: Integer]: TNode read GetNodes; //Die Blätter
    property Count: Integer read GetCount; //Anzahl Blätter
    property Parent: TNode read FParent write FParent;
    property Next: TNode read FNext write FNext;
    property Number: Integer read FNumber write FNumber;
    [B]property VisibleClass: TObject read FVisibleClass write FVisibleClass;[/B]
  end;
Warum tritt dese Zugriffsverletzung hier auf?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 09:26
.. wo wird/wurde fNode denn erzeugt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Renate Schaaf

Registriert seit: 25. Jun 2020
Ort: Lippe
114 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 10:18
Zitat:
.. wo wird/wurde fNode denn erzeugt?
genau,
und so
Zitat:
FOnClick := @Click;
kann man event handlers nicht zuweisen, lass mal das @ weg.

Renate
Renate
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 11:23
Vor der Zuweisung von Self könnte man ja mal einfach prüfen, ob es FNode schon / überhaupt gibt:
Delphi-Quellcode:
if Assigned(FNode) then begin
  FNode.VisibleClass := self;
end else begin
  MessageDlg('Da hat jemand vergessen FNode zu erstellen.',mtError,[mbCancel],0);
end;
Oder per Haltepunkt und Debugger mal nachschauen, was da los ist.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 12:13
Die Prüfung kann man sich aber auch sparen, da FNode ein privates Feld ist und somit im Konstruktor initial nil ist. Es bleibt also nur, die Instanz vor der Zuweisung zu erzeugen oder eine bereits bestehende als Argument dem Konstruktor hinzuzufügen. Bei Letzterem würde eine entsprechende Prüfung dann auch wieder Sinn machen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MPeters

Registriert seit: 20. Nov 2022
9 Beiträge
 
#6

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 19:04
Zitat:
.. wo wird/wurde fNode denn erzeugt?
genau,
und so
Zitat:
FOnClick := @Click;
kann man event handlers nicht zuweisen, lass mal das @ weg.

Renate
Ist schon Ok! In Delphi darf das "@" Zeichen da nicht stehen, in Freepascal jedoch muss es das.
  Mit Zitat antworten Zitat
MPeters

Registriert seit: 20. Nov 2022
9 Beiträge
 
#7

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 19:06
.. wo wird/wurde fNode denn erzeugt?

Grüße
Klaus
Dake! Das war der Fehler. Nirgends wurde FNode erzeugt. Hatte ich beim Codieren übersehen und jetzt noch mal nachgeschaut.
  Mit Zitat antworten Zitat
MPeters

Registriert seit: 20. Nov 2022
9 Beiträge
 
#8

AW: Unerklärliche Zugriffsverletzung

  Alt 13. Apr 2023, 19:12
@Delphi.Narium +
Die Prüfung kann man sich aber auch sparen, da FNode ein privates Feld ist und somit im Konstruktor initial nil ist. Es bleibt also nur, die Instanz vor der Zuweisung zu erzeugen oder eine bereits bestehende als Argument dem Konstruktor hinzuzufügen. Bei Letzterem würde eine entsprechende Prüfung dann auch wieder Sinn machen.
Nun gut, mit so einer Prüfung hätte ich zumindest gesehen dass FNode noch gar nicht erzeugt wurde, was ja auch der Grund für die Exeption war. Ich war halt der Meinung, den FNode bereits in meinem Konstruktor erzeugt zu haben, was jedoch gerade nicht der Fall war. Erst jetzt aufgrund der Tipps hier noch mal im Konstriktor nach geschaut. Wald vor Bäumen nicht gesehen. Mehrmals vorher in den Konstruktor geguckt, aber die fehlende FNode Erzeugung war mir im Quellcode einfach nicht aufgefallen. Erst jetzt!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Unerklärliche Zugriffsverletzung

  Alt 14. Apr 2023, 09:09
Dake! Das war der Fehler. Nirgends wurde FNode erzeugt. Hatte ich beim Codieren übersehen und jetzt noch mal nachgeschaut.
Du hättest dann aber direkt beim Debuggen sehen müssen, dass der Wert nil ist, wenn du dort einen Haltepunkt setzt.
Sebastian Jänicke
AppCentral
  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 12:43 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