没有在窗口之间切换模式的 API。无论如何,您正在寻找您的案例的 API 是 EnableWindow。这就是模态的工作方式,用户应该使用的窗口以外的窗口被禁用,因此他/她无法与它们交互。这也是发出“叮”声的原因,向用户提供反馈。
因此,虽然让用户使用已禁用的窗口转而使用另一个模式窗口在技术上很容易,但处理状态可能并不简单。我在下面提供了一个最低限度的示例,说明它似乎需要做什么。
首先是'FormB'。假设您在 'FormA' 正在构造 'FormB' 时在 'Owner' 参数中传递了 'FormA' 的引用。以下是应该再次使“FormA”模态的代码可能如下所示:
procedure TFormB.BtnMakeFormAModalAgainClick(Sender: TObject);
begin
Enabled := False; // so that 'A' will behave like it's modal
EnableWindow(TFormA(Owner).Handle, True); // so that 'A' could be interacted
TFormA(Owner).SetFocus;
end;
当这段代码运行时,会发生什么情况是“FormA”被启用并被带到前面,而“FormB”被禁用——点击时会产生一个“叮当”。
但我们还没有完成。因为我们修改了modality的含义——现在我们不希望'FormA'在用户完成后关闭。以下是 'FormA' 单元中的代码可能如下所示:
type
TFormA = class(TForm)
BtnShowModalB: TButton;
BtnOk: TButton;
procedure BtnShowModalBClick(Sender: TObject);
procedure BtnOkClick(Sender: TObject);
private
FModalB: TForm;
end;
implementation
uses
unitOfFormB;
{$R *.dfm}
procedure TFormA.BtnShowModalBClick(Sender: TObject);
begin
FModalB := TFormB.Create(Self); // so that FormB can find FormA from the Owner
FModalB.ShowModal;
FModalB.Free;
FModalB := nil; // Need this if we're going to decide if FormB is showing
// by testing against this reference
end;
procedure TFormA.BtnOkClick(Sender: TObject);
begin
if Assigned(FModalB) then begin // is FormB the actual modal form?
EnableWindow(Handle, False); // disable this form so it would 'ding'
FModalB.Enabled := True; // enable FormB, so user can interact with it
FModalB.SetFocus;
ModalResult := mrNone; // don't close, FormB is the first one to be closed
end else
ModalResult := mrOk;
end;
我几乎可以肯定这个示例并不完整,但这是您正在寻找的 API。