こんにちは。
子フォームをタスクバーに表示させる処理を作成しています。
親フォーム、子フォーム共に最小化させた状態で子フォームを先に
復帰させると、親フォームが復帰しなくなります。
親フォーム、子フォームの順に復帰させると両方復帰します。
この現象は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;
>同じ処理をDelphi5で行うと問題なく動作します。
つまり,Delphi 5 で,提示したコードを実行してみれば分かる,ということでしょうか ?
どのような動作が正常で,問題ないのか,問題があるとか,正常でないかは,開発者が期待する動作との関係なので,
具体的な期待動作は分かりませんが,
「タスクバーに,メインフォーム以外の子フォームのボタン(アイコン)も表示する」
ということでしたら,WS_EX_APPWINDOW が疑問ですね.
こんなところが参考になるかも知れません.
http://msdn.microsoft.com/ja-jp/library/cc410714.aspx
Delphi2009 問題なく復帰
>この現象はDelphi2007で作成したプログラムで発生しているのですが
>同じ処理をDelphi5で行うと問題なく動作します。
これ,もしかして,Delphi 5 で作成したプロジェクトを
Delphi 2007 で起動してテストしていませんか ?
私もちょっとやってみましたが,いろいろテストした結果,
>親フォーム、子フォーム共に最小化させた状態で子フォームを先に
>復帰させると、親フォームが復帰しなくなります。
という現象を発生させることができます.
>Delphi2009 問題なく復帰
Delphi 2007, XE, XE2, XE3, XE4, XE5, XE6 の場合,
新規にプロジェクトを作成して,質問された方のコードを実行しても,
質問された方が言うような現象は発生しませんね.
Mr.XRAY さん
>これ,もしかして,Delphi 5 で作成したプロジェクトを
>Delphi 2007 で起動してテストしていませんか ?
まさにそのとおりです。
Delphi2007で新規にプロジェクトを作成してみたところ、親フォームが復帰しなくなる現象が回避できました。
みなさん、ありがとうございました。
> Delphi 2007, XE, XE2, XE3, XE4, XE5, XE6 の場合,
> 新規にプロジェクトを作成して,質問された方のコードを実行しても,
> 質問された方が言うような現象は発生しませんね.
Delphi2007では、Vista対応のため、Applicationとメインフォームの関係が
色々と変更されたためではないでしょうかね?
何がどう変わったか、説明できる知識はありませんけど。
>Delphi2007で新規にプロジェクトを作成してみたところ、親フォームが復帰しなくなる現象が回避できました。
解決済みですが,以下のリスト 1 が参考になれば...
http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#list1
Mr.XRAY さん
2つのプロジェクトを比較したところ、
Application.MainFormOnTaskbarの存在に気づきました。
見覚えがありましたので、移行用に収集した資料をチェックしていると
まさに教えていただいたMr.XRAYさんのサイトを参考にするよう
自分でメモしていた次第です・・・
こちらのサイト、大変勉強になっています。
ありがとうございました。
また,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
ツイート | ![]() |