Procedure型变量: 
在DELPHI中,函数、过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: 
var p : procedure(num:integer); //过程 
或: 
var f : function(num:integer):integer; //函数 
也可定义一个过程(或函数)类型,再定义该类型的变量,如: 
type TMyProc = Procedure(num:integer); 
var p : TMyProc;

example: 
type TMyProc= procedure (filename : string); //定义过程类型 
procedure clearfile(filename : string); 
begin 
{….} 
end ; 
… 
var p:TMyProc; //定义过程变量 
… 
p := clearfile; //将具体实现的过程地址赋给过程变量 
… 
p(‘log.dat’); //调用过程 
… 
可以将该类型的变量赋nil表示清除。 
通过这种方式定义函数或过程的变量十分有用,如可用于装入动态链接库、根据不同的条件调用不同的过程等。

Method型变量: 
在DELPHI中还有一种特殊的过程,叫做方法(method),在定义方法类型的时候要在过程定义的后面加上 of object,如: 
type TMyMethod=Procedure(num:integer) of object; 
同样也可定义过程类型的变量: 
var m : TMyMethod; 
可以将该类型的变量赋nil表示清除。 
方法类型常用于类定义中的事件定义,如控件中常用的OnClick事件,它的类型定义如下: 
type TNotifyEvent=Procedure(Sender : TObject) of object;

区别: 
procedure与method的定义虽然很相似,但两者并不一样,也不通用,不能互相赋值。procedure型变量是一个指针指向实际的代码地址,而method型变量实际是一对指针,第一个指向代码的地址,第二个指向包含该代码的类的一个实例。区别一个过程是否是方法就看它是否属于一个类的成员。 
Example: 
Type 
TMyProc=Procedure(str : String); //定义普通过程类型 
TMyMethod=Procedure(str : String) of object; //定义方法类型 
… 
//下面的代码是一个普通的过程 
Procedure Proc1(str : String); 
Begin 
ShowMessage(str); 
End; 
… 
//下面的代码是一个方法 
Procedure TForm1.Proc2(str : String); 
Begin 
ShowMessage(str); 
End; 
… 
var p : TMyProc; 
   m : TMyMethod; 
… 
p := Proc1; //正确 
m := Proc2; //正确 
p := Proc2; //错误! 
m := Proc1; //错误!

在类型定义中,类型的属性(如事件)常用以下方式定义在published关键字后,如: 
property OnClick : TNotifyEvent read FOnClick write FOnClick; //FOnClick为类的方法型私有成员变量 
但published关键字后的属性不能是普通的过程类型。普通过程类型只能在类的private、public、protected成员中。而方法类型可以是类的任何类型成员。 
Example: 
Type 
  TMyClass = class(TObject) 
  Private 
FOnMyMethod: TMyMethod; 
    FOnMyProc : TMyProc; 
  Public 
Property OnMyProc1 : TMyProc read FOnMyProc write FOnMyProc; //正确 
  Published 
Property OnMyMethod : TMyMethod read FOnMyMethod write FOnMyMethod; //正确 
Property OnMyProc2 : TMyProc read FOnMyProc write FOnMyProc; //错误! 
  End;

在 DELPHI 中 procedure 型变量与 method 型变量的区别的更多相关文章

  1. Delphi中,FALSE 和 nil ,true 和 nil,0的区别

    True和False是布尔型(Boolean)的值,就是"是"或"否"的意思.nil就是空,一般用于指针或对象变量,指对针或对象对象一般初始化为nil或者释放后 ...

  2. Delphi 中窗口文件与无窗口Pas文件的区别 (MTM)

    implementation {$R *.dfm}  ---- 带窗口的 dfm -- 一般的 windows 窗口 {$R *.fmx}  ---- 带窗口的 fmx -- 一般的 FireMonk ...

  3. delphi中move函数的正确理解(const和var一样,都是传地址,所以Move是传地址,而恰恰不是传值)太精彩了 good

    我们能看到以下代码var pSource,pDest:PChar;     len: integer;.......................//一些代码Move(pSource,pDest,l ...

  4. DELPHI中函数、过程变量的声明与应用

    Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...

  5. Delphi 中的 procedure of object

    转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; ...

  6. Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good

    其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...

  7. 转:Delphi中使用比较少的一些语法

    http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ...

  8. Delphi中使用比较少的一些语法

    本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类 ...

  9. Delphi中window消息截获的实现方式(2)

    Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎 ...

随机推荐

  1. python psutil监控系统资源【转】

    通过 运用 Python 第三方 系统 基础 模块, 可以 轻松 获取 服务 关键 运营 指标 数据,包括 Linux 基本 性能. 块 设备. 网卡 接口. 系统 信息. 网络 地址 库 等 信息. ...

  2. js 加alert后才能执行方法

    原因是:访问页面时,某些js方法还没初始化(或者还没有加载出来)此时调用肯定不执行.alert起到了延迟的功能,当用户点击确定此时要执行的js恰好初始化完成,能正常执行. 解决方法是 加setTime ...

  3. Unity 网格 绘制

    网格绘制主要用是对Mesh进行操作,通过对vertex和triangles进行操作生成对应的面片: 这里首先得用到一个类:Triangulator(根据vertex生成triangles数组) usi ...

  4. Linux umount的device is busy问题

    现象: [root@dbserver ~]# df -h文件系统 容量 已用 可用 已用%% 挂载点/dev/vda1 9.9G 3.9G 5.6G 41% /tmpfs 3.9G 100K 3.9G ...

  5. The project cannot be built until its prerequisite base-service is built. Cleaning and building all projects is recommended

    参考网址:http://chiangfai.iteye.com/blog/2223661,谢谢! 果然如文中所述,close,重新编译即可!

  6. MySQL 获得当前日期时间\时间戳 函数

    MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +———————+ | now() | +—— ...

  7. JS post提交表单

    js post方式提交表单有两种办法,1:AJAX提交 2:在JS里拼出一个form,然后submit 第二种办法的代码 //这个主要是解决给password MD5 var email = 'ema ...

  8. 洛谷P3387 【模板】缩点 题解

    背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...

  9. WinForm1

    一.窗体的各种属性 二.控件 1.公共控件 2.容器控件 3.菜单控件

  10. [转] javascript组件开发方式

    作为一名前端工程师,写组件的能力至关重要.虽然JavaScript经常被人嘲笑是个小玩具,但是在一代代大牛的前仆后继的努力下,渐渐的也摸索了一套组件的编写方式. 下面我们来谈谈,在现有的知识体系下,如 ...