分配给Setparent(..)后Showmodal中的问题

时间:2010-06-15 12:36:02

标签: delphi forms modal-dialog dialog setparent

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

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

我正在使用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;

2 个答案:

答案 0 :(得分:6)

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

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

但如果我是你,我会首先考虑设计,如果,你关闭父表格,你如何结束父母表格的过程?

<小时/> 编辑以下第三条评论 - 您可以尝试使用MainApps表单“拥有”模式表单。类似于应用程序主表单所拥有的表单,MainFormOnTaskbar为真。有关msdn。

owned windows主题,请参阅Window Features
var
  frmDialog: TfrmDialog;
begin
  [...]
  frmDialog := TfrmDialog.Create(Self, dtLogout);
  try
    SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
    iMsgResult := frmDialog.ShowModal;
    [...]

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

答案 1 :(得分:2)

尝试将您的窗口设置为“系统模式”而不是“应用模式”。实际上,我不知道你是否能做到这一点。这可能是不可能的,也可能是个坏主意。事实上,整个问题给了我“坏主意”的气味。