Hallo,
nettes Tool und sehr interessant, auf was für Gedanken manche kommen (das mit der versteckten Scrollbar, schon faszinierend, wenn auch sehr schlecht gelöst).
Du wirst dich mit der Rekursion noch nicht beschäftigt haben (Funktion/Prozedur, die sich selbst aufruft), doch damit kann man das sehr schön lösen. In den Stack (so eine Art Zwischenspeicher), werden die Werte für die Formularposition geschrieben und am Ende wieder rückwärts abgearbeitet, womit das Formular am Ende wieder vollautomatisch in die Ursprungsposition zurück gelangt.
Falls es dich interessiert, das kann man so lösen (ganz ohne Timer):
Delphi-Quellcode:
// Ersatz für sleep(), nur dass die Anwendung nicht einfriert
// Code ist aus der Code-Library
procedure Delay(Milliseconds: Integer);
var
Tick: DWord;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
Tick := GetTickCount + DWord(Milliseconds);
while (Milliseconds > 0) and
(MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
if Application.Terminated then Exit;
Milliseconds := Tick - GetTickcount;
end;
finally
CloseHandle(Event);
end;
end;
// eigentliche rekursive Prozedur
procedure MoveForm(FLeft, FTop, Count: Integer);
begin
if Count > 0 then
begin
// "Random(9) - 4" erzeugt einen Zufallswert zwischen -4 und 4
MoveForm(
Form1.Left + Random(9) - 4,
Form1.Top + Random(9) - 4,
Count - 1);
end;
Form1.Left := FLeft;
Form1.Top := FTop;
Delay(50);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MoveForm(Left, Top, 20);
end;
Die Prozedur
Delay ist, wie im Kommentar erwähnt, dazu da, um die Funktion
Sleep zu ersetzen, da Sleep die ganze Anwendung einfriert. Delay pausiert den Programmablauf (hier für 50 Millisekunden). Die "Rüttelprozedur" ist die zweite. Du siehst, das ist richtig schön kurz und sauber gelöst.

Im OnCreate der Form kannst du auch "Randomize" aufrufen, damit das Rütteln nicht immer das gleiche ist, doch ist dies in dem Falle ja eigentlich egal.

Mit dem 3. Parameter (Count) kannst du die Dauer des Rüttelns festlegen.
Falls du verständnisfragen dazu hast, kannst du sie gerne stellen. Mit versteckten Komponenten zu "spielen" ist nicht schön.