Delphi 如何声明包含使用记录作为参数的事件的记录

Delphi 如何声明包含使用记录作为参数的事件的记录,delphi,types,declaration,cross-reference,Delphi,Types,Declaration,Cross Reference,我试图弄清楚如何声明一个记录和一些相互使用的对象事件。问题是无论我以何种方式声明它们,我都有一个“未声明的标识符” 通过下面的代码,我能让他们互相使用吗?事件将在对象中使用,记录将被传递并使用到对象的构造函数中 TMyEvent = procedure(Sender: TObject; var Rec: TMyRecord) of object; TMyRecord = record OnMyEvent: TMyEvent; end; 这可能吗?它需要在Delphi 7及

我试图弄清楚如何声明一个记录和一些相互使用的对象事件。问题是无论我以何种方式声明它们,我都有一个“未声明的标识符”

通过下面的代码,我能让他们互相使用吗?事件将在对象中使用,记录将被传递并使用到对象的构造函数中

  TMyEvent = procedure(Sender: TObject; var Rec: TMyRecord) of object;

  TMyRecord = record
    OnMyEvent: TMyEvent;
  end;

这可能吗?它需要在Delphi 7及以上的所有版本中工作。

不幸的是,向前声明只允许用于类而不允许用于记录,因此我知道的唯一方法是使用指针:

PMyRecord = ^TMyRecord;

TMyEvent = procedure(Sender: TObject; Rec: PMyRecord) of object;

TMyRecord = record
  OnMyEvent: TMyEvent;
end;

如果您使用的是较新的Delphi版本,则可以在记录中声明类型。以下是您如何引用活动记录的方法:

type
  TMyRecord = record
  public type
    TMyEvent = procedure (Sender: TObject; var Rec: TMyRecord) of object;
  public
    OnMyEvent: TMyEvent;
  end;

不需要
Rec:PMyRecord
之前的
var
,除非您的事件处理代码将更改
Rec
的地址。你可以在没有它的情况下更改记录的内容。如果我必须这样做,我会把它变成一个类而不是一个记录。这非常好,因为我实际上已经在某些地方使用了这个记录作为指针。+1。顺便说一句:不需要Rec:PMyRecord之前的var,除非事件处理代码将分配新记录并将其分配给
Rec
。这和你经过一个物体时是一样的;例如,如果要将一个
TStringList
传递到一个过程中并向其中添加其他字符串,则不需要使用
var-SList:TStringList
,而是可以使用
const-SList:TStringList
。@jerry您也接受了答案quickly@DavidHeffernan我想我没有,因为它完美地解决了我的问题,另一个答案我不能用。只是我没有提到任何关于兼容到7的所有版本的问题。好吧,你现在已经改变了问题,但在你改变之前,艾伦的是正确的answer@DavidHeffernan我知道不提兼容性的愚蠢错误。但我无法预测我所不知道的,这就是为什么我要问一个问题。如果我知道这是可能的,我就不会问了。+1这是最好的解决方案。目前我发现的一个限制是,当我使用运算符重载时,无法对记录进行正向引用。我希望rec A有在rec B上运行的ops,反之亦然。这在目前的语言中是不可能的。但这很容易。操作数作为指针传递,因此在声明时不需要知道布局。附录:我意识到我可以将所有操作放在最新声明的记录中,但有时我更愿意将它们放在更自然的地方。+1这真是太好了,除了a)我应该提到D7的兼容性,b)我需要使用此事件类型elsewhere@jerry将其用作TMyRecord.TMyEvent