Delphi返回自定义结果以显示模态窗口

4

我有一个包含两个按钮的表单(一个是mrOK,一个是mrCancel)。

当我单击其中一个按钮时,表单会关闭(调用OnClose),无论如何。

我想返回自定义值。像这样:

procedure OpenForm;
var
 MyForm : TMyForm;
begin
 MyForm := TMyForm.Create (NIL);
 try 
  if MyForm.ShowModal = 1337 then begin
   // [...]
  end;
 finally
  MyForm.Free
 end;
end;

模态表单:
 procedure TMyForm.Button1Click(Sender: TObject); // mrOK
 begin
  if Edit1.Text = '' then abort; // Don't close here?!
 end;

 procedure TExecutePrompt.FormClose(Sender: TObject;
 var Action: TCloseAction);
 begin
  if Edit1.Text = '' then abort; // Works but if the user clicks the X it should return mrCancel
 end;

希望您能理解我的意图。 这是一个带编辑控件的提示窗口。如果控件中没有文本,则应保持窗口打开,直到输入文本为止(除非点击了X)。
谢谢您的帮助。

3
顺便说一下,“MyForm := TMyForm.Create(nil);” 应该放在“try”之前。 - Andreas Rejbrand
1
真的。你不能释放从未在内存中声明/对齐的东西 :) - Ben
1个回答

18

为了使用特定的模态结果值关闭模态窗口,只需赋值:

ModalResult := MyVal; // This will close this modal window
                      // and the modal result will be MyVal

也就是说,确保Button1ModalResult = mrNone,然后你就可以执行像下面这样的操作:

procedure TMyForm.Button1Click(Sender: TObject); // mrOK
begin
  if Edit1.Text <> '' then ModalResult := 1337;
end;

如果编辑框不为空,这将关闭表单,并且模态结果将是1337


1
就是这样,谢谢。它也必须是mrNone!这可能是一个坏陷阱。 - Ben
6
为了更精确地说,关闭模态窗口需要分配一个不为0的值 - TLama
2
与其编写一个OnClick处理程序,您可以在窗体设计器中将ModalResult属性设置为您的特殊值。 - David Heffernan
2
@David:但是这样你会失去一些自由。 - Andreas Rejbrand
4
@David: 这种自由:如果Sth1,则ModalResult:= 1337,否则如果Sth2,则ModalResult:= 1338 - Andreas Rejbrand

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