Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [FMX] Timer in eigener Komponente funktionieren nicht (https://www.delphipraxis.net/210342-%5Bfmx%5D-timer-eigener-komponente-funktionieren-nicht.html)

Medium 8. Apr 2022 11:09

[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:
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;
Mit
Delphi-Quellcode:
FAni.Start;
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.

Zweiter Versuch war dann "altmodisch" einfach einen eigenen TTimer zu nehmen:
Delphi-Quellcode:
constructor TRuehrwerk.Create(AOwner: TComponent);
begin
  inherited;
  FRotationTimer := TTimer.Create(Self);
  FRotationTimer.Interval := 100;
  FRotationTimer.Enabled := False;
  FRotationTimer.OnTimer := OnRotationTimer;
end;
Nach
Delphi-Quellcode:
FRotationTimer.Enabled := True;
wird auch hier alles was der TTimer macht ohne Fehler durchlaufen, aber auch hier wird OnRotationTimer() nie angesprungen.


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!

TiGü 8. Apr 2022 11:33

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?

Medium 8. Apr 2022 13:13

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!

jziersch 8. Apr 2022 13:14

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:
  TMyFloatAnimation = class(TFloatAnimation)
  protected
    MyControl: TMyButton;
    procedure ProcessAnimation; override;
    procedure FirstFrame; override; // macht nichts
  end;
und in den Prozeduren die zu verändernde property direkt zuzuweisen.

Code:
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;
Deine Animation kann immer von 0-1 laufen, für die Rotation halt dann mit 360 oder 2pi multiplizieren.

Medium 10. Apr 2022 16:15

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!

Medium 11. Apr 2022 09:40

AW: [FMX] Timer in eigener Komponente funktionieren nicht
 
Zitat:

Zitat von TiGü (Beitrag 1504446)
Kommst du denn in FMX.Platform.Win.TWinTimerService.TimerCallback an?

Ich habe dort mal weiter geschaut:

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 16:57 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