2016-04-30 9 views
5

Brauchen Sie Ihre Hilfe (Ich bin auf der Suche nach). Ich bin in Delphi Seattle und versuche, den unteren Rand meines Formulars zu verkleinern. In meinem Fall „Größe ändern“ ist nur ein wenig Zusammenbruch/erweitern wie folgt aus:Delphi: glatte Einsturz/erweitern Formular

enter image description here

Wie kann ich das realisieren?

Ich benutze eine TTimer habe versucht:

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
h, t: integer; 
begin 
t := Button10.Top + Button10.Height + 10; //slide TForm from/to this point 
if t > h then 
begin 
h := h + 1; 
Form1.Height := h; 
end 
else 
begin 
Timer1.Enabled := false; 
end; 
end; 

... aber es ist sieht sehr einfach (keine Beschleunigung/Abbremsung) und arbeitet langsam auch bei kleinen Intervall.

+2

Lokale Variablen (wie 'h' und' t') sind zwischen den Aufrufen nicht persistent (Timer-Ereignisse hier) Sie werden auf dem Stack zugewiesen und belegen, wenn die Prozedur beendet wird. Bei wiederholten Anrufen können Sie Glück haben und die gleiche Erinnerung wird wiederverwendet, aber darauf zu vertrauen ist einfach falsch. TTimer Auflösung ist 10ms - 15ms, obwohl Sie es auf 1ms festlegen können. Es ist ebenfalls nachrichtenbasiert und die Timer-Nachricht ist eine niedrig-priorisierte. Verwenden Sie für einen genaueren und leistungsfähigeren Timer einen WinAPI-Multimedia-Timer. Schließlich könnte einfacher Code ein einfaches Aussehen ergeben, warum erwarten Sie, dass er Beschleunigung/Verlangsamung zeigt? –

Antwort

6

Es gibt keine Notwendigkeit, mit TTimers kompliziert zu werden. Dies wird sowohl kollabieren und erweitern Formen einschließlich der Glätte, die Sie benötigen.

Der Trick besteht darin, jeden Schritt zu berechnen, indem Sie bei jeder Iteration die Zielgröße - aktuelle Höhe und div 3 nehmen, die den anfänglichen Kollaps beschleunigen oder ausdehnen und dann verlangsamen, wenn die Form der Zielgröße näher kommt.

procedure TForm1.SmoothResizeFormTo(const ToSize: integer); 
var 
    CurrentHeight: integer; 
    Step: integer; 
begin 
    while Height <> ToSize do 
    begin 
    CurrentHeight := Form1.Height; 

    // this is the trick which both accelerates initially then 
    // decelerates as the form reaches its target size 
    Step := (ToSize - CurrentHeight) div 3; 

    // this allows for both collapse and expand by using Absolute 
    // calculated value 
    if (Step = 0) and (Abs(ToSize - CurrentHeight) > 0) then 
    begin 
     Step := ToSize - CurrentHeight; 
     Sleep(50); // adjust for smoothness 
    end; 

    if Step <> 0 then 
    begin 
     Height := Height + Step; 
     sleep(50); // adjust for smoothness 
    end; 
    end; 
end; 

procedure TForm1.btnCollapseClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(100); 
end; 

procedure TForm1.btnExpandClick(Sender: TObject); 
begin 
    SmoothResizeFormTo(800); 
end; 
+1

Vielen Dank John! Genau das wollte ich sehen! –

+0

hat mir sehr geholfen. Danke – Rahul