Delphi中的函数指针判断是否为空
delphi函数指针 只有@@p才代表了函数指针本身的地址
assigned(p) 判断是否为空
或者用 @p=nil 来判断函数指针是不是为空
Delphi中的函数指针实际上就是指针,只是在使用的时候有些不同
函数指针要先定义一个函数类型,比如
type
TTestProc = procedure of object;
这是一个最简单的函数类型,没有参数,也没有返回值,并且要求是类的成员函数
类的成员函数其实就代表了调用的时候参数的不同,因为类的成员函数隐含着一个对象参数,而不是显式写明,函数都是静态的。
当然了,如果有重载就变成了虚函数指针表,其中的调用就复杂一些
函数类型可以定义一个函数指针变量
var
p: TTestProc;
这个指针变量是4自己的 Pointer。可以与 Pointer直接做转换,但是要加上一个 @,比如:
var
p: TTestProc;
p1: Poniter;
begin
p1:= @p;
@p:= p1;
end;
这里的 p1 是一个 Pointer类型
当 p 被赋值成一个真正的函数之后,就可以使用了,如下
p();
如果有参数可以直接加上参数,与普通的函数调用方法没有什么区别,如果需要取得函数指针本身的地址就需要
@@p;
加一个 @ 其实就是为了防止歧义,因为 p 本身也可以当成函数来使用,所以用 @p 来代表指针,不过特殊情况下p 也可以代表一个指针,比如
Assigned(p);
这时候没有歧义,所以不需要加上 @,当然也可以使用
Assigned(@p);
其实 assigned() 函数的参数要求是一个指针变量,用来判断这个指针是不是为 nil,如果是则返回 False,如果不是则返回 True
总结:
p和 @p 都代表函数指针,只有@@p 才代表函数指针本身的地址,为了不产生歧义,所以有的时候需要使用 @p,有时候使用 p(比如 assigned(p))
一般在赋值的时候既可以使用 p 又可以使用 @p,而在比较的时候,必须使用 @p,这在编译的时候就已经严格控制了,所以出现编译错误的时候就可以考虑这方面的问题
Delphi中的函数指针判断是否为空的更多相关文章
- delphi 中的函数指针 回调函数(传递函数指针,以及它需要的函数参数)
以下代码仅仅是测试代码:delphi XE7 UP1 interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.V ...
- delphi中一切皆指针
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...
- Delphi中 StrToIntDef函数的用法
Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...
- QT中使用函数指针
想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...
- C++中使用函数指针 【瓦特芯笔记】
在C++类中使用函数指针. 类型定义: typedef 返回类型(类名::*新类型)(参数表) //类定义 class CA { public: char lcFun(int a) ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
- C语言结构体中的函数指针
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...
- Keil C51 中的函数指针和再入函数
函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...
- C++中的函数指针和指针函数
C++中的函数指针和指针函数 数组名一般可以被当成指向数组第一个元素的常量指针,同样的情况,在函数中,函数名可以本当成指向函数的常量指针,假如一个函数已经定义,那么它在计算机中一定有特定的 ...
随机推荐
- Hashtable和HashMap的区别举例
我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable ...
- Android客户端的图形化拖放操作的设计实现
为什么要拖放?拖放在某些UI交互中可以简化用户操作. 拖放的步骤包括哪些?“Drag and Drop”,拖放,顾名思义,总共就分三步:1, 开始拖起来:2, 正在拖:3, 放下,进行操作:在这三步里 ...
- 将Apache加入到linux系统service
将Apache加入到linux系统service 将apache加入到linux系统服务,用service命令来控制apache的启动和停止. 本文由乌合之众瞎写http://www.cnblogs. ...
- 3. Android程序生成步骤
主要流程如下图所示: 所需要的工具列表 名称 功能介绍 在操作系统中的路径 aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/ ...
- MySQL用法
查询数据库表 通过查询INFORMATION_SCHEMA.TABLES查询数据库表的结构信息 SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TAB ...
- C#值数值类型转换
1.十进制转16进制 string result=number.ToString("X2"); >>0A //X2表示大写2位 2.字符串转数值类型 "); ...
- C#跨线程操作控件
1.首先通过按键创建子线程: 创建子线程,子线程调用changeText方法. private void btnOK_Click(object sender, EventArgs e) { Threa ...
- 8.js模式-状态模式
1. 状态模式 var offLightState = function(light){ this.light = light; } offLightState.prototype.buttonWas ...
- Java for LeetCode 227 Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法
开始--运行--输入regsvr32空格 然后将filezila安装目录下的fzshellext.dll拖拽到[regsvr32空格]之后 注:64位电脑注意拖拽的文件为fzshellext_64 ...