AGB  ·  Datenschutz  ·  Impressum  







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

Memo animieren...

Ein Thema von Benjin · begonnen am 13. Feb 2005 · letzter Beitrag vom 8. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benjin

Registriert seit: 1. Nov 2004
Ort: München
64 Beiträge
 
Delphi 7 Enterprise
 
#1

Memo animieren...

  Alt 13. Feb 2005, 12:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Memo animieren...

  Alt 13. Feb 2005, 12:59
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
Michael
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Memo animieren...

  Alt 13. Feb 2005, 13:08
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benjin

Registriert seit: 1. Nov 2004
Ort: München
64 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Memo animieren...

  Alt 13. Feb 2005, 14:23
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!!
  Mit Zitat antworten Zitat
Fourcorner

Registriert seit: 26. Aug 2004
Ort: Grenzach-Wyhlen
51 Beiträge
 
Delphi 7 Personal
 
#5

Re: Memo animieren...

  Alt 13. Feb 2005, 14:33
Also:

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

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

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.
Julian
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#6

Re: Memo animieren...

  Alt 13. Feb 2005, 15:02
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:

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

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

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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benjin

Registriert seit: 1. Nov 2004
Ort: München
64 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Memo animieren...

  Alt 14. Feb 2005, 10:39
Vielen Dank für die Erklärung....
Sieht auf jeden Fall sehr schön aus die Animation.


Jan
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#8

Re: Memo animieren...

  Alt 14. Feb 2005, 10:49
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.
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

Re: Memo animieren...

  Alt 14. Feb 2005, 10:53
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 )

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#10

Re: Memo animieren...

  Alt 14. Feb 2005, 20:34
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-
Christian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:21 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