我遇到了一些对我来说很新的代码......
我从来没有真正看到过对象过程的类型声明,我只是没有看到这一点.为什么开发人员不能只保留Boolean类型的字段?
interface
type
TFinishedCaptureEvent = procedure(AFinished: Boolean) of object;
TFrameCard = class(TFrame)
...
private
FOnFinishedCapture: TFinishedCaptureEvent;
procedure DoUpdateMessage(AMessageType: TMessageType);
public
property OnFinishedCapture: TFinishedCaptureEvent read FOnFinishedCapture write FOnFinishedCapture;
end;
implementation
...
procedure TFrameCard.DoUpdateMessage(AMessageType: TMessageType);
begin
if Assigned(FOnFinishedCapture) then
FOnFinishedCapture(False);
...
end;
end.
Run Code Online (Sandbox Code Playgroud)
Mas*_*ler 18
让我们将其分解为两部分,以便更容易理解.首先,procedure(AFinished: Boolean)它不是boolean变量,它是对以布尔值作为参数的过程的引用.它基本上是一个过程头,除了没有过程名称,因为这只是一个类型定义.可以将与此签名匹配的任何过程分配给此变量.
该of object部分意味着这不仅仅是一个过程参考,而是一个方法参考 ; 它必须属于一个对象.编译器需要知道差异,以便它可以将self对象的指针与过程指针一起存储,以便可以正确调用它,正如其他海报所指出的那样.
基本上,这是声明一个新的事件处理程序,它是Delphi中非常常见的模式.VCL在整个地方做的事情都是一样的.当您创建一个按钮并分配一个OnClick处理程序时,它必须是一个procedure (Sender: TObject) of object;.您的表单为按钮提供了一个引用自身和事件处理程序过程的方法引用,然后当有人单击它时,该按钮使用该信息来调用表单上的处理程序.
这段代码做了同样的事情.它提供了一种方法,可以在运行DoUpdateMessage时通知某些外部对象,使用标准的Delphi习惯用于事件通知.
Jon*_*cto 12
A procedure of object是类实例中包含的过程的过程参考.调用作为类成员的过程时,Self必须使用其他参数传递implict 引用.使用procedure of object告诉编译器将Self引用与过程引用中的过程地址一起存储,这样当通过过程引用调用过程时,Self引用将自动传递.
在您提供的代码片段中,TFinishedCaptureEvent定义为对象的过程,这意味着其类型创建的任何变量将包含2个值:Self值和过程地址.分配此变量时,特别是当赋值在类中时,编译器将自动将此变量内的Self值设置为包含分配给变量的过程的类的实例.当调用变量(FOnFinishedCapture(False))时,编译器会自动将正确的Self值传递回分配给此变量的过程.
| 归档时间: |
|
| 查看次数: |
14912 次 |
| 最近记录: |