delphi的procedure of object
delphi的procedure of object(一个特殊的指针类型) 理论: //适用于实现不是某一特定过程或函数 type TNotifyEvent = procedure(Sender: TObject) of object; 首先:procedure 也是类型,可以理解为过程类型,定义过程的参数结构,而具体的实现可以动态赋值 onclick那样例子: 声明: onclick= procedure(Sender: TObject,a :integer) of object;以后你就可以把TNotifyEvent作为过程用了,而不用考虑它实现什么功能,你想onclik 里用户写了什么,都是一样的 if assign(onclick) then onclick; 这样只要TNotifyEvent可以执行,程序就去执行它,控件就是这样实现事件的 procedure 指针占4个字节,保存在过程的地址. procedure of object占8个字节,保存过程的地址和类的地址 procedure of object 是类过程(类函数),用法如下: 1、与普通函数相同点:可以像一般的函数和过程一样在类的实例里作为对象方法调用; 2、与普通函数不同点:可以不通过对象,而是通过类来直接调用。 也就是说,一般函数和过程必须通过类的实例(对象)来调用,而类过程(类函数)则可以不必通过该类的实例来调用。通过类来调用函数或者过程,可以定义和实现一些不能或者不适合作为某一特定对象行为的方法。 应用: delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); //一种普通的过程 TMouseEvent = procedure (X,Y:integer) of Object;//一种对象方法的类型 两者样子差不多但实际意义却不一样,两者的区别就在于TMouseEvent类型的方法必须在一个对象里。类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换 . TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 procedure TForm1.BBB(I: Integer); begin showmessage( 'BBB: ' + IntToStr(I)); end; procedure TForm1.CCC(I: Integer); begin showmessage( 'CCC: ' + IntToStr(I)); end; procedure TForm1.Button1Click(Sender: TObject); type Taaa = procedure (i:integer) of object ; var ap: Taaa; begin ap := BBB; //这里有一个隐含Self,完整格式: self.BBB;这里把BBB这个方法赋给ap这个变量,注意BBB与ap的声明原型要一样,不然会有错 ap(1); ap := CCC; ap(2); end; unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AdvEdit; type TForm1 = class(TForm) edt1: TAdvEdit; edt2: TAdvEdit; btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public procedure myonExit(sender:tobject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.myonExit(sender: tobject); begin if tadvedit(sender).Text='a' then begin ShowMessage('a'); end else if tadvedit(sender).Text='b' then begin ShowMessage('b'); end; end; procedure myonExit2(sender:tobject) ; begin if tadvedit(sender).Text='c' then begin ShowMessage('c'); end else if tadvedit(sender).Text='d' then begin ShowMessage('d'); end; end; procedure TForm1.btn1Click(Sender: TObject); type x1=procedure(sender:tobject)of object; x2=procedure(sender:tobject); var y1:x1; y2:x2; begin y1:= myonExit; //带隐藏的self y2:= myonExit2;//不带隐藏的self y1(edt1); //edt框是a或b 时弹出 a或b消息框 y2(edt1); //edt框是c或d 时弹出 c或d消息框 //edt1.OnExit:= myonExit; //not can use myonExit2 end; end.
书搞进脑袋 创新 创造; 积极