在 DELPHI 中 procedure 型变量与 method 型变量的区别
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 型变量的区别的更多相关文章
- Delphi中,FALSE 和 nil ,true 和 nil,0的区别
True和False是布尔型(Boolean)的值,就是"是"或"否"的意思.nil就是空,一般用于指针或对象变量,指对针或对象对象一般初始化为nil或者释放后 ...
- Delphi 中窗口文件与无窗口Pas文件的区别 (MTM)
implementation {$R *.dfm} ---- 带窗口的 dfm -- 一般的 windows 窗口 {$R *.fmx} ---- 带窗口的 fmx -- 一般的 FireMonk ...
- delphi中move函数的正确理解(const和var一样,都是传地址,所以Move是传地址,而恰恰不是传值)太精彩了 good
我们能看到以下代码var pSource,pDest:PChar; len: integer;.......................//一些代码Move(pSource,pDest,l ...
- DELPHI中函数、过程变量的声明与应用
Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...
- Delphi 中的 procedure of object
转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; ...
- Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good
其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...
- 转:Delphi中使用比较少的一些语法
http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ...
- Delphi中使用比较少的一些语法
本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类 ...
- Delphi中window消息截获的实现方式(2)
Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎 ...
随机推荐
- Net::HTTP 一次添加 cookie, body 发送post请求
use Net::HTTP::Request; use Net::HTTP::URL; use Net::HTTP::Transport; my $url = Net::HTTP::URL.new(& ...
- 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 ...
- activiti helloworld
activiti helloworld activiti的入门实践文章,重点在于动手做,要解决的是怎么做的问题.只有知道了怎么做后,才具有实际动手能力,才算对这门技术有一个初步掌握:至于更深入细化的知 ...
- Canvas 3D球形文字云动画特效
Canvas 3D球形文字云动画特效 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器 ...
- 使用div模拟出frameset效果
<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" > <head> < ...
- Codeforces 652F Ants on a Circle
Ants on a Circle 感觉这个思路好巧妙啊. 我们能发现不管怎么碰撞,初始态和最终态蚂蚁间的相对顺序都是一样的, 并且所占的格子也是一样的, 那么我们就只需要 找到其中一个蚂蚁的最终位置就 ...
- Codeforces Round #533 (Div. 2) E - Helping Hiasat 最大团
E - Helping Hiasat 裸的最大团,写了一种 2 ^ (m / 2) * (m / 2)的复杂度的壮压, 应该还有更好的方法. #include<bits/stdc++.h> ...
- Air Raid HDU 1151
题意 给定n个路口 加上一些单向路 求遍历完所有路口需要多少人 人是空降的 哪里都可以作为起点 求 最小边覆盖 (用最少的边覆盖所有的点) 也叫最小路径覆盖(更形象) 也叫二分图的最大独立集 ...
- 001.Chrony时间服务器
一 Chrony概览 1.1 Chrony简介 Chrony是一个开源的自由软件,是网络世界协议(NTP)的另一种实现,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成: ...
- LruCacahe在美团DSP系统中的应用演进
背景 DSP系统是互联网广告需求方平台,用于承接媒体流量,投放广告.业务特点是并发度高,平均响应低(百毫秒). 为了能够有效提高DSP系统的性能,美团平台引入了一种带有清退机制的缓存结构LruCach ...