我可以将扩展记录的方法分配给 Delphi 中的事件吗?
Can I assign the method of an extended record to an event in Delphi?
给定以下记录类型:
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 的更新版本,该错误已得到修复。
是的,你应该能够做到这一点。您可以分配以下类型的方法:
- 类.
的实例方法
- Class 类 的方法。
- 记录的实例方法。
- 对象的实例方法,即使用
object
关键字引入的已弃用类型。
由于这是一个内部编译器错误,这在 Delphi 2007 中似乎是一个编译器错误。当然,您的代码将在 Delphi 的更高版本中编译。
QC#59807 seems to be very similar to your issue. According to that bug report it was resolved in build 11.0.2902.10471. Then again, perhaps it is this one: QC#60621 据报告在 build 12.0.0.15784 中已解决。
如果您无法升级到没有错误的编译器,则执行此操作:
var
Method: TMethod;
....
Method.Code := @TMyRecord.SomeMethod;
Method.Data := @MyRecord;
Button1.OnClick := TNotifyEvent(Method);
它适用于 XE7。没有警告。单击按钮时方法内容按预期执行。
给定以下记录类型:
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 的更新版本,该错误已得到修复。
是的,你应该能够做到这一点。您可以分配以下类型的方法:
- 类. 的实例方法
- Class 类 的方法。
- 记录的实例方法。
- 对象的实例方法,即使用
object
关键字引入的已弃用类型。
由于这是一个内部编译器错误,这在 Delphi 2007 中似乎是一个编译器错误。当然,您的代码将在 Delphi 的更高版本中编译。
QC#59807 seems to be very similar to your issue. According to that bug report it was resolved in build 11.0.2902.10471. Then again, perhaps it is this one: QC#60621 据报告在 build 12.0.0.15784 中已解决。
如果您无法升级到没有错误的编译器,则执行此操作:
var
Method: TMethod;
....
Method.Code := @TMyRecord.SomeMethod;
Method.Data := @MyRecord;
Button1.OnClick := TNotifyEvent(Method);
它适用于 XE7。没有警告。单击按钮时方法内容按预期执行。