子フォームをタスクバーに表示する のバックアップ差分(No.1)
- バックアップ一覧
- ソース を表示
- バックアップ を表示
- 子フォームをタスクバーに表示する は削除されています。
- 1 (2005-10-05 21:22:24 (水))
- 2 (2005-10-06 22:52:06 (木))
- 追加された行はこの色です。
- 削除された行はこの色です。
[[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;