DELPHI中函数、过程变量的声明与应用
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中函数、过程变量的声明与应用的更多相关文章
- MIC中函数和变量的声明
c++/c使用 __declspec(target(mic))函数或变量声明 或 __attribute__((target(mic)))函数或变量声明 举例如下: __attribute__((ta ...
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
- Oracle中函数/过程返回多个值(结果集)
Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCUR ...
- MD5 与 SHA 在 Delphi 中函数实现,加密密码
MD5 与 SHA 在 Delphi 中函数实现. 为了加密密码,必须使用一种算法,查询资料,比较好的方法是使用:MD5等算法,参考:Delphi XE8 支持MD5 第一种方式是:引用 System ...
- 在 DELPHI 中 procedure 型变量与 method 型变量的区别
Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...
- Delphi 中 函数参数中的 const 修饰符的本质以及注意事项
来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------ ...
- js函数和变量的声明与执行顺序
一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...
- Javascript中函数及变量定义的提升
<html> <head> <title>函数提升</title> <script language="javascript" ...
- 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]
函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...
随机推荐
- laravel5.8 源码分析(1) Route
https://learnku.com/docs/laravel/5.8 源码路径 vendor\laravel\framework\src\Illuminate\Routing\Router.php ...
- python编码环境安装与基本语法
一.pycharm的基本使用 1.python以及pycharm的安装 python的版本选择:3.x版本就行 pycharm的版本选择:社区版就够用 pycharm只是一个编写工具,python才是 ...
- 索引介绍,转载自:https://tech.meituan.com/2014/06/30/mysql-index.html
索引原理 除了词典,生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总 ...
- [工具] BurpSuite--XssValidator插件
0x00 安装 所需软件: 1.burpsuite 2.xssvalidator 源码:https://github.com/nVisium/xssValidator(按照编译指导编译) burpsu ...
- Pythoy修炼之路
路漫漫其修远兮,吾将上下而求索... 编程语言众多,徘徊在C.C#.Java.PHP等十字路口,看到哪个领域大牛的成功,便想打开那扇窗,反反复复,犹豫不决,终无所获. 个人认为选择一门语言,要根据自身 ...
- ks代码助解
代码实现: data_test_2 = {'gd':[1,1,1,1,1,1,0,0,0,0,0,0,0],'score':[1,2,0,2,2,7,4,5,4,0,4,18,np.nan]} dat ...
- EM算法理解的九层境界
EM算法理解的九层境界 EM 就是 E + M EM 是一种局部下限构造 K-Means是一种Hard EM算法 从EM 到 广义EM 广义EM的一个特例是VBEM 广义EM的另一个特例是WS算法 广 ...
- 关于mysql备份与恢复的操作
逻辑备份:将数据库的数据以逻辑的SQL语句的方式导出 mysqldump备份数据库 备份数据并带创建数据库 (含数据) mysqldump -uroot -p'123456' -B dbname &g ...
- CodeForces-939A
链接: https://vjudge.net/problem/CodeForces-939A 题意: As you could know there are no male planes nor fe ...
- jvm——分层编译
https://www.cnblogs.com/andy-zhou/p/5327288.html 分层编译根据编译器编译.优化的规模与耗时,划分出不同的编译层次: 第0层:程序解释执行,解释器不开启监 ...