Entwickler-Ecke

Sonstiges (Delphi) - Zugriffsverletzung bei Adresse...


xman236 - Di 19.10.10 21:47
Titel: Zugriffsverletzung bei Adresse...
Das ist meine Kugel Klasse.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
unit mKugel;

interface

uses
mBaukasten1, mBillardtisch1, Forms, Graphics,StdCtrls,ExtCtrls;

type TKugel = class  (TKreis)

private
zZF : TForm;
zX : integer;
zY : integer;
zR : integer;
zFarbe : TColor;
zT : real;
zRT : real;
zXRichtung : real;
zYRichtung : real;
hTimer: TTimer;
public

constructor Create (Zeichenflaeche: TForm; XPos, YPos, Radius: Integer;Tempo,Richtung:Real; Farbe: TColor);
procedure bewegen(sender : TObject);
end;

type TBillardkugel = class  (TKugel)
 private
  zZF : TForm;
zX : integer;
zY : integer;
zR : integer;
zFarbe : TColor;
zT : real;
zRT : real;
zXRichtung : real;
zYRichtung : real;
hTimer: TTimer;


 public
   kKugel1,kKugel2 : TBillardkugel;
   procedure bewegen(sender : TObject);//override;
   function Abstandvon(Kugel:TBillardkugel):real;
   function Kollidiertmit(Kugel:TBillardkugel):boolean;
   procedure Abstossen(Kugel:TBillardkugel);
   procedure kennt(Kugel : TBillardkugel);
   constructor Create(Zeichenflaeche: TForm; XPos, YPos, Radius: Integer;Tempo,Richtung:Real; Farbe: TColor);
end;

implementation

constructor TKugel.Create (Zeichenflaeche: TForm; XPos, YPos, Radius: Integer;Tempo,Richtung:Real; Farbe: TColor);
begin
inherited Create(Zeichenflaeche, XPos, YPos, Radius, Farbe);
zZF:= Zeichenflaeche;
zX := XPos;
zY := YPos;
zR := Radius;
zT := Tempo;
zRT := Richtung;
zFarbe := Farbe;
zXRichtung := cos(0.017453292*zRT)*zT ;
zYRichtung := sin(0.017453292*zRT)*zT ;

hTimer := TTimer.Create(nil);
hTimer.Enabled := False;
hTimer.Interval := 5;
hTimer.OnTimer := bewegen;

end;

constructor TBillardKugel.Create (Zeichenflaeche: TForm; XPos, YPos, Radius: Integer;Tempo,Richtung:Real; Farbe: TColor);
begin
 inherited Create(Zeichenflaeche, XPos, YPos, Radius, Farbe);
zZF:= Zeichenflaeche;
zX := XPos;
zY := YPos;
zR := Radius;
zT := Tempo;
zRT := Richtung;
zFarbe := Farbe;
zXRichtung := cos(0.017453292*zRT)*zT ;
zYRichtung := sin(0.017453292*zRT)*zT ;

hTimer := TTimer.Create(nil);
hTimer.Enabled := False;
hTimer.Interval := 5;
hTimer.OnTimer := bewegen;
end;

procedure TKugel.bewegen(sender : TObject);
var
zXReal : real;
zYReal : real;
begin

zXReal := LiesXposition;
zYReal := LiesYposition;

zXReal     := zXReal+zXRichtung;
zYReal     := zYReal+zYRichtung;

if(zXReal+zR>=zZF.clientwidth)
  then
 begin
  zXRichtung:=-zXRichtung;
  end;
if(zXReal-zR<=0)
  then
 begin
  zXRichtung:=-zXRichtung;
  end;
if(zYReal+zR>=zZF.Clientheight)
  then
 begin
  zYRichtung:=-zYRichtung;
  end;
if(zYReal+zR>=0)
  then
 begin
  zYRichtung:=-zYRichtung;
  end;

SetzePosition(Round(zXReal),Round(zYReal));

end;

 function TBillardkugel.Abstandvon(Kugel:TBillardkugel):real;
   var
    Xreal,Yreal:integer;
   begin
    Xreal:= zX-Kugel.LiesXPosition;
    Abstandvon:=sqrt((Xreal*Xreal)+(Yreal*Yreal))
   end;

   procedure TBillardkugel.Abstossen(Kugel:TBillardkugel);
   var
    XKugel,YKugel : real;
   begin
    XKugel:=Kugel.zXRichtung;
    YKugel:=Kugel.zYRichtung;
    Kugel.zXRichtung:=self.zXRichtung;
    Kugel.zYRichtung:=self.zYRichtung;
    self.zXRichtung:=xKugel;
    self.zYRichtung:=YKugel;

   end;

   procedure TBillardkugel.kennt(Kugel : TBillardkugel);
   begin
    if(kKugel1=nil)
     then kKugel1:=Kugel
     else kKugel2:=Kugel;
   end;

   function TBillardkugel.Kollidiertmit(Kugel:TBillardkugel):boolean;
    begin
     if Abstandvon(Kugel)<2*zR
      then Kollidiertmit := true
      else Kollidiertmit := false;

     end;


   procedure TBillardkugel.bewegen;
    begin
     if kKugel1<>nil
     then
      if (Kollidiertmit(kKugel1)=true)
      then Abstossen(kKugel1);
      inherited bewegen(kKugel2);
     if kKugel2<>nil
     then
      if (Kollidiertmit(kKugel2)=true)
      then Abstossen(kKugel2) ;

     inherited bewegen(kKugel2);
    end;



end.


Das ist meine Main-Klasse

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
unit mtest1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,mBillardtisch1,mKugel, ExtCtrls,mBaukasten1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
   Billardtisch  : TFrmBillardtisch1 ;
   Kugel : TKugel ;
   Kugel1 : TBillardKugel;
   Kugel2 : TBillardKugel;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Billardtisch := TFrmBillardtisch1.Create (Form1);
 Billardtisch.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Kugel:=TKugel.Create (Billardtisch,30,30,10,15,2.5,clGreen);
 Kugel.zeichnen;
 Kugel1:=TBillardKugel.Create (Billardtisch,50,100,10,15,2.5,clRed);
 Kugel1.zeichnen;
 Kugel2:=TBillardKugel.Create (Billardtisch,150,300,10,15,2.5,clGreen);
 Kugel2.zeichnen;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

timer1.enabled :=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
kugel.bewegen(Kugel);

end;

end.


Wenn ich das Programm starte und auf Kugel erzeugen druecke, bekomme ich
Fehlermeldung, Zugriffsverletzung bei Adresse...
Kann einer mir helfen?

Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Di 19.10.2010 um 22:52


platzwart - Di 19.10.10 22:48

Ohne deinen Quellcode näher betrachtet zu haben: Die Meldung kommt in der Regel dann, wenn du auf ein Objekt zugreifen willst, das nicht existiert.


xman236 - Di 19.10.10 23:34

Aber Kugel1, was ich erzeugen moechte, habe ich deklariert.
Was heisst denn existieren?


bummi - Di 19.10.10 23:56

Dein Timer läuft nicht vor Du Button2 gedrückt hast?


jaenicke - Mi 20.10.10 06:15

user profile iconxman236 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das Programm starte und auf Kugel erzeugen druecke, bekomme ich
Fehlermeldung, Zugriffsverletzung bei Adresse...
Drückst du denn auch auf Billiardtisch erzeugen? Schließlich verwendest du diese Variable in Kugel erzeugen. ;-)

Ansonsten: In welcher Zeile kommt denn die Schutzverletzung, wenn du zeilenweise debuggst (Haltepunkt, Einzelschritt und so)? Und ist da ein Objekt nil?

Da du die Adresse nicht mit angegeben hast, lässt sich nicht genau sagen, ob es ein Zugriff auf ein nicht erzeugtes Objekt oder etwas anderes ist. :nixweiss:


Xion - Mi 20.10.10 10:29

*vermut*

in TKugel.Create solltest du auch die Billardkugeln erstellen.


Delphi-Quelltext
1:
kKugel1 := TBillardkugel.Create;                    


Ne Moment...wenn ich mich nicht ganz irre hat jede Kugel wieder 2 Billardkugeln...was auch Kugeln sind...da ist was faul.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type TBillardkugel = class  (TKugel)
 private
   //...
 public
   kKugel1,kKugel2 : TBillardkugel;
end;


Hmm, scheint doch ok zu sein :P

Ich bin etwas verwirrt...du generierst auch mit jeder Kugel einen Timer *nicht mehr durchblickt*

Vielleicht solltest du das ganze etwas strukturierter angehen. Einen Timer zum Bewegen von ALLEN Kugeln. Kollissionserkennung als Schleife. Irgendwie kann dein Programm ja irgendwie nur 3 Kugeln (?) auf einmal? Sonst kriegst du eventuell Endlosschleifen...naja, wie gesagt, ich blick nicht ganz durch ;)