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. Net::HTTP 一次添加 cookie, body 发送post请求

    use Net::HTTP::Request; use Net::HTTP::URL; use Net::HTTP::Transport; my $url = Net::HTTP::URL.new(& ...

  2. mysql grep database error(cannot rmdir /dbname)

    service mysql stop cd /var/lib/mysql/dbname rm -rf .fmr rm -rf .txt service mysql start srop databas ...

  3. activiti helloworld

    activiti helloworld activiti的入门实践文章,重点在于动手做,要解决的是怎么做的问题.只有知道了怎么做后,才具有实际动手能力,才算对这门技术有一个初步掌握:至于更深入细化的知 ...

  4. Canvas 3D球形文字云动画特效

    Canvas 3D球形文字云动画特效 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器 ...

  5. 使用div模拟出frameset效果

    <!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" > <head> < ...

  6. Codeforces 652F Ants on a Circle

    Ants on a Circle 感觉这个思路好巧妙啊. 我们能发现不管怎么碰撞,初始态和最终态蚂蚁间的相对顺序都是一样的, 并且所占的格子也是一样的, 那么我们就只需要 找到其中一个蚂蚁的最终位置就 ...

  7. Codeforces Round #533 (Div. 2) E - Helping Hiasat 最大团

    E - Helping Hiasat 裸的最大团,写了一种 2 ^ (m / 2)  * (m / 2)的复杂度的壮压, 应该还有更好的方法. #include<bits/stdc++.h> ...

  8. Air Raid HDU 1151

    题意  给定n个路口 加上一些单向路  求遍历完所有路口需要多少人  人是空降的 哪里都可以作为起点 求 最小边覆盖   (用最少的边覆盖所有的点) 也叫最小路径覆盖(更形象) 也叫二分图的最大独立集 ...

  9. 001.Chrony时间服务器

    一 Chrony概览 1.1 Chrony简介 Chrony是一个开源的自由软件,是网络世界协议(NTP)的另一种实现,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成: ...

  10. LruCacahe在美团DSP系统中的应用演进

    背景 DSP系统是互联网广告需求方平台,用于承接媒体流量,投放广告.业务特点是并发度高,平均响应低(百毫秒). 为了能够有效提高DSP系统的性能,美团平台引入了一种带有清退机制的缓存结构LruCach ...