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

解決


galata  2008-02-23 00:34:49  No: 29899

Delphi2006Proを使用しています。

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

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

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


KHE00221  2008-02-23 01:33:33  No: 29900

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

//親

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-23 04:30:29  No: 29901

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

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

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

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


おに  2008-02-23 23:06:31  No: 29902

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

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


通りすがり  2008-02-24 04:01:47  No: 29903

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

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 19:12:34  No: 29904

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

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

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


galata  2008-02-25 19:17:07  No: 29905

対策できました。

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

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

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


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

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






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