【发布时间】:2021-06-25 18:41:20
【问题描述】:
我需要帮助...
我在 Delphi VCL Forms 应用程序中有两个分离的模态表单。 基于以下解决方案: How can I make a form that is not disabled when another form is shown modally?
我使用EnableWindow(Self.Handle, True),它运行良好:我可以打开和编辑第一个表单,无需关闭它,打开第二个表单。两者都处于活动状态且可编辑。
当我尝试关闭第一个模态表单而不关闭第二个模态表单时,问题就开始了。它一直等到第二个关闭。
是否存在强制关闭第一个模态表单(Self.Free 除外,因为我需要父表单中的模型表单中的一些信息)而第二个仍然打开的任何方法?
代码很简单:
主窗体(带 Button1):
procedure TfrMainForm.WMEnable(var _Msg: TWMEnable);
begin
inherited;
if not _Msg.Enabled and (Application.ModalLevel > 0) then Begin
EnableWindow(Self.Handle, True);
End;
end;
procedure TfrMainForm.Button1Click(Sender: TObject);
Var
tmpSubForm: TfrSubForm;
begin
tmpSubForm := TfrSubForm.Create(Self);
Try
tmpSubForm.ShowModal;
//get some information from tmpSubForm
Finally
tmpSubForm.Free;
End;
end;
“子”表单(什么都不做 - 只打开):
procedure TfrSubForm.WMEnable(var _Msg: TWMEnable);
begin
inherited;
if not _Msg.Enabled and (Application.ModalLevel > 0) then Begin
EnableWindow(Self.Handle, True);
End;
end;
【问题讨论】:
-
重新考虑你的方法。如果您不希望表单是模态的,请不要以模态形式显示它。
-
事情已经走得太远了。我正在寻找的解决方案将解决问题,如果它不存在,那么它可能必须完成。
-
但这一开始是没有意义的:只要做到MDI 明智,不要禁用/模态任何窗口只是为了在之后摆弄它。只显示窗户。完成。
-
@Piotr 根据定义,模态表单会阻止现有 UI,直到表单关闭。因此,如果您显示 1 个模态表单,然后显示第 2 个模态表单,则第 1 个表单将被阻止,直到第 2 个表单关闭。 这是设计使然。如果您需要两个表单都具有交互性,包括能够独立关闭它们,那么模态就是错误的解决方案。
-
该解决方法是错误的。模态窗口的设计正如@Remy 已经描述的那样。如果您不想要标准的模态行为,那么首先将您的代码修复为不使用模态窗口。试图将不适当的行为强加到您的应用程序中只会让您在未来失败。如果您一次需要多个活动窗口,则根本不应该使用模态窗口。期间。
标签: forms delphi modal-dialog