![]() |
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 :) |
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; |
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 ![]() 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 ( ![]() 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
![]() Ein Neuzeichnen kann man auch direkt erzwingen durch den Aufruf von ![]() Das ist aber alles insgesamt nicht zu empfehlen, denn die Anwendung reagiert entweder evtl. unkontrolliert durch
Delphi-Quellcode:
(Mehrfachaufruf der Bewegungsroutine) oder reagiert auf gar nichts mehr, bis die Routine abgearbeitet ist.
Application.ProcessMessages
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. |
AW: Objekte bewegen
Ok danke. Hat mir sehr geholfen ;)
|
AW: Objekte bewegen
Wenn du das nicht so ruckartig haben willst, sondern noch gefedert, dann kannst du das machen:
Delphi-Quellcode:
Der Button startet schnell und wird zum Ende langsamer. Netter Effekt.
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; |
AW: Objekte bewegen
Haha, ok vielen dank ;) :D
|
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 ;)
|
AW: Objekte bewegen
s.h.a.r.k hatte mal einen netten Effekt (mit abprallen) umgesetzt:
![]() |
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