Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Memo animieren... (https://www.delphipraxis.net/40265-memo-animieren.html)

Benjin 13. Feb 2005 12:55


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

Neutral General 13. Feb 2005 12:59

Re: Memo animieren...
 
Du könntest ja sowas machen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
begin
  repeat
   Memo1.Left := Memo1.Left -1;
   sleep(10);
  until
   Memo.Left = -50;
  end;
end;
Ist ungetestet aber so ungefähr sollte es gehn. Zumindest mit dem verschwinden. Das auftauchen ist ja praktisch das gleiche nur umgekehrt ;)

alcaeus 13. Feb 2005 13:08

Re: Memo animieren...
 
Hallo Benjin,

ich wuerde es mit Timern machen:

Delphi-Quellcode:
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;
Erklaerungen:
  • die Konstanten "TimeOut" und "Step" regeln gemeinsam die Geschwindigkeit, spiel einfach damit rum bis sie dir passen. Je kleiner TimeOut und je groesser Step desto schneller fliegt das Memo rum.
  • Im OnCreate schalten wir die Timer mal aus und speichern die Position vom Memo.
  • Wird auf den ersten Button geklickt, so schalten wir den 2. Timer aus, d.h. wir stoppen eine evtl. Rechtsbewegung des Memos. Anschliessend setzen wir das Timeout fuer den Timer und schalten ihn ein. Analog verhaelt es sich mit Button2
  • Im OnTimer-Event schalten wir den Timer sicherheitshalber aus, ziehen Step von Memo1.Left ab, und schalten den Timer nur wieder ein, wenn die rechte Kante des Memos noch sichtbar ist. Analog geht es auch fuer Timer2.

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

Benjin 13. Feb 2005 14:23

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!!

Fourcorner 13. Feb 2005 14:33

Re: Memo animieren...
 
Also:

Delphi-Quellcode:
Timer1.Enabled := False;
zuerst wird er Timer ausgeschaltet,...

Delphi-Quellcode:
Memo1.Left := Memo1.Left-Step;
...,dann wird das Memo bewegt...

Delphi-Quellcode:
Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0;
...,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)...

Delphi-Quellcode:
if not Timer1.Enabled then
    ShowMessage('Done');
...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).

Ich hoff, ich konnt dir helfen.

alcaeus 13. Feb 2005 15:02

Re: Memo animieren...
 
Zitat:

Zitat von Benjin
Was ist Memox.tag?

Delphi-Referenz durchsuchenTComponent.Tag ist eine Integervariable, die du benutzen kannst wie du willst. In diesem Fall verwende ich sie einfach dazu, die Left-Position des Memos zu speichern, damit ich weiss wann die Bewegung aufhoeren muss.

Zitat:

Und kannst du die Timerfunktionen in der Aufrufprozedur der Timer noch mal ausführlicher erklären, was da nach entsprechenden Anweisungen passiert?
Klar, auch wenn das schon teilweise gemacht wurde:

Delphi-Quellcode:
Timer1.Enabled := False;
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:

Delphi-Quellcode:
Memo1.Left := Memo1.Left-Step;
Hier wird einfach der vorgegebene Wert von der linken Position des Memos abgezaehlt.

Delphi-Quellcode:
Timer1.Enabled := (Memo1.Left + Memo1.Width) > 0;
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.

Delphi-Quellcode:
if not Timer1.Enabled then
    ShowMessage('Done');
Wie gesagt...das ist nur zur Kontrolle dass alles ordnungsgemaess laeuft und auch wieder aufhoert.

Greetz
alcaeus

Benjin 14. Feb 2005 10:39

Re: Memo animieren...
 
Vielen Dank für die Erklärung....
Sieht auf jeden Fall sehr schön aus die Animation.


Jan

gsh 14. Feb 2005 10:49

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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo.DoubleBuffer := true;
end;
Ungetestet ! Ich hof ich habs richtig geschrieben weil ich komm grad an kein Delphi ran.

alcaeus 14. Feb 2005 10:53

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

-NIP- 14. Feb 2005 20:34

Re: Memo animieren...
 
Zitat:

Zitat von Neutral General
Du könntest ja sowas machen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
begin
  repeat
   Memo1.Left := Memo1.Left -1;
   sleep(10);
  until
   Memo.Left = -50;
  end;
end;
Ist ungetestet aber so ungefähr sollte es gehn. Zumindest mit dem verschwinden. Das auftauchen ist ja praktisch das gleiche nur umgekehrt ;)

Wenn man es so machen würde, wäre das Memo mit einem Schlag weg, oder nicht?

-NIP-


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.
Seite 1 von 2  1 2      

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