メインフォームと「一緒に」表示される別のフォームが欲しいので、メインフォームと重ならないようにします。
次に例を示します。
メインプログラムがログとどのようにオーバーラップしているかに注意してください。Delphiでそれを行う方法がわかりません。
ありがとう!
この質問に対する答えは、非常に便利なウィンドウ機能のMSDNトピックにあります。
関連情報は次のとおりです。
オーバーラップまたはポップアップウィンドウは、別のオーバーラップまたはポップアップウィンドウが所有できます。所有されると、ウィンドウにいくつかの制約が課せられます。
- 所有されているウィンドウは、常にzオーダーでその所有者の上にあります。
- 所有者が破棄されると、システムは所有されているウィンドウを自動的に破棄します。
- 所有者が最小化されると、所有ウィンドウは非表示になります。
アプリの主な形式は、他のポップアップウィンドウの所有者です(Delphiの用語ではなくWindowsの用語で)。上記の最初の箇条書きは、所有されているウィンドウが常にメインフォーム(所有者)の上に表示されることを意味します。
3つのフォームでアプリを作成し、それらすべてを表示してみてください。.dprは次のようになります。
program OwnedWindows;
uses
Forms,
Main in 'Main.pas' {MainForm},
Popup1 in 'Popup1.pas' {PopupForm1},
Popup2 in 'Popup2.pas' {PopupForm2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, Main);
Application.CreateForm(TPopupForm1, PopupForm1);
Application.CreateForm(TPopupForm2, PopupForm2);
PopupForm1.Show;
PopupForm2.Show;
Application.Run;
end.
メインフォームは常に他の2つのフォームの下にありますが、これらの他の所有フォームは互いに上または下にある可能性があります。メインフォームを最小化すると、それらはすべて消えます。
すべてのフォームをトップレベルの所有されていないウィンドウにしたい場合は、次のようにできます。
procedure TPopupForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0;
end;
そして、私の例のTPopupForm2も同様です。これにより、3つのウィンドウすべてにタスクバーボタンが表示されます。
もう1つのアプローチは、Vista以前の方法に戻し、アプリケーションの非表示ウィンドウを最上位の所有者ウィンドウにすることです。これを行うには、Application.MainFormOnTaskbarがFalseであることを確認します。すべてのCreateParamsコードをスキップすると、タスクバーに単一のウィンドウが表示され、最上位の所有者ウィンドウが非表示のウィンドウApplication.Handleであるため、どのウィンドウも他のウィンドウの上に置くことができます。もちろん、欠点はエアロピークを失うことです。
したがって、メインフォームを通常どおりタスクバーに表示する必要があると思いますが、他のフォームが(Windowsの意味で)メインフォームによって所有されていないことを確認してください。ただし、タスクバーに表示されないようにするには、それらを所有する必要があります。したがって、次のように、CreateParamsメソッドを使用して、非表示のアプリケーションウィンドウを所有者にすることができます。
procedure TOverlappedPopupForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := Application.Handle;
end;
コメントで別の言い方をしますが、これを行うと、メインフォームを最小化すると、ポップアップフォームが実際に非表示になります。そして、メインフォームが復元されたときに再び表示されます。したがって、これで問題は完全に解決すると思います。
Delphiを開いていませんが、設定します
mainform.formstyle := fsStayOnTop
子フォームを
childform.show;
仕事?
または、SetWindowPos()を使用して、メインフォームでhWndInsertAfterプロパティをHWND_TOPMOSTのようなものに設定してみてください