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

(4 テーマ)
Top / Delphi / 子フォームをタスクバーに表示する

子フォームをタスクバーに表示する

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
Counter: 7501, today: 1, yesterday: 3
Last-modified: Sun, 05 Feb 2006 16:19:38 JST (4328d)
PR