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