Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung - Warum? (https://www.delphipraxis.net/18794-zugriffsverletzung-warum.html)

hagi2 24. Mär 2004 17:52


Zugriffsverletzung - Warum?
 
Steht die Deklaration von SpielfeldF in Unit2 in der Procedure (ich hab es jetzt mal mit Kommentar markiert), dann läuft alles. Verschieb ich die Deklaration in die Klasse TTest, dann kommt eine Zugriffsverletzung. Warum? Was ist da falsch? Wär nett, wenn mir das jemand sagen könnte...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Test: TTest;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Test.anzeigen(Form1, Form1);
end;

end.
Delphi-Quellcode:
unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
TTest = class
  procedure anzeigen(Formular: TComponent; Kontrolle: TWinControl);
  end;



implementation
procedure TTest.anzeigen(Formular: TComponent; Kontrolle: TWinControl);
var
//SpielfeldF: TImage;
begin
SpielfeldF := TImage.Create(Formular);
SpielfeldF.Parent := Kontrolle;
SpielfeldF.Width := 200;
SpielfeldF.Height := 400;
SpielfeldF.Top := 100;
SpielfeldF.Left := 200;
SpielfeldF.Visible := true;

SpielfeldF.Canvas.Pen.Color := RGB(100,100,100);
SpielfeldF.Canvas.Rectangle(0,0,SpielfeldF.Height, SpielfeldF.Width);
end;
 end.

roderich 24. Mär 2004 18:09

Re: Zugriffsverletzung - Warum?
 
hallo hagi2,

so vom blosen Hingucken: du mußt die Instanz Test vom Typ TTest erst erzeugen, z.B. mit

Delphi-Quellcode:
  Test := TTest.Create(nil);
wobei die Frage berechtigt ist, warum es eine AV gibt, wo TTest keine Variablen besitzt, die Methoden aber bekannt sein müßten, auch wenn Test nil ist ?!?

Roderich

hagi2 24. Mär 2004 19:44

Re: Zugriffsverletzung - Warum?
 
Moment. So wies jetzt da steht funktionierts ja. Da gehts auch ohne Create und TTest besitzt wirklich keine Variablen.
Aber: Ich will ja, dass die Deklaration "SpielfeldF: TImage;" direkt in TTest steht.
Dann hat TTest eine Variable und dann funktionierts nicht mehr(Acess Violation)! Ich weiss nicht warum und hab scho mehrmals dran rumgebastelt, aber es ändert nix.

Sanchez 24. Mär 2004 20:29

Re: Zugriffsverletzung - Warum?
 
hallo,

Mich wundert es stark, dass es ohne Create gehen soll. Du musst doch Test erzeugt haben.
Schau mal was passiert, wenn SpielFeldF eine Klassenvariable ist und du Test erzeugst

grüße, daniel

Christian Seehase 24. Mär 2004 22:15

Re: Zugriffsverletzung - Warum?
 
Moin Hagi,

Zitat:

Zitat von hagi2
So wies jetzt da steht funktionierts ja.

das stimmt zwar (ich hab's mal ausprobiert), aber ich kann mir beim besten Willen nicht erklären warum :gruebel:
Eigentlich müsste der Aufruf eine Exception erzeugen (Acces Violation), da die Variable Test den Wert nil enthält.
Da scheint der Compiler "Gnade vor Recht" ergehen zu lassen ;-)

hagi2 25. Mär 2004 12:08

Re: Zugriffsverletzung - Warum?
 
Ok, aber was ist jetzt wenn ich die Deklaration direkt in die Klasse verschieb. Warum gehts dann nicht mehr, und wie gehts wieder?

hagi2 25. Mär 2004 17:04

Re: Zugriffsverletzung - Warum?
 
Jetzt hats doch noch funktioniert. Danke für eure Hilfe

neolithos 25. Mär 2004 17:13

Re: Zugriffsverletzung - Warum?
 
Zitat:

Zitat von Christian Seehase
das stimmt zwar (ich hab's mal ausprobiert), aber ich kann mir beim besten Willen nicht erklären warum :gruebel:
Eigentlich müsste der Aufruf eine Exception erzeugen (Acces Violation), da die Variable Test den Wert nil enthält.
Da scheint der Compiler "Gnade vor Recht" ergehen zu lassen ;-)

Er läßt nicht Gnade vor Recht ergehen, sondern der Code greift nicht auf Self zu, welches NIL ist.

roderich 25. Mär 2004 17:46

Re: Zugriffsverletzung - Warum?
 
Neolithos hat Recht (was ich auch vermutet hatte): dieser Code erzeugt keine AV:

Delphi-Quellcode:
MyClass := nil;
MyClass.CallMyProcedure(Dingens);
Da die Methode immer im Code-Segment vorhanden ist, braucht MyClass nicht assigned zu sein. Knatschen würde dagegen

Delphi-Quellcode:
MyClass := nil;
MyClass.MyProp := 0;
sauber fänd ich es trotzdem nicht, die Instanz nicht zu erzeugen, aber ihre Methoden aufzurufen.

Roderich


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