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

最佳答案

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

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

但是,如果我是您,那么我会首先考虑设计,如果您关闭父窗体,该如何结束父窗体的处理呢?

编辑:对于下面的第3条评论-您可以尝试将模式表单归MainApps表单“拥有”。与MainFormOnTaskbar为true时,由应用程序主表单拥有的表单类似。请参阅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中。这种设计很脆弱,您可能会继续遇到问题...

关于delphi - 分配给Setparent(..)后Showmodal中的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3045126/

10-08 22:47