Mich stört ja gewaltig das
Application.ProcessMessages
, weil dabei ja erst die gesamte Message-Queue abgearbeitet wird. Das kann sowohl zu einem Stocken der Animation führen, als auch unerwünschte Nebeneffekte oder Reentrance-Probleme verursachen. Bei simplen Testanwendungen kommt das zwar sicher kaum vor, aber in komplexen Anwendungen ist sowas durchaus denkbar.
Eine mögliche Alternative wäre, das Neuzeichnen während der Animation selbst anzustoßen. Dazu müsste in der Uses-Anweisung noch ein
Winapi.Messages aufgenommen, in der
AnimateControl-Methode eine neue Variable deklariert und die Animationsschleife wie folgt abgeändert werden:
Delphi-Quellcode:
uses
Utils.Easing.Core,
Winapi.Messages;
...
var
dc: HDC;
...
dc := GetDC(Control.Handle);
try
while (D <= TUtilsEasingAnimations.AnimateDuration)
do
begin
setControlDimension(TUtilsEasingCore.EaseOutQuint(D, iStart, iEnd - iStart, TUtilsEasingAnimations.AnimateDuration));
Control.Perform(WM_PRINTCLIENT,
dc, PRF_CLIENT);
D := GetTickCount - C;
end;
finally
ReleaseDC(Control.Handle,
dc);
end;
Ist jetzt natürlich nicht in allen Lebenslagen getestet, aber für die genannten Button-Beispiele funktioniert es.
Als angenehmer Nebeneffekt kann die Referenz auf
Vcl.Forms in der Uses-Anweisung nun getrost entfernt werden.