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

标签 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,其中该错误已得到修复。

最佳答案

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

  • 类的实例方法。
  • 类的类方法。
  • 记录的实例方法。
  • 对象的实例方法,即通过 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);

关于delphi - 我可以将扩展记录的方法分配给Delphi中的事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29607117/

相关文章:

delphi - 如何将 BLOB 流中的任意图像加载到 TImage 中?

delphi - 以编程方式更改 TChart 大小

delphi - 从 block 中的列表复制动态数组

delphi - 为什么使用 $L 指令链接的目标文件的顺序很重要?

Delphi IDE 由于隐藏的模式窗口而锁定

delphi - 如何将表单作为图像复制到剪贴板

delphi - 截取屏幕特定部分的屏幕截图

Delphi 2007支持Windows 2008 R2吗?

string - 如何通过模糊匹配查找字符串中子字符串的位置

Delphi (XE2) : Trial - what can I do? 我的旧 Delphi 怎么样?