Delphi - 覆盖 TForm.showModal 的隐藏行为

标签 delphi tform windowing

我目前正在为现有的 Delphi 应用程序编写一个窗口系统。

目前,该程序由许多全尺寸表单组成,这些表单按照需要的顺序以模态方式显示,并且用户无法移动其中任何一个。我的目标是让所有这些形式都可以移动。以前,表单彼此堆叠在一起,但由于无法移动任何表单,因此用户看不到背景表单。到目前为止,我的解决方案是在打开新子窗体时隐藏“父”窗体,并在关闭该子窗体时重新显示它。

不幸的是,由于每个子表单都是用 showModal 调用的,所以直到模态过程完成之后才会调用使父表单可见,因此在子表单被隐藏之后,用户会看到没有表单的瞬间闪烁可见。

有没有办法可以防止模态表单在流程完成后自动隐藏?一旦父表单再次可见,这将允许我手动隐藏它们。我尝试在每个子窗体的 FormHide 事件中安排此操作,但这不起作用,因为在打开其自己的子窗体之一时,子窗体也被隐藏。

编辑:

这是我迄今为止根据雷米的建议得到的信息

procedure openModalChild(child: TForm; parent: TForm);
var
  WindowList: Pointer;
  SaveFocusCount: Integer;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
  Result: integer;
begin
  CancelDrag;
  with child do begin
  Application.ModalStarted;
  try
  ActiveWindow := GetActiveWindow;
  WindowList := DisableTaskWindows(0);
  //set the window to fullscreen if required
  setScreenMode(child);
  try
    Show; //show the child form
    try
      SendMessage(Handle, CM_ACTIVATE, 0, 0);
      ModalResult := 0;
      repeat
        Application.HandleMessage;
        //if Forms.Application.FTerminate then ModalResult := mrCancel else
          if ModalResult <> 0 then closeModal(child as TCustomForm);
      until ModalResult <> 0;
      Result := ModalResult;
      SendMessage(Handle, CM_DEACTIVATE, 0, 0);
      if GetActiveWindow <> Handle then ActiveWindow := 0;
    finally
      parent.Show;
      Hide;
    end;
  finally
    EnableTaskWindows(WindowList);
    parent.Show; //reshow the parent form
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
  end;
  finally
    Application.ModalFinished;
  end;
  end;
end;

这工作得很好,但唯一的问题是事件的重复循环永远不会中断,即使在子窗体被转义之后也是如此,因此父窗体永远不会重新显示。 有什么办法可以解决这个问题吗?

最佳答案

ShowModal() 在进入模态处理循环之前显式调用 Show(),并在退出模态处理循环后立即显式调用 Hide()环形。如果不更改 VCL 的 Forms.pas 源文件中的代码,则无法更改它。

如果您需要对窗口进行更精细的控制,而不需要编辑 VCL 源代码,那么根本不要使用 ShowModal()。根据需要自行使用 Show()Hide()DisableTaskWindows()EnableTaskWindows()。我建议您查看 Forms.pas 以了解它们是如何使用的。将 ShowModal() 的实现复制到您自己的函数中,然后您可以根据需要对其进行自定义。

关于Delphi - 覆盖 TForm.showModal 的隐藏行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540496/

相关文章:

delphi - Single 数组的内存复制和内存比较数组

delphi - 为什么 TForm.SetBounds 仅在设计时将 TForm.Position 设置为 poDefault 时才能正常工作

python - 使用加窗位移和带通计算 FFT

hadoop - 跳跃与滑动窗口

安卓应用版本(RAD Studio XE5)

Delphi 助手作用域

.net - 如何从 Delphi Win32 应用程序访问 .Net Web 服务?

delphi - 如何处理Windows 11中引入的TForm和自定义缩放?

Delphi - 是否可以禁用 Delphi 的表单延迟加载?

sql-server - TSQL 用窗口和 CTE 替换 "Quirky Update"计算