![]() |
Memo animieren...
Hallo,
gerade habe ich ein Memo in mein Form eingebunden, welches ich nun auf Buttonclick hin verschwinden lassen will. Allerdings soll diese Aktion animiert sein, also am besten sollte das memo in den linken Rand des Programmes fahrren, also nach links sliden. Mit nochmaligem Click auf denselben Button soll das Memo wieder herausfahren. Wie ist sowas in Delphi umsetzbar? (Sorry für die vielen Fragen, aber mein bestelltes Delphi Buch ist noch nicht da und schließlich ist dies ein Hilfeforum:-)) Vielen Dank, Jan |
Re: Memo animieren...
Du könntest ja sowas machen
Delphi-Quellcode:
Ist ungetestet aber so ungefähr sollte es gehn. Zumindest mit dem verschwinden. Das auftauchen ist ja praktisch das gleiche nur umgekehrt ;)
procedure TForm1.Button1Click(Sender : TObject);
begin repeat Memo1.Left := Memo1.Left -1; sleep(10); until Memo.Left = -50; end; end; |
Re: Memo animieren...
Hallo Benjin,
ich wuerde es mit Timern machen:
Delphi-Quellcode:
Erklaerungen:
const
TimeOut = 5; Step = 2; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Tag := Memo1.Left; Timer1.Enabled := False; Timer2.Enabled := False; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer2.Enabled := False; Timer1.Interval := TimeOut; Timer1.Enabled := True; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled := False; Timer2.Interval := TimeOut; Timer2.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; Memo1.Left := Memo1.Left-Step; Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0; if not Timer1.Enabled then ShowMessage('Done'); end; procedure TForm1.Timer2Timer(Sender: TObject); begin Timer2.Enabled := False; Memo1.Left := Memo1.Left+Step; Timer2.Enabled := Memo1.Left < Memo1.Tag; if not Timer2.Enabled then ShowMessage('Done'); end;
Die if-Abfrage mit ShowMessage kannst du auch entfernen, sie ist nur zur Demonstration da, damit du siehst dass das Memo auch aufhoert sich nach links zu bewegen ;) Greetz alcaeus |
Re: Memo animieren...
Hi,
die erste Version ist etwas unkomfortabel, da sie mit absoluten Positionen arbeitet so weit ich das sehe. Funktioniert aber super, danke. Hab im Endeffekt die Lösung mit den Timern übernommen, welche super arbeitet. Da das jedoch meine erste Arbeit mit Timern ist, noch ein paar Fragen an alcaeus: Was ist Memox.tag? Und kannst du die Timerfunktionen in der Aufrufprozedur der Timer noch mal ausführlicher erklären, was da nach entsprechenden Anweisungen passiert?
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin Timer1.Enabled := False; Memo1.Left := Memo1.Left-Step; Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0; if not Timer1.Enabled then ShowMessage('Done'); end; Vielen Dank!! |
Re: Memo animieren...
Also:
Delphi-Quellcode:
zuerst wird er Timer ausgeschaltet,...
Timer1.Enabled := False;
Delphi-Quellcode:
...,dann wird das Memo bewegt...
Memo1.Left := Memo1.Left-Step;
Delphi-Quellcode:
...,wenn das Memo noch zu sehen ist muss ja der Timer weiterlaufen, damit bei einem weitern Inervall es sich bewegt (in diesem fall gibt die Klammer einen Boolean mit true zurück)...
Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0;
Delphi-Quellcode:
...und schließlich wird noch überprüft, ob das Memo schon von der Fläche weg ist (trifft ja dann ein, wenn die Überprüfung von oben false ist).
if not Timer1.Enabled then
ShowMessage('Done'); Ich hoff, ich konnt dir helfen. |
Re: Memo animieren...
Zitat:
![]() Zitat:
Delphi-Quellcode:
Das muss nicht unbedingt sein, aber ich hab mir angewoehnt, die Timer auszumachen waehrend der Event-Handler laeuft, nur falls der Code im Handler laenger dauert als ein Timer-Intervall. Ist hier zwar nicht der Fall, aber Gewohnheit :zwinker:
Timer1.Enabled := False;
Delphi-Quellcode:
Hier wird einfach der vorgegebene Wert von der linken Position des Memos abgezaehlt.
Memo1.Left := Memo1.Left-Step;
Delphi-Quellcode:
Hier wirds komplizierter. Wir duerfen den Timer naemlich nur einschalten, wenn das Memo noch sichtbar ist. Nachdem wir es nach links schieben, ueberpruefen wir, ob die rechte Kante des Memos noch im Form ist, also der Wert > 0. Die Position der rechten Kante errechnet sich aus linker Kante + Breite. Und um alles kuerzer zu machen, weisen wir den Wert dieser Abfrage (=Boolean) der Enabled-Property des Timers zu. Ist die Bedingung wahr, also das Memo noch sichtbar wird der Timer wieder eingeschaltet, sonst bleibt er aus.
Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0;
Delphi-Quellcode:
Wie gesagt...das ist nur zur Kontrolle dass alles ordnungsgemaess laeuft und auch wieder aufhoert.
if not Timer1.Enabled then
ShowMessage('Done'); Greetz alcaeus |
Re: Memo animieren...
Vielen Dank für die Erklärung....
Sieht auf jeden Fall sehr schön aus die Animation. Jan |
Re: Memo animieren...
Nur noch um des einzuwerfen was vieleicht etwas OT ist:
Do solltest den Memo DoubleBufferen damit der Bildaufbau fliesender ist.
Delphi-Quellcode:
Ungetestet ! Ich hof ich habs richtig geschrieben weil ich komm grad an kein Delphi ran.
procedure TForm1.FormCreate(Sender: TObject);
begin Memo.DoubleBuffer := true; end; |
Re: Memo animieren...
Hallo gsh,
ich habs bei mir nicht gebraucht. Bei Memo-Verschieben brauchst du IMHO kein DoubleBuffered, da ja nicht so viel neu gezeichnet wird (außer du lässt es in einem großen Form über zigtausende Komponenten laufen :roll:) Greetz alcaeus |
Re: Memo animieren...
Zitat:
-NIP- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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 by Thomas Breitkreuz