2011-12-24 12 views
5

Ho un pannello (allineato in basso) e alcuni controlli (allineati dal client).Delphi: AnimateWindow come in FireFox

per animare il pannello che uso:

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
panel.Visible:=false; 

Nel mio caso il pannello liscio pelli e solo allora altri controlli prende il suo spazio.

Ma voglio che gli altri controlli si muovano senza intoppi e contemporaneamente con il pannello verso il basso.

Ad esempio, FireFox utilizza questo effetto.

Qualcuno può suggerirmi qualcosa di utile? Grazie!

risposta

2

AnimateWindow è una funzione sincrona, non verrà restituita fino al termine dell'animazione. Ciò significa che durante il tempo specificato nel parametro dwTime, non verrà eseguito alcun codice di allineamento e i controlli allineati 'alClient' rimarranno fermi fino al termine dell'animazione.

Suggerirei invece di utilizzare un timer. Solo un esempio:

type 
    TForm1 = class(TForm) 
    .. 
    private 
    FPanelHeight: Integer; 
    FPanelVisible: Boolean; 
.. 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FPanelHeight := Panel1.Height; 
    Timer1.Enabled := False; 
    Timer1.Interval := 10; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
    FPanelVisible := not FPanelVisible; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
const 
    Diff: array [Boolean] of Integer = (-1, 1); 
begin 
    Panel1.Height := Panel1.Height - Diff[FPanelVisible]; 
    Panel1.Visible := Panel1.Height > 0; 
    Timer1.Enabled := (Panel1.Height > 0) and (Panel1.Height < FPanelHeight); 
end; 
+0

si dimentica application.proccessmessage all'interno timer1timer. – AsepRoro

+1

@Roro - Non è necessario ProcessMessages in un OnTimer. Una volta che il gestore eventi timer ritorna, l'applicazione continuerà a elaborare i messaggi. –

+0

oh bene questo è un buon input per me perché non lo so mai, grazie – AsepRoro

-1

Eliminare la seconda linea

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
panel.Visible:=false; 

e lasciare solo

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE);