在 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)语言,并有强大的数据库引擎 ...
随机推荐
- Javascript - Vue - 请求
本地增删查的一个例子 <div id="box"> <div class="panel panel-primary"> ...
- MCM/ICM2018美国大学生数学建模大赛D题翻译
MCM/ICM2018美国大学生数学建模大赛D题翻译 2018年ICM问题D: 非使用汽油并在使用电力行驶的汽车(电量非空的) 由于环境和经济的原因,全球都在减少使用化石燃料,包括汽车汽油. 无论是受 ...
- LeetCode(20):有效的括号
Easy! 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭 ...
- java 多态缺陷
一,会覆盖私有方法 package object; class Derive extends Polymorphism{ public void f1() { System.out.println(& ...
- 1.网站应用程序 - 《APS.NET本质论》
1.1.HTTP协议 浏览器与WEB服务器的协议是应用层协议,当前遵循HTTP/1.1,HTTP协议是无状态的协议 客户机与服务器通过请求和响应完成一次会话(Session),每次会话中,双方发送的数 ...
- Tomcat8 启动中提示 org.apache.catalina.webresources.Cache.getResource Unable to add the resource
Tomcat8 启动过程中提示: org.apache.catalina.webresources.Cache.getResource Unable to add the resource at xx ...
- 【CodeChef】QTREE- Queries on tree again!
题解 给你一棵基环树,环长为奇数(两点间最短路径只有一条) 维护两点间路径最大子段和,支持把一条路径上的值取反 显然只要断开一条边维护树上的值,然后对于那条边分类讨论就好了 维护树上的值可以通过树链剖 ...
- 【noip模拟赛3】编码
描述 Alice和Bob之间要进行秘密通信,他们正在讨论如何对信息进行加密: Alice:“不如采用一种很简单的加密方式:’A’替换成1,’B’替换成2,„„,’Z’替换成26.” Bob:“这种加密 ...
- ref:Spring JdbcTemplate+JdbcDaoSupport实例
ref:https://www.yiibai.com/spring/spring-jdbctemplate-jdbcdaosupport-examples.html 在Spring JDBC开发中,可 ...
- 002.SMB安装与端口
一 安装所需包 samba:主服务包 samba-client:客户端 samba-common:通用工具和宏文件,存在于客户端和服务端 samba-libs:库 samba-winbind:wind ...