AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte bewegen

Ein Thema von Luki206 · begonnen am 14. Feb 2014 · letzter Beitrag vom 16. Feb 2014
Antwort Antwort
Luki206
(Gast)

n/a Beiträge
 
#1

Objekte bewegen

  Alt 14. Feb 2014, 22:02
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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Objekte bewegen

  Alt 14. Feb 2014, 23:30
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Objekte bewegen

  Alt 14. Feb 2014, 23:46
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 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 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#4

AW: Objekte bewegen

  Alt 16. Feb 2014, 11:18
Ok danke. Hat mir sehr geholfen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Objekte bewegen

  Alt 16. Feb 2014, 14:16
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.
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#6

AW: Objekte bewegen

  Alt 16. Feb 2014, 14:28
Haha, ok vielen dank
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Objekte bewegen

  Alt 16. Feb 2014, 14:50
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Objekte bewegen

  Alt 16. Feb 2014, 18:20
s.h.a.r.k hatte mal einen netten Effekt (mit abprallen) umgesetzt: http://www.delphipraxis.net/156662-t...-fluessig.html
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz