OpenDialogを上位で表示するには

解決


歩如  2009-02-27 23:18:16  No: 33492

環境はDelphi2007,WindowsVistaです

FormMain で FormStyle=fsStayOnTop を設定し、
FormMain に複数のボタンを配置し、ボタンが押されるとShow で
フォーム(例えば:FormSub)を表示するのですが、
この FormSub 上にボタンがあり、このボタンを押すと
OpenDialog を使用してファイル名を取得するプログラムですが、
Diallog が FormSub の下に表示されます。
FormSub の FormStyle=fsNormal になっています。
FormMain はランチャーのように動作させておきたいので
常に最上位に表示させておき、 FormSub は最上位でなくても
いいのですが  FormMain に連動しているようです。
どうすればよいのでしょうか。


KHE00221  2009-02-28 00:03:37  No: 33493

2006 + XP で再現しないのでなんとも言えませんが

>FormMain に連動しているようです。

とするならば

  public
    function OpenDialog: Boolean;
  end;

function TFormMain.OpenDialog: Boolean;
begin
    Result := OpenDialog1.Execute;
end;

procedure TFormSub.Button1Click(Sender: TObject);
begin
    if FormMain.OpenDialog = True then
    begin

    end;
end;

として FormSub から SubMain の OpenDialog 使用するように
したらどうでしょうか?


KHE00221  2009-02-28 00:04:53  No: 33494

SubMain → FormMain


歩如  2009-02-28 00:20:52  No: 33495

KHE00221さん
ありがとうございます。
早速試してみたのですが、変化がありませんでした。
コードは以下のとおりです。
プロパティの設定変更は主に次のようにしています
FormMain  FormStyle = true;
          Position = poScreenCenter;
          Scaled = false;
FormSub   FormStyle = fsNormal;
          Position = poScreenCenter
          Scaled = false;

<FormMain>
procedure TFormMain.Button1Click(Sender: TObject);
begin
FormSub.ShowModal;
end;

<FormSub>

procedure TFormSub.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute = true then begin
  end;
end;

↓↓↓変更後↓↓↓

procedure TFormSub.Button1Click(Sender: TObject);
begin
  if FormMain.OpenDialog1.Execute = true then begin
  end;
end;

症状は
  FormSub.ShowModal を呼び出して、FormSub が表示されたときに
FormSub の FormStyle=fsNormal なのに 最上位になっています。
最上位のフォームから呼ばれた Dialog はこのフォームの下に
隠れてしまって見えなくなるといった状態になっています。

以上よろしくお願いします。


Mr.XRAY  URL  2009-02-28 01:52:09  No: 33496

Mr.XRAYです.

文章が読みづらいので書き直しました.
以下でいいでしょうか.

環境はWindows Vista + Delphi 2007

1. 新規プロジェクト作成
    このFormをFormMainとする
    FormStyle := fsStayOnTop;
    ボタンを1つ配置
2. Formを追加.FormSubとする    
    このFormSubのFormSytleはfsNormal
    ボタンとTOpenDialogを各1つ配置 
3. 以下のボタンクリックコードを実行する

FormMainではボタンクリックでFormSubをShowMadalで表示
usseにFormSubのユニット名が必要
([ファイル][ユニットを使う]で追加可能)

procedure TFormMain.Button1Click(Sender: TObject);
begin
   FormSub.ShowModal;
end;

表示したFormSubでボタンクリックでOpenDialogを表示
すると,OpenDialogが後(どこの?)に隠れてしまう.

procedure TFormSub.Button1Click(Sender: TObject);
begin
    if OpenDialog1.Execute then begin
    end;

end;

もしかしたら以下でOpenDialogが最前面に表示されるかも知れません.
動作確認は,Windows Vista + Delphi 2007-R2 Pro
これはVista特有の現象です.
Windows XP上で作成したEXEは,Vista上ではTrueでもFalseでも同じです.
なお,FormMainでForsub.ShowModalとしているのは,
FormMainのFormStyleがfsStayOnTopとなっているためです.
このままでFormSubをShowすると,FormSubがFormMainの後に(Zオーダで)いってしまいます.

[プロジェクト][ソース表示]で以下のTrueの部分をFalseにする.

  Application.MainFormOnTaskbar := True;


歩如  2009-03-03 20:16:56  No: 33497

Mr.XRAYさんありがとうございます。

Application.MainFormOnTaskbar := False で直りました。

ありがとうございます。
私の説明不足を直していただいた上に
正回答までいただきどうもすみませんでした。

ちなみに
>OpenDialogが後(どこの?)に隠れてしまう.
FormMain,FormSub のメニューの後ろに
隠れてしまってDailogのメニューがみえなくなるということです。


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

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






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