Autor Beitrag
moonwalker
Hält's aus hier
Beiträge: 6


D3 Pro
BeitragVerfasst: Sa 26.02.05 16:03 
Ich will ein Programm schreiben, wo ein Ball von links nach rechts und von rechts wieder nach links läuft!
Hier mal der Code den ich dazu geschrieben habe:

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Timer1: TTimer;
    Timer2: TTimer;
        procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  dx: Integer;
implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
begin
Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
dx:=1;
If Form1.Width-Shape1.Width<Shape1.Width
   then
   Begin
   Timer1.Enabled:=false;
   Timer2.Enabled:=true
   end
   else
   Shape1.Width:=Shape1.Width+dx

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
dx:=1;
If Shape1.Width-Form1.Width<Shape1.Width
then
Begin
Timer2.Enabled:=false;
Timer1.Enabled:=true
end

else
Shape1.Width:=Shape1.Width-dx
end;

end.


Das Programm lässt sich auch starten, aber es gibt zwei Probleme, aus denne ich nicht schlau werde:

1. Der Ball wird bei Programmstart sichtbar größer.

2. Der Ball läuft nur einmal nach rechts und das war es dann auch schon!

Wenn ihr Lösungsvorschläge habt, dann immer her damit. Thx
OneOfTen
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 26.02.05 16:31 
moonwalker hat folgendes geschrieben:

1. Der Ball wird bei Programmstart sichtbar größer.

2. Der Ball läuft nur einmal nach rechts und das war es dann auch schon!


1. vielleicht änderst du nicht die Shape.Width, sondern die Shape.Left Eigenschaft, dann wird der Ball auch nicht größer :wink:

//EDIT
2. Die if-Bedingung in Zeile 52 wird nicht erfüllt, weil die Form.Width viel zu groß ist, probier daher lieber mal mit .Left rum, dann wird das ganze sicherlich klappen
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 16:46 
Anstatt zwei Timer, wie wärs mit ner Variablen "dx"? x := x + dx, und falls du über den linken oder rechten Rand bist machst du dx := -dx;

//Edit: Du hast ja sogar ne Variable, die dx heisst ;) Was für ein Zufall :D Jetzt musst du sie nur noch korrekt einsetzen.
moonwalker Threadstarter
Hält's aus hier
Beiträge: 6


D3 Pro
BeitragVerfasst: Sa 26.02.05 16:59 
[Edit] Habe die Edits überlesen, sry! Ich habe jetzt das Problem gelöst.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
dx:=1;
If Form1.width-Shape1.Left>Shape1.Left
then
Begin
Timer2.Enabled:=false;
Timer1.Enabled:=true
end
else
Shape1.Left:=Shape1.Left-dx


Danke für eure Tips! Haben mir sehr geholfen, glaube ich wäre sonst ausgerastet!


Zuletzt bearbeitet von moonwalker am Sa 26.02.05 17:21, insgesamt 1-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 17:15 
Willst du es unbedingt mit zwei Timern?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
 dx : integer = 10;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if (Shape1.Left+Shape1.Width > Form1.ClientWidth) or (Shape1.Left < 0) then
  dx := -dx;
 Shape1.Left := Shape1.Left + dx;
end;