在Delphi中如何阻止父级窗口的操作

4
我正在尝试创建一个简单的应用程序,显示两个表单窗口。第一个主要窗体应该能够在点击底部按钮时显示一个弹出式表单窗口。显示的第二个窗体必须禁用主窗体的功能。
请提供这个示例的简单代码。

请不要关闭这个问题。很明显,原帖的问题已经得到了清晰的表述,这也可以从点赞和六个回答中看出。 - Johan
4个回答

7

尝试:

procedure ShowModalForm()
var 
  newForm: TNewForm;
begin
  newForm := TNewForm.Create(nil);
  try
    newForm.ShowModal;
  finally
    newForm.Free;
  end;
end;

1
@David:啊啊啊,今天我们要“见面”了,你不觉得受到爱了吗 :) 你拥有我的极大尊重!!! ;) - Marco
@Marco:看一下我对Shamballa的评论。我不会点踩,但我不能点赞,因为代码写得很糟糕。(没有变量声明,将Application作为所有者不必要地赋值,而模态窗体可能会立即释放,并且没有try..finally确保在使用后将其释放。)对于一个明显的初学者来说,这是一个糟糕的示例。 :) - Ken White
@KenWhite:你说得对,我为我的糟糕示例向您道歉。希望现在好了。谢谢 :) - Marco
@KenWhite:我刚刚看到了你在David的回答下的评论:有人故意给David点踩吗?如果是这样,为什么?发生了什么事? - Marco
非常接近了。我已经为一个小错误进行了编辑(Create中的空参数,这将无法编译)。+1。David将不得不回答你提出的问题(但可能不会)。 - Ken White
@Marco,是的,“过早优化”(以前被称为Downvoter)走进了光明,似乎对我有某种私怨。 - David Heffernan

4
另一种创建方法如下所示:

procedure TForm1.btnCreateFormClick(Sender: TObject);
var
   YourForm : TYourForm;
begin
  YourForm := TYourForm.Create(nil);
  try
    YourForm.ShowModal;
  finally
    YourForm.Free;
  end;
end;

1
如果你做两件事情,我会点赞的:1)将“YourForm”声明为本地变量(在“procedure”和“begin”之间),2)将“FreeAndNil”更改为“YourForm.Free” - 如果“YourForm”是本地变量,则无需释放它,因为它超出范围并且不能在其他地方再次使用。如果您在同一过程中以模态显示并释放它,则将其设置为nil是没有意义的,并且会使代码混乱。 :) 还要注意,我没有对此进行贬低,但是向明显的新手展示糟糕的代码的帖子也不能得到赞扬。 - Ken White

4
最简单的实现方式是以模态框形式展示表单。调用ShowModal方法来展示表单,主窗体不会被禁用且无法接收任何输入。

0

这里有一些样板代码,展示了Delphi中模态窗口的行为:

procedure TMain.Button1Click(Sender: TObject);
var
  Result: TModalResult;
begin
  { if Dialog is not in "auto-create forms" list - instantiate it }
  if not Assigned(Dialog) then
    Application.CreateForm(TDialog, Dialog);

  { MODAL forms are blocking input on per application level }
  { so the following call blocks until Dialog form closes }
  Result := Dialog.ShowModal();

  if IsPositiveResult(Result) then
  begin
    { handle if user responds with OK, Yes, etc }
    ShowMessage('Accepted');
  end
  else
  begin
    { or handle Close, Cancel, No, ... }
    ShowMessage('Cancelled');
  end;
end;

通过在对象检查器中分配按钮控件ModalResult属性,可以实现不同的对话框结果。有关更多信息,请阅读ShowModal方法。

以下是相关的 DFM 代码片段,以说明 ModalResult 属性设置:

  object btnOK: TButton
    Caption = 'OK'
    ModalResult = 1
  end
  object btnCancel: TButton
    Caption = 'Cancel'
    ModalResult = 2
  end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接