| Autor |
Beitrag |
xman236
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: Di 19.10.10 21:47
Das ist meine Kugel Klasse.
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); 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 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 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 Gausi: Quote- durch Delphi-Tags ersetztModeriert von Narses: Topic aus Dateizugriff verschoben am Di 19.10.2010 um 22:52
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: Di 19.10.10 23:34
Aber Kugel1, was ich erzeugen moechte, habe ich deklariert.
Was heisst denn existieren?
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 19.10.10 23:56
Dein Timer läuft nicht vor Du Button2 gedrückt hast?
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.10.10 06:15
xman236 hat folgendes geschrieben : | 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. 
|
|
Xion
      

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)
|
Verfasst: 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
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)
|
|
|