![]() |
[FMX] Timer in eigener Komponente funktionieren nicht
Moin!
Ich verzweifle gerade mal wieder an FMX-Details. Ich habe eine eigene visuelle Komponente geschrieben, die soweit auch gut funktioniert. Jetzt wollte ich eine kleine Animation einfügen. Eine Rotation eines Teils in der Darstellung der Komponente (nicht die ganze Komponente), und der Code fürs Zeichnen ist bereits fertig und getestet. Erster Versuch war eine TFloatAnimation einzusetzen, die mir eine Property setzt, die den aktuellen Winkel der Rotation angibt. Diese Property hat einen Setter, der auch das Neuzeichnen auslöst. Erstellt wird das so:
Delphi-Quellcode:
Mit
constructor TRuehrwerk.Create(AOwner: TComponent);
begin inherited; FAni := TFloatAnimation.Create(self); FAni.Parent := Self; FAni.PropertyName := 'RotationPosition'; FAni.StartValue := 0; FAni.StopValue := PI*2; FAni.Duration := 4; FAni.Loop := True; end;
Delphi-Quellcode:
wird sämtlicher Code hinter TFloatAnimation brav durchlaufen, sodass die Animation laufen müsste. Allerdings wird weder der Setter von RotationPosition jemals durchlaufen, noch wird das Ereignis TFloatAnimation.OnProcess() jemals ausgelöst. Aber die Animation ist enabled.
FAni.Start;
Zweiter Versuch war dann "altmodisch" einfach einen eigenen TTimer zu nehmen:
Delphi-Quellcode:
Nach
constructor TRuehrwerk.Create(AOwner: TComponent);
begin inherited; FRotationTimer := TTimer.Create(Self); FRotationTimer.Interval := 100; FRotationTimer.Enabled := False; FRotationTimer.OnTimer := OnRotationTimer; end;
Delphi-Quellcode:
wird auch hier alles was der TTimer macht ohne Fehler durchlaufen, aber auch hier wird OnRotationTimer() nie angesprungen.
FRotationTimer.Enabled := True;
Da auch TFloatAnimation ganz im Inneren über einen TTimer getriggert wird, vermute ich hier eine gemeinsame Ursache. Auf einem Formular oder Frame platzerte Timer funktionieren hingegen klaglos. Mir fehlt leider jetzt ein Ansatz, wo ich noch weiter forschen könnte. Hat jemand eine Idee? Besten Dank schon mal! |
AW: [FMX] Timer in eigener Komponente funktionieren nicht
Schüsse ins Blaue:
Muss man vielleicht hier den Parent noch setzen? Bist du in einer DLL? Bist du auf Windows? Kommst du denn in FMX.Platform.Win.TWinTimerService.TimerCallback an? |
AW: [FMX] Timer in eigener Komponente funktionieren nicht
Der Parent der Animation ist gesetzt, beim Timer bin ich gerade unsicher, ob der überhaupt einen hat. Ich bin jetzt nicht mehr am Platz, aber das prüfe ich später.
Das ist eine Windows Desktop Applikation, und alles in einer exe. Bis zu diesem bin ich noch nicht vorgedrungen! Mein Durchblick hat an der Stelle geendet, als ich gesehen habe, dass der eigentliche Timer irgendwie über ein Interface abgeholt wird, und alles was quasi da hinter passiert, habe ich nicht geblickt. Zumindest aber laufen die Create und Start bzw. SetEnabled Methoden ohne Fehler durch und alles was nicht nil sein darf ist auch nicht nil am Ende der Methoden. An der Stelle werde ich ebenfalls weiter gucken! Danke dir! |
AW: [FMX] Timer in eigener Komponente funktionieren nicht
Du kannst für Deine Zwecke schon eine TFloatAnimation verwenden. PropertyName muss aber auf eine existierende property des Parent gesetzt werden, sonst geht nichts.
Dennoch würde ich empfehlen eine abgeleitete Animation zu verwenden
Code:
und in den Prozeduren die zu verändernde property direkt zuzuweisen.
TMyFloatAnimation = class(TFloatAnimation)
protected MyControl: TMyButton; procedure ProcessAnimation; override; procedure FirstFrame; override; // macht nichts end;
Code:
Deine Animation kann immer von 0-1 laufen, für die Rotation halt dann mit 360 oder 2pi multiplizieren.
procedure TMyFloatAnimation .ProcessAnimation;
var V : Single; begin if (NormalizedTime=0) or (Duration=0) then V := StartValue else V := StartValue + (StopValue-StartValue) * NormalizedTime; ---> mach was mit V end; |
AW: [FMX] Timer in eigener Komponente funktionieren nicht
Das Problem das ich habe ist ja, dass selbst OnProcessAnimation schon gar nicht angesprungen wird. Ich hatte dafür mal testhalbar einen Handler gemacht, und der Debugger kam nie in die Methode, obwohl der Code von TFloatAnimation.Start vollständig und ohne Fehler durchlaufen wurde. (Habe ich durchgestepped.)
Die Property RotationPosition gibt es in meiner Komponente natürlich. Published. Wenn ich deren Wert im OI ändere funktioniert auch alles wie gewünscht. Es scheint einfach nur kein Timer-Callback in meiner Komponente stattzufinden. Edit: Kleiner Zusatz: Ich leite von TRectangle ab, was wiederum von TControl abstammt, was laut Doku die Trigger für Animationen implementiert. Für mich liest sich das so, als müsste das eigentlich funktionieren. Morgen habe ich den Code wieder vor der Nase, da schaue ich mal weiter. Falls aber noch jemand eine Idee hat, bitte immer her damit! |
AW: [FMX] Timer in eigener Komponente funktionieren nicht
Zitat:
TPlatformWin.CreateTimer() wird bei Aufruf von FAni.Start() durchlaufen, und es wird ein gültiger Timer mit Handle und ID und allem in die Liste FTimerData eingetragen. TimerCallBackProc() wird erreicht, jedoch entspricht idEvent niemals der TimerID des Timers der Animation (mit bedingtem Breakpoint überprüft). Andere Timer-IDs kommen vor und werden problemlos verarbeitet. Das verstehe ich nu nicht mehr :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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-2025 by Thomas Breitkreuz