RIGHT:[[Delphi]]
*子フォームをタスクバーに表示する [#w7930d04]
Delphiでは子フォームを作成して表示しても、タスクバーには表示されない。また、子フォームを最小化するとデスクトップにアイコン化されてしまう。
子フォームをタスクバーに表示し、最小化してもアイコン化されないようにするには次のように CreateParamsメソッドをオーバーライドする。
type
TForm1 = class(TForm)
private
{ private 宣言 }
protected
procedure CreateParams(var Params: TCreateParams); override;
public
{ public 宣言 }
end;
:
:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
if FormStyle in [fsNormal, fsStayOnTop] then begin
if BorderStyle in [bsSingle, bsSizeable] then begin
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow();
end;
end;
end;
-FormStyle と BorderStyle のチェックが本当に必要かどうかは詳しく検証していない。
-Params.WndParentに代入するのは "0"でも良いようだ。(Params.WndParent := 0)
-Params.WndParentに代入をしないとタスクバーには表示されるが、タスクバーをクリックして Formを切り替えるときに動作がおかしくなる。
この方法で子ウィンドウから別フォームをモーダル表示するときには、モーダル表示するフォームの CreateParamsも次のように変更しなくていけない。
変更しないと、メインフォームが前面に切り替わってしまう。
type
TForm2 = class(TForm)
private
{ private 宣言 }
protected
procedure CreateParams(var Params: TCreateParams); override;
public
{ public 宣言 }
end;
:
:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
if (Owner <> nil) and (Owner is TWinControl) then
Params.WndParent := TWinControl(Owner).Handle;
end;
また、モーダル表示のインスタンスを作成するときにはOwnerは呼び出し元にしなければいけない。
Form := TForm2.Create(Self); //Selfを Application や nil にしてはいけない
try
Form.ShowModal();
finally
Form.Free;