Top > コンポーネント > フォームの重なり順序を変更する方法は?

以下の投稿に返信 全 20件

Re: フォームの重なり順序を変更する方法は?   by 21st 2011年6月30日 17:01

 
既解決かもしれませんが、Delphiでは
メニューバーの 「プロジェクト(P)」下の
ソース表示 にて、Project1.pas が表示・編集状態になって
この中で
  Application.MainFormOnTaskbar := true; を false にして
OKでした。


Re: フォームの重なり順序を変更する方法は?   by 促足臓村促袖促鐃ス 2011年5月27日 08:08

 
Delphiをあまり使った事が無いのですが、

>C++Builder2009ではProject1.cppの次の行をコメントアウトすれば、期待する動作になります。

ここで言っている「Project1.cpp」のcppとは、
c++のコードが書かれたファイルであることを示す拡張子です。
確かDelphiなら拡張子はpasだったはず。
「Project1.pas」ってないですか?


Re: フォームの重なり順序を変更する方法は?   by satoh 2011年5月21日 23:45

 
既に、C++では問題が解決しているようですが、Delphiではどのように対処すればいいのでしょうか?

C++でコメントアウトすれば改善するとのことでしたので、少ない知識の中でプロジェクト名.bdsprojファイルに

Application.MainFormOnTaskBar := False;

記入してみました。
Trueのセットをコメントアウトするということだから、Falseをセットすればいいのではないかと思って実行してみましたが、改善されませんでした。

どなたか、Delphiでの改善方法をご存知でないでしょうか?
よろしくお願いいたします。



Re: フォームの重なり順序を変更する方法は?   by windy 2009年3月17日 23:57

 
> 山本隆さん

ありがとうございます。
ご説明の通りやってみたら従来通りの動作になりました。
やっぱりこういうのは相当使い込んでないとわからないですね。
ちなみに私、Vistaは持っておりません。(^^;

これで2009使えるかも?です。
私も山本隆さんのサイトを拝見してUnicode関係でお世話になっておりました。
これからもどうぞよろしくお願いします。


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽ 2009年3月17日 16:42

 
山本隆さん

説明していただいたように再現できました。
よかった、助かりました!
こういうのは今の自分には一人では解決できないですね・・・!

山本隆 さんのお名前は、たしかどこかのWeb Pageで何度も参考にさせていただいたことがあるので記憶に残っています。
自分が最初の質問者ではないんですが、たいへんありがとうございました。これからも宜しくお願いします。


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽ 2009年3月17日 16:42

 
山本隆さん

説明していただいたように再現できました。
よかった、助かりました!
こういうのは今の自分には一人では解決できないですね・・・!

山本隆 さんのお名前は、たしかどこかのWeb Pageで何度も参考にさせていただいたことがあるので記憶に残っています。
自分が最初の質問者ではないんですが、たいへんありがとうございました。これからも宜しくお願いします。


Re: フォームの重なり順序を変更する方法は?   by 山本隆 2009年3月17日 15:43

 
調べてみたところ、TApplication.MainFormOnTaskBarの値が影響しているようです。

C++Builder2009ではProject1.cppの次の行をコメントアウトすれば、期待する動作になります。
Application->MainFormOnTaskBar = true;

また、C++Builder2007ではProject1.cppの次の行をコメントアウトします。
SetApplicationMainFormOnTaskBar(Application, true);

TApplication.MainFormOnTaskBarはWindows Vista Aero 効果のための機能です。
ヘルプを見るとTApplication.MainFormOnTaskBarの項目には、次のような記述がありました。
> このプロパティに依存するアプリケーションでは、このプロパティが MainForm の Z オーダーに影響を与える点に注意してください。 


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽ 2009年3月14日 23:09

 
わかりました。わたしの Delphi 2009 でも同じ状態です。
私は最近どちらも見てないのでよくわかりませんが、
Developer Network
https://forums.codegear.com/category.jspa?categoryID=3
または、CodeGear の QC(Quality Control)
へ投稿した方がよいのではないでしょうか?  


Re: フォームの重なり順序を変更する方法は?   by windy 2009年3月14日 13:26

 
>WindyさんのRad Studio 2009 はC++Builder2009のみでしょうか?
>それとも Delphi+C++Builder 2009 ならば
>Delphi でも同じことが起こるでしょうか?

すみません、遅くなりました。
Delphi2009とセットで購入しましたので試してみました。
やはりC++Builder2009と同じ現象が起こりました。

ヘルプの記述通りに動いてないのですから、やっぱりVCLのバグの可能性が高いんでしょうね。
他にもいくつか問題が見つかってますが、早く直してもらわないといつまで経っても使えません。


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽ 2009年3月12日 14:23

 
WindyさんのRad Studio 2009 はC++Builder2009のみでしょうか?
それとも Delphi+C++Builder 2009 ならば
Delphi でも同じことが起こるでしょうか?


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽは暖かい 2009年3月11日 23:48

 
訂正します。実行時に、

SubForm->FormStyle=fsNormal;
MainForm->FormStyle=fsStayOnTop;

にしても記述どうりに動作しなかった、です。


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽは暖かい、今夜も湯たんぽ 2009年3月11日 23:41

 
>> ところがC++Builder 2009では両方ともpmNoneにしてもポップ>>アップされる側のフォームが常に前面に来てしまいます。明ら>> かに2006とは異なる挙動をします。

私のC++Builder2009 でもそうなりました。
実行時に、
MainForm->FormStyle=fsNormal;
SubForm->FormStyle=fsStayOnTop;
にしても記述どうりに動作しませんでした。
変ですね!

私の場合別の件でもおかしいことがあるんですよ。困ってます。
Update2で直ったのもあるんですが。購入したばかりの CD-ROMのときはもっとひどかった。

控え目に言わせてもらえば、リリースするのが早すぎる、です。


Re: フォームの重なり順序を変更する方法は?   by windy 2009年3月11日 20:28

 
>wwwさん

FormStyleは両方ともfsNormalになっています。
またフォームはデザイナで作成していますので、

Application->CreateForm(__classid(TForm2), &Form2);

の方法になっていると思います。

さらに調べてみたところ、TFormのPopupModeとPopupParentプロパティが関係していることがわかりました。

C++Builder 2006ではPopupModeを両方ともpmNoneにすることにより、マウスクリックした方が前に来るようになります(これが従来の動作です)。
ところがC++Builder 2009では両方ともpmNoneにしてもポップアップされる側のフォームが常に前面に来てしまいます。明らかに2006とは異なる挙動をします。

このプロパティは本来、Zオーダーをユーザーのマウスクリックで自由に変更できないようにすることにより、モード付きダイアログがメインフォームの裏側に隠れてソフトが終了できなくなるなどのトラブルを防ぐためのものです。ポップアップ側を常に前面にすることはできますが、逆にメインフォーム側を常に前面にするような設定はできないようです(少なくとも2009では)。

2009でPopupModeの仕様が変更されたのか、それともバグなのかは定かではありません。
今のところ仕方がないので2006に戻しています。
2009はいつになっても使えません・・・


Re: フォームの重なり順序を変更する方法は?   by www 2009年3月11日 15:53

 
2009持ってないので、かなりあてずっぽうですが

Form2 のみ FormStyle プロパティが fsStayOnTop 
になっているという事はないですか?

Form2 はどうやって作ってるのでしょうか
Project1.cpp 内で、
Application->CreateForm(__classid(TForm2), &Form2);

ですか?
それとも
Form2 = new TForm2(this);
とかですか?
後者なら this が Form1 を示してる可能性があり、
オーナーウインドウが Form1 になっているのが原因かも
知れません。(Builder 6では、あまり関係ない事ですが)

Form2 の owner プロパティの Name プロパティで Form1
と出るようなら、Form2 = new TForm2(Application);
にしてみるとか考えられると思います。


Re: フォームの重なり順序を変更する方法は?   by キーサン 2009年3月11日 11:08

 
どうやら、質問の意味を取り違えていたようです。
失礼しました。

MainFormをマウスでクリックしても、SubFormが常に
前面に来ている??
まるでDialogみたいですね・・・。


Re: フォームの重なり順序を変更する方法は?   by windy 2009年3月11日 10:52

 
キーサン様、Hiro様、湯たんぽは暖かい様、ありがとうございます。

教えていただいた通りやってみましたが、私の環境ではどうやっても前に来ないのです。

ところがC++Builder 2006でやってみるとあら不思議、普通にSubForm->Show()するだけでマウスクリックした方が前に来ます(これが普通の動作だと思います)。

どうやらこれはC++Builder 2009に特有の問題のような気がします(バグ?)。
とにかくフォームの重なり順が作成した時点で固定されてしまうようなのです。
2009への乗り換えを進めていたところですが、まだまだ不安定のようですね。また元に戻さなければならないかもしれません、トホホ・・


Re: フォームの重なり順序を変更する方法は?   by 湯たんぽは暖かい 2009年3月11日 10:14

 
MSDN の VC++ のフォーラム

http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/87c8ec80-25f8-4f53-9e69-5de20198741e

同じ問題みたい。


Re: フォームの重なり順序を変更する方法は?   by Hiro 2009年3月11日 09:15

 
今、試してみましたが、
MainForm の OnShow イベントで SubForm->Show() とすれば
メインフォームが前面に来ます。
また、MainForm->SetFocus() でもメインフォームを前に移動
できました。


Re: フォームの重なり順序を変更する方法は?   by キーサン 2009年3月11日 08:17

 
MainFormをSubFormの前に出したいだけなら、

SubForm->Show();
MainForm->Hide();
MainForm->Show();

とすれば、前に出ますよ。
前に同じようなことを困って、こんな感じで逃げたことがあります。
もっとスマートな方法がきっとあると思うんですけどね〜


フォームの重なり順序を変更する方法は?   by windy 2009年3月10日 19:56

 
頻繁に出てきそうな問題なのに、いくら調べても解決方法が出てこなかったので万策尽きて質問してみます。

やりたいことは単純で、

MainForm(こちらをメインフォームにする)
SubForm

という2つのフォームを作成し、アプリケーション起動と同時にSubForm->Show()を実行して常に2つのフォームを表示した状態にしたいのです。

ところがどういうわけかSubFormの方が常に前面に出てきてしまい、MainFormが後ろに隠れてしまって非常に困っています。もちろんマウスクリックでフォーカスの移動はできますが、どうやってもMainFormが前に出てこないのです。

TFormのプロパティに重なり順を指定するものがないか調べてみましたが、それらしきものは見つかりませんでした。BringToFront()メソッドやSetForegroundWindow()関数も試してみましたが、やはり前には出てきませんでした。

ヘルプを調べてみると、Screen変数のFormsプロパティにフォームのZオーダーを持たせているようなのですが、このプロパティは読み出し専用で書き換えることができません。

プロパティで設定することができないとすれば、フォームの重なり順序はどの時点で決定されるものなのか?、また変更する方法はないのか?、ご存じの方がおられたらご教示いただければ幸いです。

なお現在使っているバージョンはC++Builder 2009 Professionalです。


  パスワード:   

Top > コンポーネント > フォームの重なり順序を変更する方法は?