子フォームをタスクバーに表示させた場合の最小化について

解決


smatsu  2014-05-17 03:06:35  No: 46339

こんにちは。
子フォームをタスクバーに表示させる処理を作成しています。

親フォーム、子フォーム共に最小化させた状態で子フォームを先に
復帰させると、親フォームが復帰しなくなります。

親フォーム、子フォームの順に復帰させると両方復帰します。

この現象はDelphi2007で作成したプログラムで発生しているのですが
同じ処理をDelphi5で行うと問題なく動作します。

アプリケーションウインドウが関連しているのかと思われますが
うまく回避する方法が思いつきません。

何かよい方法はないでしょうか。
よろしくお願いします。

以下、ソースです。
新規フォームを2つ作成してForm1からForm2を表示させるだけの処理です。

Form1(親フォーム)
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(nil{self});
  Form2.Show;
end;

Form2(子フォーム)
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0{GetDesktopWindow()};
end;


Mr.XRAY  2014-05-18 00:36:49  No: 46340

>同じ処理をDelphi5で行うと問題なく動作します。

つまり,Delphi 5 で,提示したコードを実行してみれば分かる,ということでしょうか ?
どのような動作が正常で,問題ないのか,問題があるとか,正常でないかは,開発者が期待する動作との関係なので,
具体的な期待動作は分かりませんが,

「タスクバーに,メインフォーム以外の子フォームのボタン(アイコン)も表示する」

ということでしたら,WS_EX_APPWINDOW が疑問ですね.
こんなところが参考になるかも知れません.

http://msdn.microsoft.com/ja-jp/library/cc410714.aspx


けど  2014-05-18 06:35:43  No: 46341

Delphi2009 問題なく復帰


Mr.XRAY  2014-05-18 09:33:57  No: 46342

>この現象はDelphi2007で作成したプログラムで発生しているのですが
>同じ処理をDelphi5で行うと問題なく動作します。

これ,もしかして,Delphi 5 で作成したプロジェクトを 
Delphi 2007 で起動してテストしていませんか ?

私もちょっとやってみましたが,いろいろテストした結果,

>親フォーム、子フォーム共に最小化させた状態で子フォームを先に
>復帰させると、親フォームが復帰しなくなります。

という現象を発生させることができます.


Mr.XRAY  2014-05-18 09:37:16  No: 46343

>Delphi2009 問題なく復帰

Delphi 2007, XE, XE2, XE3, XE4, XE5, XE6 の場合,
新規にプロジェクトを作成して,質問された方のコードを実行しても,
質問された方が言うような現象は発生しませんね.


smatsu  2014-05-19 18:14:40  No: 46344

Mr.XRAY  さん
>これ,もしかして,Delphi 5 で作成したプロジェクトを
>Delphi 2007 で起動してテストしていませんか ?

まさにそのとおりです。
Delphi2007で新規にプロジェクトを作成してみたところ、親フォームが復帰しなくなる現象が回避できました。

みなさん、ありがとうございました。


おかぽん  2014-05-19 18:20:27  No: 46345

> Delphi 2007, XE, XE2, XE3, XE4, XE5, XE6 の場合,
> 新規にプロジェクトを作成して,質問された方のコードを実行しても,
> 質問された方が言うような現象は発生しませんね.
Delphi2007では、Vista対応のため、Applicationとメインフォームの関係が
色々と変更されたためではないでしょうかね?
何がどう変わったか、説明できる知識はありませんけど。


Mr.XRAY  2014-05-19 18:20:51  No: 46346

>Delphi2007で新規にプロジェクトを作成してみたところ、親フォームが復帰しなくなる現象が回避できました。

解決済みですが,以下のリスト 1 が参考になれば...
http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#list1


smatsu  2014-05-19 18:42:51  No: 46347

Mr.XRAY  さん

2つのプロジェクトを比較したところ、
Application.MainFormOnTaskbarの存在に気づきました。

見覚えがありましたので、移行用に収集した資料をチェックしていると
まさに教えていただいたMr.XRAYさんのサイトを参考にするよう
自分でメモしていた次第です・・・

こちらのサイト、大変勉強になっています。

ありがとうございました。


Mr.XRAY  2014-05-19 18:54:51  No: 46348

また,Delphi 2007 以降の場合,

  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  
なくても動作します.WS_EX_APPWINDOW, つまりアプリケーションウインドウは,Delphi 2007 以降では,デフォルトでは有効です.
その例です.

[10_タスクバーへフォーム別のアイコンを表示]
http://mrxray.on.coocan.jp/Delphi/plSamples/127_FormSystemMenuETC.htm#10


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加