子フォームをタスクバーに表示する †
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;
Counter: 9139,
today: 1,
yesterday: 2
Last-modified: Sun, 05 Feb 2006 16:19:38 JST (7286d)
Last-modified: Sun, 05 Feb 2006 16:19:38 JST (7286d)
