質問

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の「システムモーダル」を作成してみてください。実際、あなたがそれをすることさえできるかどうかはわかりません。それは不可能であるか、悪い考えかもしれません。実際、質問全体が「悪い考え」の匂いを与えてくれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top