G := F; // 拷贝F到G
I := G; // 调用函数,把结果赋给I
第1个赋值语句把一个过程类型值赋给F,第2个语句把这个值拷贝给另一个变量,第
用的函数并把结果赋给I。因为I是一个整数变量,而不是过程类型,
(它返回一个整数值)。
在一些情况下,如何解释过程变量并不是很清楚,看下面的语句
if F = MyFunction then ...;
在此情况下,F导致函数调用:编译器调用F指向的函数,然后调用函数
规则是,只要过程变量出现在表达式中,它就表示是调用引用的过程或函数。在上面的例子中,若用一个过程(没有返回值),或F引用的函数需要参数,则引发编译错误。要比较
程值,使用
if @F = @MyFunction then ...;
@F把F转换为无类型指针变量,它包含的是地址,@MyFunction返回的是
要取得过程变量的内存地址(而不是它包含的地址),使用@@。比如,
@运算符也可以用来把一个无类型指针值赋给过程变量,比如
var StrComp: function(Str1, Str2: PChar): Integer;
...
@StrComp := GetProcAddress(KernelHandle, 'lstrcmpi');
调用GetProcAddress函数,并使StrComp指向结果。
过程变量可以是nil值,但此时调用它会引发错误。要测试一个过程变量是否被赋值,使用标准函数Assigned:
if Assigned(OnClick) then OnClick(X);
Variant types(变体类型)
Variant types: Overview(概述)
有时,我们需要使用这样的数据:它们的类型是可变的,或者在编译时它们的类型不能确定。在这种情况下,一个选择是使用变体类型作为变量或参数,它们可以在运行时改变类型。变体类型提供了更大的- 66 - 3个语句调用引MyFunction,然后比较结果。F引F和MyFunction的过MyFunction的地址。 返回F的地址。 所以最后的赋值实际上是调用函数@@F
Data types, variables and constants
灵活性,但却比普通变量需要更多的内存,并且操作起来更慢。并且,对变体类型的非法使用会导致运行时错误,而普通变量的此类错误能在编译时被发现。你也可以创建自定义变体类型。
默认情况下,除记录、集合、静态数组、文件、类、类引用和指针外,变体类型能存储任何其它类型的值。pascal 视频教程换句话说,除结构类型和指针外,变体类型能存储其它的任何类型;变体类型能存储接口,并能通过它使用接口的方法和属性(参考Object inteces);变体类型能存储动态数组,也能存储一种特殊的静态数组:变体数组(Variant array)。变体类型能和其它变体类型、整数、实数、字符串和布尔值在表达式和赋值语句中混合使用,编译器自动完成类型转换。
包含字符串的变体类型不能使用索引,也就是说,若V是一个存储字符串的变体类型,则V[1]会导致运行时错误。
你可以通过自定义来扩展变体类型,从而能存储任意值。比如,你可以定义一个使用索引的变体字符串类型,或者让它存储特定的类引用、记录或静态数组。自定义变体类型通过来创建。
变体类型占用16字节的内存,包含一个类型码和一个值(或指向这个值的指针)定。所有的变体类型在创建时被初始化为Unassigned,Null表示未知或没有数据。标准函数VarType返回变体类型的类型码,常量varTypeMask中提取类型码,所以,在下面的例子中
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-46.html
连伊拉克现政府都不再信任你美爹
大东沟海战在日本围着定镇两舰打的情况下
主席的话“人不犯我
用航公捣它