没有API在窗口之间切换模态。无论如何,你正在寻找你的案例的API是EnableWindow
。这就是模式的工作方式,除了用户应该使用的窗口以外的其他窗口都被禁用,以至于他/她无法与其进行交互。这也是“叮叮当当”的原因,向用户提供反馈。
因此,尽管让用户使用已被禁用的窗口来支持另一个模式窗口在技术上很简单,但处理状态可能并不简单。下面我将举一个最低限度的例子来说明它看起来会如何。
'FormB'第一个。让我们假设你在'Owner'参数中传递'FormA'的引用,而'FormA'正在构造'FormB'。下面的是什么,应该让“模拟”再次莫代尔可能看起来像代码:
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;
运行此代码时,会发生什么是“模拟”被启用并带到面前,“FormB”被禁用 - 点击时会产生一个'丁'。
但是我们还没有完成。因为我们修改了模态的含义 - 现在我们不希望'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。
唯一不明白的地方在于你的代码:-)不,只是在开玩笑。但这就是模态的工作原理,以及为什么它被称为“模态”。你想要的是一个非模态窗口。 – JensG
为什么不把所有东西放在一个表格上?您可以使用pagecontrol分开该部分。你甚至可以以编程方式在页面之间切换。 – Johan