Hallo.
Dein ursprünglicher Denkfehler liegt darin, dass du bei Berührung mit dem Rand nur einmal in die andere Richtugn verschiebst.
Beispiel: Das Image berührt das Fenster am linken Rand. Also bewegst du es nach rechts. Dann berührt es den rand aber nicht mehr und es wird wieder nach links bewegt etc...
Durch die vier Timer wird dein Programm unnötig komplex. Ich habe dir mal ein kleines Beispiel geschrieben, das mit nur einem Timer auskommt. Den Bewegungsvektor merkt sich das Programm in einem TPoint. Bei Kollision wird dieser vektor dann angepasst.
Delphi-Quellcode:
type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
bewegung: tpoint;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// timer1.enabled wird umgekehrt, aus True wird False, aus False wird True
timer1.Enabled := not timer1.Enabled;
// Prüfen ob Timer läuft und Caption anpassen
if timer1.Enabled then
button1.Caption := 'Halt!'
else
button1.Caption := 'Lauf!';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// bewegung initialisieren
bewegung := point(3,3); // 3 nach rechts, 3 nach unten
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Kollision Links
if image1.Left <=0 then
bewegung.X := 3;
// Kollision Rechts
if image1.Left+image1.Width >= ClientWidth then
bewegung.X := -3;
// Kollision Oben
if image1.Top <=0 then
bewegung.Y := 3;
// Kollision Unten
if image1.Top+image1.height >= ClientHeight then
bewegung.Y := -3;
// Bewegung ausführen
image1.Left := image1.Left+bewegung.X;
image1.Top := image1.Top+bewegung.Y;
end;
Edit: Bist du sicher, dass du Delphi für .NET verwendest? Das erste Delphi,d as .NET unterstütze war Delphi 8. Du schreibst aber, du benutzt unter anderem Delphi 7.