我可以将扩展记录的方法分配给Delphi中的事件吗?

时间:2015-04-13 13:56:16

标签: delphi delphi-2007

给出以下记录类型:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
  end;

是否可以将此方法指定为事件处理程序?

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.SomeMethod;
end;

在Delphi 2007中,我在分配后得到内部编译器错误C1264。

我不确定Record方法的内部结构是否满足分配给事件指针的要求。

编辑: 正如David Heffernan所指出的,这是Delhpi 2007中的编译器错误。我最终使用了以下解决方法:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
    function GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
  end;

function TMyRecord.GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
var
  Method: TMethod;
begin
  Method.Data := @Self;
  Method.Code := _CodePtr;
  Result := TNotifyEvent(Method);
end;

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.GenerateNotifyEvent(@TMyRecord.SomeMethod);
end;

不如简单的任务好,但还不错。我只是希望我可以简单地更新到更新版本的Delphi,其中已经修复了该错误。

2 个答案:

答案 0 :(得分:6)

是的,你应该能够做到这一点。您可以指定以下类型的方法:

  • 类的实例方法。
  • 类的类方法。
  • 记录的实例方法。
  • 对象的实例方法,即object关键字引入的已弃用类型。

由于这是内部编译器错误,这似乎是Delphi 2007中的编译器错误。当然,您的代码将在更高版本的Delphi中编译。

QC#59807似乎与您的问题非常相似。根据该错误报告,它在构建11.0.2902.10471中得到了解决。然后,也许就是这一个:QC#60621报告在构建12.0.0.15784中被解析。

如果无法升级到没有错误的编译器,请执行以下操作:

var
  Method: TMethod;
....
Method.Code := @TMyRecord.SomeMethod;
Method.Data := @MyRecord;
Button1.OnClick := TNotifyEvent(Method);

答案 1 :(得分:2)

它适用于XE7。没有警告。方法内容按钮单击时按预期执行。