Delphi 如何从边框图标检测关闭窗体?

Delphi 如何从边框图标检测关闭窗体?,delphi,delphi-2010,Delphi,Delphi 2010,我的表格中有“取消”和“确定”按钮。他们两个都做了些什么,然后称之为接近形式。如何使窗体上的[x]按钮调用Cancelclick?您可以使用窗体的OnCloseQuery事件 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:= true; //or not ButtonCancelClick(Self); end; 如果您的按钮设置了其modalresult

我的表格中有“取消”和“确定”按钮。他们两个都做了些什么,然后称之为接近形式。如何使窗体上的[x]按钮调用Cancelclick?

您可以使用窗体的OnCloseQuery事件

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:= true;  //or not
  ButtonCancelClick(Self);
end;

如果您的按钮设置了其
modalresult
属性,则它们也将调用
OnCloseQuery
,此代码将不起作用。在这种情况下,请使用David的答案。

如果表单以模式显示,则只需测试
ModalResult
的值即可。值mrCancel表示已单击十字


我倾向于使用按钮的
ModalResult
属性来关闭表单。将确定按钮的
ModalResult
设置为
mrOK
,将取消按钮的
mrCancel

添加到表单的公共声明中

procedure WMSysCommand(var MSG: TWMSysCommand); message WM_SYSCOMMAND;
然后添加方法

procedure TForm1.WMSYSCommand(var MSG:  TWMSysCommand);
begin
  if MSG.CmdType = SC_CLOSE then
  begin
     //Closing from border icon
  end;
  inherited;
end;

不,如果要检测十字上的点击,则不能使用OnClose。这只调用OnCloseQuery.Hmm,我认为当表单关闭时,
OnCloseQuery
总是会触发,即当用户通过OK或Cancel按钮关闭表单时也会触发。因此,在您的代码中,ButtonCancelClick将始终被“激发”。。。你必须使用一些额外的标志来避免这种情况。@Marjan:我刚刚检查过。同时调用OnCloseQuery和OnClose。我没料到还有其他的事情。@Rudy:OnClose并不是在所有情况下都被调用,但OnCloseQuery是。过去确实是这样,建议总是在OnCloseQuery处理程序中以“脏”(编辑)形式保存数据。但你确实是对的,两个事件都是在点击右十字时被调用的。你能给出一个没有被调用的情况吗?好的,如果在OnCloseQuery中将CanClose设置为False,当然不会,但如果不是这样?