ON/OFFできる全フォーム最前表示の仕方は?

解決


Gach  2003-09-15 22:34:12  No: 4826

いつもお世話になっています。
Form1をStayOnTopにしている時に別フォームをさらに表示させるとDelphiの仕様か
どうかわからないですが、最前面に表示されなくなってしまいます。
色々検索してOnDeactiveを使う方法が載っていたのですが、それだと常に全フォーム
が最前面に表示されてしまい、「最前面に表示」の機能をON/OFFする事ができません。
何か良い方法は無いでしょうか?
よろしくお願い致します。


たかみちえ  URL  2003-09-15 23:32:09  No: 4827

いまいちイメージがうまくできないんですけど、
つまり、Form1を親に、ほかをそれより手前に表示したいということでしょうか?

  それならば、Form1以外のフォームのCreateParamsメソッドをオーバーライドし、オーナーウィンドウに、Form1のハンドルを指定するとできます。

procedure TModalForm.CreateParams(var Params:TCreateParams);
begin
  inherited;
  // モーダルダイアログ
  Params.WndParent := Application.MainForm.Handle;
end;

  こんな感じですね。inheritedは忘れないこと。理由はわかりませんが、Paramsを変更したあとではだめです。

  あと、最前面表示ですが、複数のフォームの最前面表示を設定、それも頻繁に設定する場合は、Delphi標準のStayOnTopはあまり使わないほうがいいです(ちらつく&ウィンドウハンドルを作り直すので、APIを使ったときに問題が出る)。
  わたしの"おんぷむらのうら"にて公開している"stdDialogs"にある、TopMost関数を使うといいです。


Gach  2003-09-16 03:42:11  No: 4828

おかげさまで思い通りの動作になりました。
ありがとうござました。

ところで、stdDialogsは非常に便利そうなのですが、肝心の使い方が分かりません(^-^;
uses節にstdDialogsを加えるところまでは分かったのですが、実際に使用するには
どうすればよいのでしょうか?
かなり初歩的な事で申し訳ないです。


たかみちえ  URL  2003-09-16 04:02:12  No: 4829

"stdDialogs.dcuが見つからない"とか出たんでしょうか?

  それならば、ファイルをパスの通った(Delphiの環境オプションで設定できるもの)場所に、stdDialogsユニットをおいてください。

  そうしたらもうあとは何もありません。
usesにユニットがあれば、普通に関数として使えます。


Gach  2003-09-16 04:10:02  No: 4830

>  "stdDialogs.dcuが見つからない"とか出たんでしょうか?
これは出ませんでした。

普通に関数として使うとの事ですが、以下のような感じで良いのでしょうか?
  if CheckBox1.Checked = True then TopMost;

これだと"実パラメータが足りません"というエラーになってしまいます。


たかみちえ  URL  2003-09-16 04:34:19  No: 4831

ダウンロードページ下にある関数一覧を見てみてください。
TopMost関数は、引数にフォームのハンドル(Form.Handle)を必要とします。

  初期状態では関数名のあと(←括弧開始文字  を入力すると、関数の簡易宣言表示が出るので、参考にしてください。


Gach  2003-09-16 05:09:53  No: 4832

なるほど!
まだ基本的な事がうろ覚えなので、関数とは何なのかさっぱり頭から抜けていました。
これでこれからは便利に利用させていただくことが出来ます。

本当にありがとうございました。


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

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






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