Delphi2006Proを使用しています。
起動時に最初に表示されるメインフォーム(以下親Form)からForm1(子Form)を非モーダルで呼び出し、
その後、子FormからForm2(孫Form)をモーダルで表示する際、
子Formが親Formに隠れることがあります。
(孫→親→子の順番になってしまう)
子Form・孫Formをいくつか作って試したのですが、隠れるFormと隠れないFormがあり、
それぞれプロパティ等を見比べたのですが差異が見つけられません。
また、非モーダルで孫Formを表示しても同様に隠れてしまいます。
原因・対策等をご存知でしたらお教え下さい。
それは新規に作成したフォームで、以下のようなプログラムのみで
起っているという事ですか?
//親
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
end;
//子
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3.ShowModal;
end;
とりあえず
procedure TForm2.Button1Click(Sender: TObject);
begin
SetFocus;
Form3.ShowModal;
end;
な感じにすれば防げると思うけど
KHE00221さん返信ありがとうございます。
やろうとしていることはKHE00221さんのご指摘の通りです。
早速、ShowModalの前にSetFocusを試してみましたが治りませんでした。
今までに似たようなアプリはいくつか作っているのですが、
初めて起こった現象で、見当がつきません。
機能的には問題がないのですが違和感があるのでできれば修正したいと思っています。
子が常に親より前面になって良いのならCreateParamsをOverrideしてTCreateParams.WndParentに親フォームのハンドルをセットしてみるとか。
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := TForm(Owner).Handle;
end;
上位に持って行きたい場合、こんなのは..
Form1.formstyle := fsStayOnTop ;
SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
Form1.Show ;
フォームの優先度は
HWND_Bottom / HWND_TOPMOST / HWND_TOP ..etc
返信ありがとうございます。
会社でコーディングしてますので明日月曜日に試してみます。
孫Formはモーダルで表示するので表示中は常に子Formが親より前面に来るようにしたいと思ってます。
対策できました。
孫Form(Form3)のShowModal時に
Form3.FormStyle := fsStayOnTop;
SetWindowPos(Self.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
Form3.ShowModal;
// そのままだと親Formが子Formに隠れっぱなしになるので孫が閉じられたら戻す
SetWindowPos(Self.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);
以上のような処理に致しました。
原因がわからなかったのは残念ですが、解決とさせていただきます。
ありがとうございました。
ツイート | ![]() |