■ OpenDialogを上位で表示するには

[Delphi Q & A 掲示板] [過去ログの一覧]


歩如 2009/02/27(金) 14:18:16
環境はDelphi2007,WindowsVistaです

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

KHE00221 2009/02/27(金) 15:03:37 <初心者>
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/27(金) 15:04:53 <初心者>
SubMain → FormMain

歩如 2009/02/27(金) 15:20:52
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 [HomePage] 2009/02/27(金) 16:52:09
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(火) 11:16:56
[[解決]]

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

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

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

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

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library