Autor Beitrag
xman236
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: Di 19.10.10 21:47 
Das ist meine Kugel Klasse.
ausblenden volle Höhe 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
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
xman236 Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: Di 19.10.10 23:34 
Aber Kugel1, was ich erzeugen moechte, habe ich deklariert.
Was heisst denn existieren?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 19.10.10 23:56 
Dein Timer läuft nicht vor Du Button2 gedrückt hast?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 20.10.10 10:29 
*vermut*

in TKugel.Create solltest du auch die Billardkugeln erstellen.

ausblenden 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.

ausblenden 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 ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)