2011-04-17 17 views
5

Delphiでは、実行時にコントロールを表示/非表示しますが、コントロールが突然表示されたり消えたりすると表示が非表示になります。可視性)がありますが、何らかのアニメーションがありますか?Delphiのコンポーネントは、ランタイム中にコントロールを表示/非表示にします

おかげ

+0

あなたがしようとする可能性がありもう一つはありますラベルに点滅するテキストを追加します。 –

答えて

5

はそれをAnimateWindowに行くを与えます。のみWinControlsのために、まあ、それはとにかく見事な見ていません:

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; 


編集:同時にショー複数のコントロールを非表示にするには、ネジ付きバージョン:

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

は私には十分ですが、私は貪欲ではありません:) - この新しいAPIはありますか?もしそうなら、私はDelphiの中でサポートされている新しいウィンドウズAPIについて知っている - ありがとう。 – user639478

+1

@user - 実際にはWindows 98以降に存在する。Winapiは巨大で、Delphiには何かのビルトインサポートがない場合でも、誰かがそれを移植したものです。私はあなたが何かを理解する必要があるときに、APIやDelphiの変更を追跡する方法を知らない。 :) –

+1

@user - 'AnimateWindow'関数が同期性を持っていることに気付きました。つまり、アニメーションが終了するまで戻りません。一度に多くのコントロールをアニメートする必要がある場合、それはうまく見えないかもしれません。その場合、質問にもっと注意を払うように答えを受け入れないようにしてください。ところで、私はスレッドのバージョンを試して..、それはちょうど一貫して動作しません... –

関連する問題