setParentに割り当てた後のshowmodalの問題(..)
-
27-09-2019 - |
質問
2つのアプリケーションMainAppsとSubappsを作成しました。Subappsには、ログイン/ログアウトフォームなどのモーダルタイプダイアログボックスがあり、その動作は正常に機能します。
MainAppsに添付した後、モーダルダイアログボックスは通常のボックスフォームのように表示されます。 「dialog.showmodal」の代わりに「dialog.show」のように動作します。
Delphiコンパイラを使用しています
Subapps buttonclick;
begin
with TfrmDialog.Create(Self, dtLogout) do
try
iMsgResult := ShowModal;
finally
Free;
end;
if iMsgResult = mrOk then
begin
dmVoca.FHomeworkXMLDoc.Active := False;
//Disabled Double Login
dmVoca.tmrDoubleLogin.Enabled := False;
................
end;
end;
MainApps buttonclick
begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
解決
驚かないでください、あなたがしようとしていることはせいぜい珍しいです。 ShowModal
呼び出しスレッドのすべてのウィンドウをモーダルフォーム以外のすべてのウィンドウを無効にすることにより、モーダル効果を実現します。親のフォームは同じスレッドに属しておらず、同じプロセスにも属していないため、無効になりません。見る DisableTaskWindows
forms.pasでは、「showmodal」が呼び出されたときにフォームがどのように無効になっているかを理解します。
独自のモーダル手順を考案する必要があります。アプリケーションがデスクトップではない上位レベルのウィンドウに子育てがあるかどうかをテストするには、その場合はそのウィンドウを無効にします。
しかし、もし私があなただったら、最初にデザインについて、もしあれば、親のフォームを閉じたらどうでしょう、あなたはどのようにして親のフォームのプロセスを終了しますか?
編集: 以下の3番目のコメントについては、MainAppsのフォームでモーダルフォーム「所有」を使用してみてください。アプリケーションのメインフォームが所有するフォームに似ています
MainFormOnTaskbar
本当です。見る 所有ウィンドウ の上 ウィンドウ機能 MSDNのトピック。
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
たとえば、コードの再利用に関するものである場合、あなたが達成したいものについてのデザインの提案について質問することを謙虚に提案することをお勧めします。それで問題に遭遇し続けるかもしれません...
他のヒント
「アプリケーションモーダル」ではなく、Windowsの「システムモーダル」を作成してみてください。実際、あなたがそれをすることさえできるかどうかはわかりません。それは不可能であるか、悪い考えかもしれません。実際、質問全体が「悪い考え」の匂いを与えてくれます。