2011-04-17 33 views
5

Trong Delphi tôi hiển thị/ẩn các điều khiển trong thời gian chạy và nó trông không tốt như điều khiển đột nhiên xuất hiện hoặc biến mất, vì vậy bất kỳ ai biết một thành phần có thể làm chương trình/ẩn (sử dụng tài sản có thể nhìn thấy) nhưng với một số loại hoạt ảnh?thành phần delphi để hiển thị/ẩn các điều khiển trong thời gian chạy

cảm ơn

+0

Một điều bạn có thể cố gắng làm là để thêm văn bản nhấp nháy vào nhãn của bạn. –

Trả lời

5

Tặng nó với AnimateWindow. Chỉ cho WinControls, tốt, nó không giống lộng lẫy anyway:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if Button2.Visible then 
    AnimateWindow(Button2.Handle, 250, AW_HIDE or AW_VER_NEGATIVE or AW_SLIDE) 
    else 
    AnimateWindow(Button2.Handle, 250, AW_VER_POSITIVE or AW_SLIDE); 
    Button2.Visible := not Button2.Visible; // synch with VCL 
end; 


chỉnh sửa: Một luồng phiên bản để ẩn chương trình nhiều điều khiển cùng một lúc:

type 
    TForm1 = class(TForm) 
    .. 
    private 
    procedure AnimateControls(Show: Boolean; Controls: array of TWinControl); 
    procedure OnAnimateEnd(Sender: TObject); 
    public 
    end; 

implementation 
    .. 

type 
    TAnimateThr = class(TThread) 
    protected 
    procedure Execute; override; 
    public 
    FHWnd: HWND; 
    FShow: Boolean; 
    constructor Create(Handle: HWND; Show: Boolean); 
    end; 

{ TAnimateThr } 

constructor TAnimateThr.Create(Handle: HWND; Show: Boolean); 
begin 
    FHWnd := Handle; 
    FShow := Show; 
    FreeOnTerminate := True; 
    inherited Create(True); 
end; 

procedure TAnimateThr.Execute; 
begin 
    if FShow then 
    AnimateWindow(FHWnd, 250, AW_VER_POSITIVE or AW_SLIDE) 
    else 
    AnimateWindow(FHWnd, 250, AW_HIDE or AW_VER_NEGATIVE or AW_SLIDE); 
end; 

{ Form1 } 

procedure TForm1.OnAnimateEnd(Sender: TObject); 
begin 
    FindControl(TAnimateThr(Sender).FHWnd).Visible := TAnimateThr(Sender).FShow; 
end; 

procedure TForm1.AnimateControls(Show: Boolean; Controls: array of TWinControl); 
var 
    i: Integer; 
begin 
    for i := Low(Controls) to High(Controls) do 
    with TAnimateThr.Create(Controls[i].Handle, Show) do begin 
     OnTerminate := OnAnimateEnd; 
     Resume; 
    end; 
end; 


procedure TForm1.Button5Click(Sender: TObject); 
begin 
    AnimateControls(not Button1.Visible, 
     [Button1, Button2, Button3, Edit1, CheckBox1]); 
end; 
  
+0

thats đủ cho tôi, tôi không tham lam :) - là API mới này? nếu vậy làm thế nào tôi biết về API cửa sổ mới được hỗ trợ bên trong Delphi - Cảm ơn rất nhiều – user639478

+1

@user - Trên thực tế nó tồn tại từ Windows 98. Winapi là rất lớn, và thậm chí nếu Delphi không có hỗ trợ tích hợp cho một cái gì đó, bạn có thể tìm thấy một cổng của nó bởi người khác. Tôi không biết một cách để theo dõi những thay đổi trong api hoặc Delphi, khi bạn cần một cái gì đó bạn có thể tìm ra nó. :) –

+1

@user - Tôi nhận thấy chức năng 'AnimateWindow' có tính chất đồng bộ, nghĩa là nó không trở lại cho đến khi hoạt ảnh kết thúc. Điều đó có thể không tốt nếu bạn cần tạo hiệu ứng cho nhiều điều khiển cùng một lúc. Trong trường hợp đó, hãy xem xét việc không chấp nhận câu trả lời để chú ý nhiều hơn đến câu hỏi. BTW, tôi đã thử một phiên bản ren .., nó chỉ không làm việc liên tục ... –

Các vấn đề liên quan