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 Firemonkey: Animationen in Frames? (https://www.delphipraxis.net/184615-firemonkey-animationen-frames.html)

kaju74 10. Apr 2015 08:22

Firemonkey: Animationen in Frames?
 
Moin.

Ich experimentiere gerade mit FM rum und bin da wohl auf ein Problem gestoßen:

Wenn man ein FMX-Frame in die Hauptform einbettet und dieses Frame eine Animation hat (z.B. einen Shape per ColorKey-Animation in der Farbe ändern), dann wird diese Animation nicht abgespielt.

Nimmt man statt eines Frames eine Form, funktioniert alles. Nach Analyse des Quellcodes wird bei [MyAnimation].Start u.a. folgende Codezeile abgearbeitet:

Zitat:

procedure TAnimation.Start;
begin
...
if (Abs(FDuration) < 0.001) or (Root = nil) or (csDesigning in ComponentState) then
...
end;
Bei einer Form ist 'Root' z.B. 'TFormMain', bei einem Frame ist 'Root' allerdings = nil. In diesem Fall wird auch kein Thread zur zyklischen Animation erstellt, was dann wohl das eigentliche Problem ist.

Frage: Sind Animationen dieses Art in Frames nicht möglich??

Gruß,
Marc

kaju74 10. Apr 2015 08:33

AW: Firemonkey: Animationen in Frames?
 
Aha, nächste Erkenntnis:

TCustomForm implementiert 'IRoot', TFrame nicht. Daher funktionieren Komponenten-basierte Animationen nicht in Frames. Na super...:twisted:

Marc

mkinzler 10. Apr 2015 08:40

AW: Firemonkey: Animationen in Frames?
 
Dann verwende eine Form. Die kannst Du in FMX ja genauso wie einen Frame verwenden.

Sir Rufo 10. Apr 2015 08:53

AW: Firemonkey: Animationen in Frames?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann ich so nicht wirklich nachvollziehen.

Ein Button auf einem Frame kann ich per FloatAnimation in der Höhe ändern.

kaju74 10. Apr 2015 08:56

AW: Firemonkey: Animationen in Frames?
 
Richtig - aber nicht, wenn Du eine Animation-Komponente verwendest. Die funktionieren nicht...

LG,
Marc

Mavarik 10. Apr 2015 09:10

AW: Firemonkey: Animationen in Frames?
 
Zitat:

Zitat von kaju74 (Beitrag 1296987)
Richtig - aber nicht, wenn Du eine Animation-Komponente verwendest. Die funktionieren nicht...

QC Nr?

Sir Rufo 10. Apr 2015 09:48

AW: Firemonkey: Animationen in Frames?
 
Zitat:

Zitat von kaju74 (Beitrag 1296987)
Richtig - aber nicht, wenn Du eine Animation-Komponente verwendest. Die funktionieren nicht...

LG,
Marc

Ähm, TButton-Komponente auf Frame, TFloatAnimation-Komponente auf Frame und an den Button geklatscht ...

Sir Rufo 10. Apr 2015 09:52

AW: Firemonkey: Animationen in Frames?
 
Zitat:

Zitat von kaju74 (Beitrag 1296974)
Aha, nächste Erkenntnis:

TCustomForm implementiert 'IRoot', TFrame nicht. Daher funktionieren Komponenten-basierte Animationen nicht in Frames. Na super...:twisted:

Marc

Ein Frame kann kein Root sein warum sollte ein Frame also dann das Interface IRoot implementieren?

kaju74 10. Apr 2015 12:25

AW: Firemonkey: Animationen in Frames?
 
Interessant - mit TButton geht es. Und nun probiere es mal mit TRectangle und einer ColorKey-Animation. Die geht auf einer Form aber nicht in einem Frame.

Oder geht das bei Dir auch?

LG,
Marc

kaju74 10. Apr 2015 12:32

AW: Firemonkey: Animationen in Frames?
 
Also, das scheint irgendwie an der ColorKey-Animation zu liegen. Mit der Color-Animation geht's...

Das Problem scheint hier zu liegen:
Delphi-Quellcode:
procedure TColorKeyAnimation.ProcessAnimation;
var
  T: TRttiType;
  P: TRttiProperty;
  Key1, Key2: TKey;
begin
  if FInstance <> nil then
  begin
    if FKeys.FindKeys(NormalizedTime, Key1, Key2) then
    begin
      if (TFloatKey(Key2).Key - TFloatKey(Key1).Key) = 0 then
        Exit;
      T := SharedContext.GetType(FInstance.ClassInfo);
      if T <> nil then
      begin
        P := T.GetProperty(FPath);
        if (P <> nil) and P.PropertyType.IsOrdinal then
          P.SetValue(FInstance,
            InterpolateColor(TColorKey(Key1).Value, TColorKey(Key2).Value,
              (NormalizedTime - TFloatKey(Key1).Key) / (TFloatKey(Key2).Key - TFloatKey(Key1).Key)));
      end;
    end;
  end;
end;
Die Zeile:

Delphi-Quellcode:
if (TFloatKey(Key2).Key - TFloatKey(Key1).Key) = 0 then
verhält sich in einer Form anders als in einem Frame. In einem Frame sind beide Werte = 0, sodaß mit "Exit" aus der Methode gesprungen wird. Bei einer Form nicht. Hier ist der erste Wert = 1 und der zweite = 0.

???

Gruß,
Marc


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 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