![]() |
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. |
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:
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 ?!?
Test := TTest.Create(nil);
Roderich |
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. |
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 |
Re: Zugriffsverletzung - Warum?
Moin Hagi,
Zitat:
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 ;-) |
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?
|
Re: Zugriffsverletzung - Warum?
Jetzt hats doch noch funktioniert. Danke für eure Hilfe
|
Re: Zugriffsverletzung - Warum?
Zitat:
|
Re: Zugriffsverletzung - Warum?
Neolithos hat Recht (was ich auch vermutet hatte): dieser Code erzeugt keine AV:
Delphi-Quellcode:
Da die Methode immer im Code-Segment vorhanden ist, braucht MyClass nicht assigned zu sein. Knatschen würde dagegen
MyClass := nil;
MyClass.CallMyProcedure(Dingens);
Delphi-Quellcode:
sauber fänd ich es trotzdem nicht, die Instanz nicht zu erzeugen, aber ihre Methoden aufzurufen.
MyClass := nil;
MyClass.MyProp := 0; Roderich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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 by Thomas Breitkreuz