Entweder Du tolerierst das oder Du lässt den Ball noch einen "Zwischenschritt" machen. In dem Fall versetzt Du ihn nicht um VersatzX, sondern um -Shape.Left bzw. die Differenz zwischen rechter Shapeseite und Clientbreite des Formulars.
[edit] Das war wahrscheinlich jetzt nicht so richtig verständlich, daher ein Beispiel mit einer lokalen Variablen (wieder nur die X-Achse, etwas Arbeit sollst Du ja noch haben *g*), das macht es leichter:
Delphi-Quellcode:
var
X: integer;
begin
X := VersatzX;
if X < 0 then //Ball bewegt sich nach links
begin
if Shape1.Left < -X then
X := -Shape1.Left;
end
else //Ball bewegt sich nach rechts
begin
if ClientWidth < (Shape1.Left + Shape1.Width + X) then
X := ClientWidth - (Shape1.Left + Shape1.Width);
end;
Shape1.Left:= Shape1.Left + X;
(* Hier dann noch dasselbe für die Y-Achse, die Kollisionskontrolle und ggf. das Umdrehen des Vorzeichens *)
end;