3

MainAppsとSubAppsの2つのアプリケーションを作成しました。SubAppsには、ログイン/ログアウトフォームなどのモーダルタイプのダイアログボックスがあり、正常に動作します。

MainAppsにアタッチすると、モーダルダイアログボックスが通常のボックス形式のように表示されます。「DIALOG.SHOWMODAL」ではなく「DIALOG.SHOW」のように動作します。

私はデルファイコンパイラを使用しています

SubAppsボタンクリック;

  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;
4

2 に答える 2

6

驚かないでください、あなたがしようとしていることはせいぜい珍しいことです。ShowModal呼び出し元のスレッドのすべてのウィンドウを無効にすることでモーダル効果を実現しますが、モーダル形式は無効にします。親フォームは同じスレッドに属していないため、同じプロセスに属していなくても、無効になることはありません。DisableTaskWindows'ShowModal'が呼び出されたときにフォームがどのように無効になるかを理解するには、forms.pasを参照してください。

独自のモーダル手順を考案する必要があります。アプリケーションがデスクトップではないトップレベルウィンドウでペアレント化されているかどうかをテストし、その場合はそのウィンドウを無効にします。

しかし、もし私があなただったら、最初にデザインについて考えます。もしあなたが親フォームを閉じたら、親フォームのプロセスをどのように終わらせるのでしょうか?


編集:以下の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;
    [...]


何を達成したいのかについての設計の提案について質問することをお勧めします。たとえば、コードの再利用に関する場合は、DLLでSubAppsフォームをホストできます...この設計は壊れやすいです。それで問題に遭遇し続けるかもしれません...

于 2010-06-15T14:02:43.467 に答える
2

Windowsを「アプリケーションモーダル」ではなく「システムモーダル」にしてみてください。実は、それができるかどうかはわかりません。それは不可能かもしれませんし、悪い考えかもしれません。実際、質問全体が私に「悪い考え」の匂いを与えます。

于 2010-06-15T15:35:21.197 に答える