除结构类型和指针外,变体类型能存储其它的任何类型;
变体类型能存储接口,并能通过它使用接口的方法和属性(参考Object interfaces);
变体类型能存储动态数组,也能存储一种特殊的静态数组:变体数组(Variant array)。
变体类型能和其它变体类型、整数、实数、字符串和布尔值在表达式和赋值语句中混合使用,编译器自动完成类型转换。
可以通过自定义来扩展变体类型,从而能存储任意值。比如,你可以定义一个使用索引的变体字符串
类型,或者让它存储特定的类引用、记录或静态数组。自定义变体类型通过TCustomVariantTyp 的子类
来创建。
所有的变体类型在创建时被初始化为Unassigned,Null 表示未知或没有数据。
标准函数VarType 返回变体类型的类型码,常量varTypeMask 是一个位掩码,用来从VarType 的返回值
中提取类型码,所以,在下面的例子中
VarType(V) and varTypeMask = varDouble
若V 包含Double 或Double 数组,则它返回True
在System 单元定义的TVarData 记录类型能被用来转换变体类型,并且可以访问它们的内部构造。
VarAsType 和VarCast 标准例程能用来改变一个Variant 的内部表示。
除了^、is 和in,所有运算符都可以使用Variant 作为运算数
对Variant 的操作返回Variant 值;若有一个运算数是Null 则结果为Null;
若有一个运算数为Unassigned 则引发异常。
在二元运算中,若只有一个运算数是Variant,则另一个被转换为Variant。
不能把一个普通的静态数组赋给Variant,取而代之的是,通过调用VarArrayCreate 或VarArrayOf 两者
之一来创建Variant 数组。比如,
V: Variant;
...
V := VarArrayCreate([0,9], varInteger);
要创建字符串类型的Variant 数组,使用varOleStr
使用VarArrayRedim 函数来更改Variant 数组的大小。其它用于Variant 数组的标准例程包括
VarArrayDimCount 、VarArrayLowBound 、VarArrayHighBound 、VarArrayRef 、VarArrayLock 和VarArrayUnlock.
。Variant 和OleVariant 的主要区别是,Variant 能包含只有当前程序才能理解的数据类型,
OleVariant 只包含为Ole 自动化兼容而定义的数据类型,它说明,这些数据类型能在程序间或通过网络传送,
而不必担心另一端是否知道如何处理它们。
type
T1 = Integer;
T2 = T1;
T3 = Integer;
T4 = T2;
T1、T2、T3、T4 和Integer 都是指的同一种类型。要声明一种不同的类型,在声明中重复type 关键字。
比如
type TMyInteger = type Integer;
创建了一种新类型TmyInteger,它和Integer 不同。
一个类型声明指定一个标志符,来表示一种数据类型。类型声明的语法为
type newTypeName = type
这里,newTypeName 是一个有效的标志符。比如,给定如下的类型声明
type TMyString = string;
你就可以声明变量
var S: TMyString;
同时声明多个变量时不能包括初始化,Variant 和文件类型的变量声明也不能初始化。
如果你没有明确地初始化一个全局变量,编译器把它初始化为0。相反,不能在声明局部变量时进行初
始化,它们的值是随机的,直到赋给它们一个值。
你可以创建一个新变量,它和另一个变量在内存的同一个位置。要这样做的话,声明这个新变量时在类
型名的后面跟关键字absolute,后面再跟一个已存在(先前声明)的变量。比如,
var
Str: string[32];
StrLen: Byte absolute Str;
指定变量StrLen 从Str 的地址开始。因为短字符串的第一个字节包含字符串的长度,StrLen 的值就是Str
的长度。
使用absolute 声明时不能初始化变量,也不能组合其它指示字(和absolute 一同使用)。
可以调用GetMem 或New 过程来创建动态变量,这种变量在堆中分配内存,它们不能自动管理。
使用FreeMem 来释放由GetMem 创建的变量,使用Dispose 释放由New 创建的变量。
其它能作用于动态变量的标准例程包括ReallocMem、Initialize、StrAlloc 和StrDispose。
声明线程局部变量时,使用threadvar,而不是var,比如,
threadvar X: Integer;
线程变量声明
• 不能出现在过程或函数中
• 不能包含初始化
• 不能指定absolute 指示字
不能创建指针或过程类型的线程变量,也不能在动态调入库中使用线程变量(除了包)。
由编译器管理的动态变量,即长字符串、宽字符串、动态数组、Variants 和接口,能被声明为threadvar,
但编译器不能自动释放由每个线程创建的堆内存。若使用这些类型的线程变量,要负责释放它们的内存。
资源字符串的声明像真常量,除了用resourcestring 代替const。表达式等号的右边必须是常量表达式并
且返回一个字符串。
在默认的{$J-}编译状态下,类型常量不能被赋予新值,实际上,它们是只读变量;但如果使用了{$J+}
编译器指示字,类型常量能被赋予新值,它们在本质上就像初始化的变量。
要声明数组常量,把数组元素的值用括号括起来,值之间用逗号隔开,这些值必须是常量表达式。比如,
const Digits: array[0..9] of Char = (’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’);
上面的声明可以方便地表示为
const Digits: array[0..9] of Char = ’0123456789’;
要声明一个记录常量,在括号中使用fieldName: value 的形式来指定每个字段的值,每个字段用分号隔开。
每个字段的值必须是常量表达式。字段列出的顺序必须和声明的相同,若有tag 字段,则必须指定它的
值;若记录有一个Variant 部分,只有tag 字段选定的Variant 才能被赋值。
举例如下:
type
TPoint = record
X, Y: Single;
end;
TVector = array[0..1] of TPoint;
TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TDate = record
D: 1..31;
M: TMonth;
Y: 1900..1999;
end;
const
Origin: TPoint = (X: 0.0; Y: 0.0);
Line: TVector = ((X: -3.1; Y: 1.5), (X: 5.8; Y: 3.0));
SomeDay: TDate = (D: 2; M: Dec; Y: 1960);
记录常量不能包含文件类型的值。
分享到:
相关推荐
最新版 delphi-modbus-develop 1.6.7
delphi-变体类型(variant)的介绍(流与变体类型的相互转换变体类型常用的函数
本文将重点讨论如何在Delphi集成环境中利用OpenCV进行开发,以及一个特别针对Delphi 2010到XE8优化的OpenCV组件——"Delphi-OpenCV-master"。 首先,"Delphi-OpenCV-master"是专为Delphi 2010至XE8版本设计的OpenCV...
Delphi binding for OpenCV Experimental Delphi binding for OpenCV 4.7.0 Development environment - Delphi 10.4, 11 x64 platform only
"ffmpeg-delphi-pascal-headers-3.0.2.zip" 是一个针对 Delphi 用户的 FFmpeg 头文件包,包含了 FFmpeg 3.0.2 版本的 Pascal 头文件,适用于 Delphi 的 FFVCL 库。 FFVCL (FFmpeg Video Component Library) 是一个 ...
这个"delphi-modbus-tcp-indy.7z"压缩包包含的是用Delphi编写的Modbus TCP组件,它基于两个不同的Indy版本——Indy 9和Indy 10。 Indy(Internet Direct)是Delphi和C++Builder中的一套网络库,提供了一组跨平台的...
标题中的"delphi-modbus-tcp三方控件,支持Delphi11"表明这是一个专为Delphi编程环境设计的第三方Modbus TCP库,用于在Delphi 11应用程序中实现Modbus通信。Modbus是一种广泛使用的工业通信协议,主要用于设备间的...
Delphi26Binaries-2019.27-.pak
Delphi-OpenCV (master) OpenCV version - 2.4.6 Development environment - Delphi XE2-XE4 Contributors: Laentir Valetov email:laex@bk.ru Mikhail Grigorev email: sleuthhound@gmail.com How to install: ...
在本学习笔记中,我们将详细探讨如何在使用DELPHI语言进行Windows开发时获取和管理Windows进程信息。这包括对相关Windows API函数的深入了解,特别是那些与进程列表和模块列表相关的函数。此外,我们还将分析如何...
本项目“Delphi-OpenCV-master 2.4.13”是将OpenCV库与Delphi集成的实践案例,适用于Delphi 2010到10.3的开发环境。Delphi是一款强大的面向对象的 Pascal 编程工具,常用于桌面应用开发,与OpenCV的结合使得开发者...
Kassl-dOPC4Delphi-Trial-Setup.exe
OPEN CV LIBRARY for DELPHI
标题 "delphi-modbus-develop_delphimodbustcp_delphitcp/ip_modbusTCP_" 提供的信息表明,这个项目是关于使用 Delphi 开发 Modbus TCP/IP 应用的。Delphi 是一种流行的面向对象的编程环境,尤其适合创建 Windows ...
Delphi是一种流行的面向对象的编程语言,常用于开发高效且安全的应用程序。本篇将详细讲解Delphi中涉及到的HMAC-SHA签名、SHA加密、MD5加密、URL编码与解码以及Base64编码与解码的相关知识。 首先,HMAC-SHA(Hash-...
标题中的"TMQTTClient-delphi.rar_MQTT delphi_TMQTTClient-delphi_delphi ssl"揭示了这个压缩包包含的是一个适用于Delphi开发环境的MQTT客户端库,名为TMQTTClient-delphi,特别强调了它支持SSL/TLS加密连接。...
Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi源码大全-应有尽有 Delphi...
**Delphi 7 版本 - X-SuperObject** X-SuperObject 是一个在 Delphi 开发环境中广泛使用的 JSON 库,特别适用于 Delphi 7 这样的较早版本。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其...
Delphi手册----全面地介绍delphi的各项功能!.doc
DevExpress_VCL_18.1.4_Full_Source_with_DxAutoInstaller_for_Delphi_7-Delphi_10.3_Rio_Downloadly.ir.rar