Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使事件窗体关闭_Delphi - Fatal编程技术网

Delphi 使事件窗体关闭

Delphi 使事件窗体关闭,delphi,Delphi,我正在手动创建一个表单,我有我需要的东西,但我想控制FormClose事件,但找不到如何操作的信息,我只想从显示中创建事件和FormClose代码 我得到的是: function make_form():bool; var frm: TForm; begin frm := TForm.Create(nil); frm.Caption := 'Title'; frm.Width := 500; frm.Height :=

我正在手动创建一个表单,我有我需要的东西,但我想控制FormClose事件,但找不到如何操作的信息,我只想从显示中创建事件和FormClose代码

我得到的是:

function make_form():bool;
    var
      frm: TForm;
    begin
      frm := TForm.Create(nil);
      frm.Caption := 'Title';
      frm.Width := 500;
      frm.Height := 300;
    end;
此代码是单元中的函数

我怎样才能做到这一点?

你的代码不是真的

要以动态创建的形式处理关闭事件,必须将事件处理程序分配给事件属性OnClose:

frm.OnClose := CloseProc;
CloseProc
应该是具有所需原型的某个对象(例如,主形式)的方法

 TFormMain = class(TForm)
 ...
    procedure CloseProc(Sender: TObject; var Action: TCloseAction);
...
implementation
    procedure TformMain.CloseProc(Sender: TObject; var Action: TCloseAction);
     begin
        //use Sender if needed
     end;

你的功能是无用的

创建对象时使用try..finally

从这样开始

type
  // Dummy class:
  TFrmHandlers = class
    // Close handlers:
    class procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

implementation

.....

class procedure TFrmHandlers.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ShowMessage('The form will closed now');
end;

procedure make_form();
var
  frm: TForm;
begin
  frm := TForm.Create(nil);
  try
    frm.Caption := 'Title';
    frm.Width := 500;
    frm.Height := 300;
    frm.OnClose := TFrmHandlers.FormClose;
    frm.ShowModal;
  finally
    frm.Free;
  end;
end; 

如何创建方法对象?使用与IDE生成事件处理程序相同的方法。请参阅示例谢谢,在您的帮助下更新源代码时,源代码有一个未声明的新错误标识符:“CloseProc”,因为
CloseProc
属于某个对象或类(如图所示),并且您必须指定命名空间(如果您的代码不在该类方法内),否则会泄漏表单。您不设置返回值。无法显示该表单。请不要显示假代码。请问您为什么使用
类过程而不是常规过程?您确实意识到,这样做会暴露在没有任何现有TFrmHandlers实例的情况下调用该方法的潜在错误。如果该方法试图访问任何属于TFrmHandlers实例的数据,则会导致AV。@SilverWarior
访问任何属于TFrmHandlers实例的数据,则会导致AV。
这是查询者的责任,我假设查询者没有合适的类来放置关闭事件。但即使如此,他也不必创建该虚拟类的实例,但他可以将处理程序分配给它。啊!现在我明白你为什么使用类过程了。您这样做是因为该过程是该虚拟类的一部分。这是可以理解的。但是您应该警告OP,在这种情况下,它不应该使用
Self
,因为它不会引用表单类实例,而是引用伪类实例。这可能会导致操作部分出现很多混乱。@Silver你搞错了。在类中,方法
Self
引用类而不是实例。毕竟,它怎么可能引用类方法中的实例呢。这里根本不需要创建任何实例。