Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#35

AW: Panel geschmeidig ein- und ausblenden?

  Alt 21. Sep 2017, 12:31
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat