AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi [FMX] Timer in eigener Komponente funktionieren nicht
Thema durchsuchen
Ansicht
Themen-Optionen

[FMX] Timer in eigener Komponente funktionieren nicht

Ein Thema von Medium · begonnen am 8. Apr 2022 · letzter Beitrag vom 11. Apr 2022
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

[FMX] Timer in eigener Komponente funktionieren nicht

  Alt 8. Apr 2022, 12:09
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 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 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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [FMX] Timer in eigener Komponente funktionieren nicht

  Alt 8. Apr 2022, 12:33
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?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: [FMX] Timer in eigener Komponente funktionieren nicht

  Alt 8. Apr 2022, 14:13
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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
251 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [FMX] Timer in eigener Komponente funktionieren nicht

  Alt 8. Apr 2022, 14:14
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.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: [FMX] Timer in eigener Komponente funktionieren nicht

  Alt 10. Apr 2022, 17:15
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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (10. Apr 2022 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: [FMX] Timer in eigener Komponente funktionieren nicht

  Alt 11. Apr 2022, 10:40
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:25 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