【问题标题】:Problems in Showmodal after assigning to Setparent(..)分配给 Setparent(..) 后 Showmodal 中的问题
【发布时间】:2010-06-15 12:36:01
【问题描述】:

我创建了两个应用程序 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;

【问题讨论】:

  • 您能提供更多信息吗?也许一些代码 sn-ps 以及您正在使用的 Delphi 版本?
  • 好的,看看..我想知道什么问题。我疯了!
  • @Warren P,我用的是delphi7/delphi2009

标签: delphi forms modal-dialog dialog setparent


【解决方案1】:

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

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

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


编辑: 对于下面的第三条评论 - 您可以尝试让 MainApps 的表单“拥有”模态表单。类似于应用程序主表单拥有的表单,而 MainFormOnTaskbar 为真。请参阅 msdn 的 Window Features 主题上的 owned windows
var
  frmDialog: TfrmDialog;
begin
  [...]
  frmDialog := TfrmDialog.Create(Self, dtLogout);
  try
    SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
    iMsgResult := frmDialog.ShowModal;
    [...]


我谦虚地建议您就您想要实现的设计建议提出一个问题,例如,如果它是关于代码重用,您可以在 dll 中托管您的 SubApps 表单...这个设计很脆弱,你可能会继续遇到问题......

【讨论】:

  • 如果我可以点击 MainApps 上的按钮没有问题。如果 SubApps 表单弹出一个属于 subapps 本身的模式对话框,则应该禁用它。它完全忽略了子应用程序中的所有模式。有没有办法让它变回来?
  • 如您在 forms.pas 中所见,DisableTaskWindows 使用EnumThreadWindows 枚举属于当前线程的所有顶级窗口。成为父级后,您的表单不再是 top level 窗口,因此它不会被 enumerated 和 disabled 。围绕“ShowModal”强加你的逻辑,比如; EnableWindow(Handle, False)trywith TfrmDialog.Create(Self, dtLogout) dotry 等。
  • 如何使 SubApps 中的 DialogBox 保持在 MainApps 之上?因为如果我单击 MainApps 对话框(子应用程序)将在后面发送。
【解决方案2】:

尝试让您的 Windows 成为“系统模式”而不是“应用程序模式”。实际上,我不知道你是否能做到这一点。这可能是不可能的,或者是个坏主意。事实上,整个问题给了我“坏主意”的味道。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 2022-01-25
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多