Delphiでは、実行時にコントロールを表示/非表示しますが、コントロールが突然表示されたり消えたりすると表示が非表示になります。可視性)がありますが、何らかのアニメーションがありますか?Delphiのコンポーネントは、ランタイム中にコントロールを表示/非表示にします
おかげ
Delphiでは、実行時にコントロールを表示/非表示しますが、コントロールが突然表示されたり消えたりすると表示が非表示になります。可視性)がありますが、何らかのアニメーションがありますか?Delphiのコンポーネントは、ランタイム中にコントロールを表示/非表示にします
おかげ
はそれを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;
は私には十分ですが、私は貪欲ではありません:) - この新しいAPIはありますか?もしそうなら、私はDelphiの中でサポートされている新しいウィンドウズAPIについて知っている - ありがとう。 – user639478
@user - 実際にはWindows 98以降に存在する。Winapiは巨大で、Delphiには何かのビルトインサポートがない場合でも、誰かがそれを移植したものです。私はあなたが何かを理解する必要があるときに、APIやDelphiの変更を追跡する方法を知らない。 :) –
@user - 'AnimateWindow'関数が同期性を持っていることに気付きました。つまり、アニメーションが終了するまで戻りません。一度に多くのコントロールをアニメートする必要がある場合、それはうまく見えないかもしれません。その場合、質問にもっと注意を払うように答えを受け入れないようにしてください。ところで、私はスレッドのバージョンを試して..、それはちょうど一貫して動作しません... –
あなたがしようとする可能性がありもう一つはありますラベルに点滅するテキストを追加します。 –