2011-12-24 19 views
5

Tôi có một bảng điều khiển (căn dưới) và một số điều khiển (phù hợp với khách hàng).Delphi: AnimateWindow như trong FireFox

Để động panel tôi sử dụng:

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

Trong trường hợp của tôi bảng điều khiển trơn tru da và chỉ sau đó các điều khiển khác mang nó là không gian.

Nhưng tôi muốn các điều khiển khác di chuyển trơn tru và đồng thời với bảng điều khiển.

Ví dụ: FireFox sử dụng hiệu ứng này.

Ai có thể gợi ý cho tôi điều gì đó hữu ích không? Cảm ơn!

Trả lời

2

AnimateWindow là một chức năng đồng bộ, nó sẽ không trở lại cho đến khi hoạt ảnh kết thúc. Điều đó có nghĩa là trong khoảng thời gian được chỉ định trong thông số dwTime, không có mã liên kết nào sẽ chạy và các điều khiển được canh lề 'alClient' của bạn sẽ vẫn giữ nguyên cho đến khi hoạt ảnh kết thúc.

Tôi khuyên bạn nên sử dụng bộ hẹn giờ thay thế. Chỉ cần một ví dụ:

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

bạn quên application.proccessmessage bên timer1timer. – AsepRoro

+1

@Roro - Bạn không cần ProcessMessages trong OnTimer. Khi trình xử lý sự kiện hẹn giờ trả về, ứng dụng sẽ tiếp tục xử lý thư. –

+0

oh tốt thats đầu vào tốt cho tôi bởi vì tôi không bao giờ biết điều đó, cảm ơn – AsepRoro

-1

Xóa dòng thứ hai

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

và để lại chỉ

AnimateWindow(Panel.Handle, 1000, aw_hide or AW_SLIDE OR AW_VER_POSITIVE); 
Các vấn đề liên quan