いつもお世話になっています。
Form1をStayOnTopにしている時に別フォームをさらに表示させるとDelphiの仕様か
どうかわからないですが、最前面に表示されなくなってしまいます。
色々検索してOnDeactiveを使う方法が載っていたのですが、それだと常に全フォーム
が最前面に表示されてしまい、「最前面に表示」の機能をON/OFFする事ができません。
何か良い方法は無いでしょうか?
よろしくお願い致します。
いまいちイメージがうまくできないんですけど、
つまり、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関数を使うといいです。
おかげさまで思い通りの動作になりました。
ありがとうござました。
ところで、stdDialogsは非常に便利そうなのですが、肝心の使い方が分かりません(^-^;
uses節にstdDialogsを加えるところまでは分かったのですが、実際に使用するには
どうすればよいのでしょうか?
かなり初歩的な事で申し訳ないです。
"stdDialogs.dcuが見つからない"とか出たんでしょうか?
それならば、ファイルをパスの通った(Delphiの環境オプションで設定できるもの)場所に、stdDialogsユニットをおいてください。
そうしたらもうあとは何もありません。
usesにユニットがあれば、普通に関数として使えます。
> "stdDialogs.dcuが見つからない"とか出たんでしょうか?
これは出ませんでした。
普通に関数として使うとの事ですが、以下のような感じで良いのでしょうか?
if CheckBox1.Checked = True then TopMost;
これだと"実パラメータが足りません"というエラーになってしまいます。
ダウンロードページ下にある関数一覧を見てみてください。
TopMost関数は、引数にフォームのハンドル(Form.Handle)を必要とします。
初期状態では関数名のあと(←括弧開始文字 を入力すると、関数の簡易宣言表示が出るので、参考にしてください。
なるほど!
まだ基本的な事がうろ覚えなので、関数とは何なのかさっぱり頭から抜けていました。
これでこれからは便利に利用させていただくことが出来ます。
本当にありがとうございました。
ツイート | ![]() |