Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Objekte bewegen (https://www.delphipraxis.net/179109-objekte-bewegen.html)

Luki206 14. Feb 2014 21:02

Objekte bewegen
 
Hi,
Ich denke mal ich bin hier richtig. Meine Frage: ich weiß wie man Objekte verschieben kann, nur wie mache ich das mit VCL dass es so ein fade Effekt gibt, dass das Objekt nicht 'hüpft' sonder an die gewünschte Stelle verschoben wird. Ich habe mir auch ein paar gedankten gemacht das ich das vllt. mit einer for Schleife zu lösen ist aber ich glaube ich bin auf dem Holzweg.
Danke
Luki :)

Popov 14. Feb 2014 22:30

AW: Objekte bewegen
 
Du mußt den Verbschiebevorgang unterteilen. Hier ein Beispiel mit Timer.

Für das Beispiel brauchst du einen Timer und einen Button:
Delphi-Quellcode:
const
  AnzahlSchritte = 10;

var
  VerschiebenUm: Integer = 0;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 40;
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Tag := AnzahlSchritte; // 10'er Schritte
  VerschiebenUm := 500; //Anzahl Pixel
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Timer1.Tag > 0 then
  begin
    Timer1.Tag := Timer1.Tag - 1;
    Button1.Left := Button1.Left + (VerschiebenUm div AnzahlSchritte);
  end
  else
  begin
    Timer1.Enabled := False;
    VerschiebenUm := 0;
  end;
end;

Sir Rufo 14. Feb 2014 22:46

AW: Objekte bewegen
 
Und hier die Erklärung, warum hier ein Timer genutzt werden soll/muss:

Zunächst einmal Terminologie: Diese "Objekte" heißen Controls (die Basis dafür ist Delphi-Referenz durchsuchenTControl).

Das VCL-Framework arbeitet wie folgt:

Ändert sich etwas an einem Control, dass für die Darstellung relevant ist, dann wird dieses Control für das erneute Zeichnen vorgemerkt (Delphi-Referenz durchsuchenTControl.Invalidate).
Dieses Neuzeichnen erfolgt genau dann, wenn die Anwendung in den Idle-Zustand kommt.
Der Idle-Zustand wird immer dann erreicht, wenn die Nachrichten-Warteschlange komplett abgearbeitet wurde.

Beim Aufruf einer Routine wird diese Warteschlange nicht abgearbeitet.
Man kann dieses erzwingen durch den Aufruf von
Delphi-Quellcode:
Application.ProcessMessages
(Delphi-Referenz durchsuchenTApplication.ProcessMessages) innerhalb der Routine.

Ein Neuzeichnen kann man auch direkt erzwingen durch den Aufruf von Delphi-Referenz durchsuchenTControl.Repaint.

Das ist aber alles insgesamt nicht zu empfehlen, denn die Anwendung reagiert entweder evtl. unkontrolliert durch
Delphi-Quellcode:
Application.ProcessMessages
(Mehrfachaufruf der Bewegungsroutine) oder reagiert auf gar nichts mehr, bis die Routine abgearbeitet ist.

Eine Anwendung soll aber in keinem Fall unkontrolliert oder eingefroren wirken.
Generell soll eine Anwendung im UI (User Interface) immer reagieren können und bei Bedarf nur gewisse Aktionen verbieten.

Luki206 16. Feb 2014 10:18

AW: Objekte bewegen
 
Ok danke. Hat mir sehr geholfen ;)

Popov 16. Feb 2014 13:16

AW: Objekte bewegen
 
Wenn du das nicht so ruckartig haben willst, sondern noch gefedert, dann kannst du das machen:
Delphi-Quellcode:
const
  AnzahlSchritte = 12;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 40;
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Tag := AnzahlSchritte;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Timer1.Tag > 0 then
  begin
    Timer1.Tag := Timer1.Tag - 1;
    Button1.Left := Button1.Left + Sqr(Timer1.Tag);
  end
  else
    Timer1.Enabled := False;
end;
Der Button startet schnell und wird zum Ende langsamer. Netter Effekt.

Luki206 16. Feb 2014 13:28

AW: Objekte bewegen
 
Haha, ok vielen dank ;) :D

Sir Rufo 16. Feb 2014 13:50

AW: Objekte bewegen
 
Dafür bietet sich ja auch eine generelle Klasse an, die das Bewegen von Controls übernimmt, sonst sieht man irgendwann den Wald vor lauter Bäumen (Timern) nicht mehr ;)

stahli 16. Feb 2014 17:20

AW: Objekte bewegen
 
s.h.a.r.k hatte mal einen netten Effekt (mit abprallen) umgesetzt: http://www.delphipraxis.net/156662-t...-fluessig.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz