Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: PfannkuPlus - Mein erstes Programm

  Alt 26. Apr 2006, 12:04
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 Delphi-Referenz durchsuchenSleep 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.
  Mit Zitat antworten Zitat