2016-04-30 86 views
5

Hai bisogno del tuo aiuto (sono bloccato nella ricerca di). Sono su Delphi Seattle, cercando di rendere più fluido il ridimensionamento del mio modulo. Nel mio caso "ridimensionamento" è solo un po 'crollo/espandere in questo modo:Delphi: liscio collasso/modulo di espansione

enter image description here

Come posso capire che?

Ho provato l'uso di un TTimer:

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; 

... ma è sembra molto semplice (senza accelerazione/decelerazione) e lavora lento anche con piccolo intervallo.

+2

Le variabili locali (come 'h' e' t') non sono permanenti tra le chiamate (eventi del timer qui) Sono allocate nello stack e sequestrate per esistere quando la procedura termina. Durante le chiamate ripetute potresti essere fortunato e la stessa memoria viene riutilizzata, ma fare affidamento su questo è semplicemente sbagliato. La risoluzione TTimer è 10 ms - 15 ms, nonostante sia possibile impostarla su 1 ms. È anche basato sul messaggio e il messaggio del timer è a bassa priorità. Per un timer più preciso e più performante utilizzare un timer multimediale winapi. Infine, il codice semplice potrebbe dare un aspetto semplice, perché ti aspetti che mostri accelerazione/decelerazione? –

risposta

6

Non è necessario complicarsi con TTimers. Questo si prenderà cura sia delle forme collassabili che in espansione, inclusa la levigatezza richiesta.

Il trucco consiste nel calcolare ogni passo prendendo la Dimensione obiettivo - Altezza corrente e div 3 ad ogni iterazione, che accelereranno entrambi il collasso iniziale o espanderanno, quindi decelereranno man mano che la forma si avvicina alla sua dimensione di destinazione.

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

Grazie mille John! Questo è esattamente quello che volevo vedere! –

+0

mi ha aiutato molto. grazie – Rahul