Formがメインフォームの後ろに隠れないようにするには?

解決


galata  2008-02-22 15:34:49  No: 29899  IP: 192.*.*.*

Delphi2006Proを使用しています。

起動時に最初に表示されるメインフォーム(以下親Form)からForm1(子Form)を非モーダルで呼び出し、
その後、子FormからForm2(孫Form)をモーダルで表示する際、
子Formが親Formに隠れることがあります。
(孫→親→子の順番になってしまう)

子Form・孫Formをいくつか作って試したのですが、隠れるFormと隠れないFormがあり、
それぞれプロパティ等を見比べたのですが差異が見つけられません。
また、非モーダルで孫Formを表示しても同様に隠れてしまいます。

原因・対策等をご存知でしたらお教え下さい。

編集 削除
KHE00221  2008-02-22 16:33:33  No: 29900  IP: 192.*.*.*

それは新規に作成したフォームで、以下のようなプログラムのみで
起っているという事ですか?

//親

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;

な感じにすれば防げると思うけど

編集 削除
galata  2008-02-22 19:30:29  No: 29901  IP: 192.*.*.*

KHE00221さん返信ありがとうございます。

やろうとしていることはKHE00221さんのご指摘の通りです。
早速、ShowModalの前にSetFocusを試してみましたが治りませんでした。

今までに似たようなアプリはいくつか作っているのですが、
初めて起こった現象で、見当がつきません。

機能的には問題がないのですが違和感があるのでできれば修正したいと思っています。

編集 削除
おに  2008-02-23 14:06:31  No: 29902  IP: 192.*.*.*

子が常に親より前面になって良いのならCreateParamsをOverrideしてTCreateParams.WndParentに親フォームのハンドルをセットしてみるとか。

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := TForm(Owner).Handle;
end;

編集 削除
通りすがり  2008-02-23 19:01:47  No: 29903  IP: 192.*.*.*

上位に持って行きたい場合、こんなのは..

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

編集 削除
galata  2008-02-24 10:12:34  No: 29904  IP: 192.*.*.*

返信ありがとうございます。

会社でコーディングしてますので明日月曜日に試してみます。

孫Formはモーダルで表示するので表示中は常に子Formが親より前面に来るようにしたいと思ってます。

編集 削除
galata  2008-02-25 10:17:07  No: 29905  IP: 192.*.*.*

対策できました。

孫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);

以上のような処理に致しました。

原因がわからなかったのは残念ですが、解決とさせていただきます。
ありがとうございました。

編集 削除