ログイン: パスワード:   新規登録  パスワード紛失
 
メインメニュー
検索
オンライン状況
登録ユーザ: 0
ゲスト: 2
テーマ選択

(4 テーマ)
子フォームをタスクバーに表示する のバックアップソース(No.1)

[[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;

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
PR