3

我创建了两个应用程序 MainApps 和 SubApps,SubApps 有一个模式类型对话框,例如登录/注销表单等,并且工作正常。

将它附加到 MainApps 后,模态对话框显示为正常的框形式。它的行为类似于“DIALOG.SHOW”而不是“DIALOG.SHOWMODAL”;

我正在使用delphi编译器

子应用按钮点击;

  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 按钮单击

begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
4

2 回答 2

6

不要惊讶,你正在尝试的东西充其量是不寻常的。ShowModal通过禁用调用线程的所有窗口,除了模态窗体来实现模态效果。由于您的父表单不属于同一个线程,甚至不属于同一个进程,因此它不会被禁用。请参阅DisableTaskWindowsforms.pas 以了解在调用“ShowModal”时如何禁用表单。

您必须设计自己的模态程序;测试应用程序是否在不是桌面的顶级窗口中作为父级,如果是这样,请禁用该窗口。

但是如果我是你,我会首先考虑设计,如果你关闭父窗体,你如何结束父窗体的进程?


编辑:对于下面的第三条评论 - 您可以尝试让 MainApps 表单“拥有”模态表单。类似于应用程序主窗体拥有的窗体,虽然MainFormOnTaskbar是真的。请参阅msdn的Window Features主题中的拥有的窗口。

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 回答