Autor Beitrag
masterofswim
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 19.02.11 14:28 
Hallo ich möchte gern Bälle nebeneinander darstellen.
Will das über ne Schleife lösen habe hier schon mal Änsätze:

Die Schleife ist in der Zeile 58 & 59.

Will sie im Abstand von ca. 100 Pixel ausgeben....

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:
 unit ULevel1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, {UBaelle,} UAuto, UCar, ExtCtrls, UBall;

type
  TFLevel1 = class(TForm)
    Fahren: TTimer;
    warten: TTimer;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormActivate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FahrenTimer(Sender: TObject);
    procedure wartenTimer(Sender: TObject);
  private
    { Private declarations }
  public
    zwarte:integer;
    procedure ballerstellen(x,y:integer;nummer:byte);
    procedure frei(nummer:byte);
    { Public declarations }
  end;

var
  FLevel1: TFLevel1;
  Ball : array [1..20of TBall;
 // Auto:Tauto;
  Auto: TCar;
implementation

{$R *.dfm}

procedure TFLevel1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin

end;

procedure TFLevel1.FormActivate(Sender: TObject);
var i,j:integer;
ballnummer:byte;
begin
FLevel1.Left:=0;
FLevel1.Top:=0;
FLevel1.Width:=Screen.WorkAreaWidth;
FLevel1.Height:=Screen.WorkAreaHeight; 
//Auto := TAuto.Create(FLevel1);
Auto:= TCar.create(Self);
Auto.Top:=clientheight div 2;
Auto.left:=clientwidth div 2;
Fahren.Enabled:=true;
ballnummer:=1;

for i:=1 to 10 do
ballerstellen(500*20,200,ballnummer+1);

end;

procedure TFLevel1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Auto<>nil then
  Auto.setRichtung(Key);
 If Key = 'q' then close; 
end;

procedure TFLevel1.FahrenTimer(Sender: TObject);
begin
 warten.Enabled:=false;
 case auto.getrichtung of
 'w' : auto.Top:=auto.Top-4;
 'a' : auto.left:=auto.left-4;
 's' : auto.Top:=auto.Top+4;
 'd' : auto.left:=auto.left+4;
 end;
 if Ball[1] <> nil then Ball[1].setAutoPos(Auto.Left,auto.Top);
end;

procedure TFLevel1.ballerstellen(x, y : integer;nummer:byte);
begin
 Ball[nummer] := TBall.create(self,auto, 500200,nummer);
 Ball[nummer].Left:=500;
 Ball[nummer].Top:=200;
end;

procedure TFLevel1.frei(nummer:byte);
begin
 Ball[nummer]:=nil;
end;

procedure TFLevel1.wartenTimer(Sender: TObject);

begin
 zwarte:=zwarte+1;
 if zwarte = 2 then fahren.Enabled:=true;
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 19.02.11 14:35 
Würde sich hier anbieten, anstatt Ballnummer die Laufvariable der For-Schleife zu nehmen.
Dadurch, dass du Ballnummer + 1 aufrufst, wird Ballnummer nicht "dauerhaft" um 1 erhöht. Dazu müsstest du Ballnummer := Ballnummer + 1 aufrufen =)
Versuchs mal so :
ausblenden Delphi-Quelltext
1:
2:
  for ballnummer:=1 to 10 do
    ballerstellen(500*20,200,ballnummer);


Lg
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 19.02.11 14:41 
Danke für den Tipp aber es wird trotzdem immernoch nur ein Ball dargestellt.

LG
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Sa 19.02.11 14:52 
Zitat:
Danke für den Tipp aber es wird trotzdem immernoch nur ein Ball dargestellt.


Das liegt daran, dass du alle Bälle aufeinander zeichnest. Versuch mal

ausblenden Delphi-Quelltext
1:
2:
  for ballnummer:=1 to 10 do
    ballerstellen(500*20+i*100,200,ballnummer);


Das zeichnet dir die Bälle alle nebeneinander im Abstand von 100 Pixel(linke Kante zu linke Kante).


e: Ich sehe grade deine Ballerstellenfunktion ist auch nicht wirklich sinnvoll, da du die Parameter im Konstruktor nicht verwendest. Ändere die mal zu:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFLevel1.ballerstellen(x, y : integer;nummer:byte);
begin
 Ball[nummer] := TBall.create(self,auto, x, y,nummer);
 Ball[nummer].Left:=x;
 Ball[nummer].Top:=y;
end;
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 19.02.11 15:00 
Jo da kommt ne Fehlermeldung Ungültige Gleitkommaoperation....
Bekomm noch ne Krise...:(
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 19.02.11 16:04 
user profile iconmasterofswim hat folgendes geschrieben Zum zitierten Posting springen:
Jo da kommt ne Fehlermeldung Ungültige Gleitkommaoperation....
Bekomm noch ne Krise...:(

Meine Glaskugel ist gerade etwas trübe. Wo?
Debug den Code und überlege zwei mal, weshalb an dieser Stelle eine Exception auftreten könnte. :P
masterofswim Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 19.02.11 17:10 
Ich bekomme es nicht raus.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 19.02.11 17:58 
Bei welcher Aktion erscheint denn der InvalidFloatPointOperation RunTime-Error? :nixweiss:

How to debug:
Setze je einen Breakpoint in die entsprechenden Methoden und steppe durch, bis du den Fehler gefunden hast.
Etwas ausführlicher wird das im Delphi-Treff unter dem Stichpunkt Debugger erklärt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.02.11 18:26 
Und den Fehler vermute ich einmal irgendwo bei einer Division. Vielleicht ist der Divisor (fast) Null, z.B. weil die Variable nicht initialisiert wurde.

Am schnellsten findest du das aber wie schon geschrieben wurde, wenn du einfach mal zeilenweise durchgehst und schaust was passiert.