Einzelnen Beitrag anzeigen

donyfreaky

Registriert seit: 15. Mär 2009
3 Beiträge
 
Delphi XE4 Enterprise
 
#6

AW: Hilfe bei meinen Projekt (Mehrere Prozeduren gleichzeitig laufen lassen))

  Alt 7. Okt 2013, 21:04
Hallo Redak,
Es gibt die Möglichkeit über TThreadYield bzw. TThread (http://docwiki.embarcadero.com/CodeE...Yield_(Delphi)) gleichzeitig Dinge zu erledigen aber all zu sinnvoll ist das in deinem Fall nicht. Der Schlüssel hier ist das Timing. Anstatt deinen Routinen feste Positionen zu liefern, könntest du ihnen einen Timecode liefern mit dessen dann die Position innerhalb der Routine ermittelt wird.

Hier mal ein bisschen Code um das zu veranschaulichen.

Das füllen etwas kürzer...
Delphi-Quellcode:
procedure TForm1.Buchstaben();
var
    i:integer;
begin
    setlength(dynAr,26);
    setlength(forDisplay,6);

    // buchstaben füllen
    for i := 0 to 26 do
        dynAr[i]:= Chr(97+i);
    
    // buchstaben für anzeige
    for i := 0 to 5 do
       forDisplay[i]:= dynAr[random(26)];
end;
Textausgabe mit Timecode...
Delphi-Quellcode:
point1 : TPoint; //Startposition des Textes

...

point1.X := 100;
point1.Y := -10;

...

procedure TForm1.Bewegen(const timecode, anim_delay: Cardinal);
var
    i: Integer;
    txt_pos: TPoint;
const
  add = Point(0, 100); // Wo soll der Text am Ende sein?
  offset = Point(100, 0); // Buchstabenabstand
begin
    txt_pos.X := Round(((timecode / anim_delay) * add.X) + point1.X);
    txt_pos.Y := Round(((timecode / anim_delay) * add.Y) + point1.Y);
    for i := 0 to High(TextOut)-1 do
        canvas.TextOut(txt_pos.X + (i*offset.X), txt_pos.y + (i*offset.Y), forDisplay[i]);
end;
Jetzt noch das Timing und ausführen der Animationen
Delphi-Quellcode:
procedure TForm1.Animate;
var
    TickCount, TickCountStart, TickCountEnd, timecode: Cardinal;
const
    anim_delay = 5000; // Wie lange soll es dauern?
begin
    TickCountStart := GetTickCount;
    TickCountEnd := TickCountStart + anim_delay;
    repeat
        TickCount := GetTickCount;
        timecode := TickCount - TickCountStart;
        // Deine Animationen
        Bewegen(timecode, anim_delay);
    until (TickCountEnd <= TickCount);
end;
Der Code ist ungetestet sollte aber hoffentlich so funktionieren. Falls du planst, später noch mehrere Animationen zu benutzen würde sich eine abstrakte Klasse TAnimation empfehlen, um das ganze Timing etwas eleganter zu gestalten. Prinzipiell kann ich dir aber auch Andora2D ans Herz legen, da es bereits alle benötigten Klassen für Animationen etc. mitbringt.

Geändert von donyfreaky ( 7. Okt 2013 um 21:09 Uhr)
  Mit Zitat antworten Zitat