关于 array of const
//这是在 System 单元定义的一组标识数据类型的常量:
vtInteger = ;
vtBoolean = ;
vtChar = ;
vtExtended = ;
vtString = ;
vtPointer = ;
vtPChar = ;
vtObject = ;
vtClass = ;
vtWideChar = ;
vtPWideChar = ;
vtAnsiString = ;
vtCurrency = ;
vtVariant = ;
vtInterface = ;
vtWideString = ;
vtInt64 = ; //这是定义在 System 单元关于数据类型的一个结构:
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;
作为参数的开放数组, 有时数组的成员类型是不确定的, 此时应该使用 array of const 定义; 详细举例:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end; var
Form1: TForm1; implementation {$R *.dfm} {把不同数据类型返回字符串的函数}
function Fun1(arr: array of const): string;
var
i: Integer;
begin
Result := '';
for i := Low(arr) to High(arr) do
begin
case arr[i].VType of
vtInteger : Result := Result + IntToStr(arr[i].VInteger) + ' ';
vtBoolean : Result := Result + BoolToStr(arr[i].VBoolean, True) + ' ';
vtChar : Result := Result + arr[i].VChar + ' ';
vtExtended : Result := Result + FloatToStr(arr[i].VExtended^) + ' ';
vtString : Result := Result + PShortString(arr[i].VString)^ + ' ';
vtPointer : Result := Result + IntToStr(Integer(arr[i].VPointer)) + ' ';
vtPChar : Result := Result + arr[i].VPChar + ' ';
vtObject : Result := Result + arr[i].VObject.ClassName + ' ';
vtClass : Result := Result + arr[i].VClass.ClassName + ' ';
vtWideChar : Result := Result + arr[i].VWideChar + ' ';
vtPWideChar : Result := Result + arr[i].VPWideChar + ' ';
vtAnsiString: Result := Result + PAnsiChar(arr[i].VAnsiString)^ + ' ';
vtCurrency : Result := Result + CurrToStr(arr[i].VCurrency^) + ' ';
vtVariant : Result := Result + string(arr[i].VVariant^) + ' ';
vtInterface : Result := Result + IntToStr(Integer(arr[i].VInterface)) + ' ';
vtWideString: Result := Result + PWideChar(arr[i].VWideString) + ' ';
vtInt64 : Result := Result + IntToStr(arr[i].VInt64^) + ' ';
end;
end;
end; {简化上一个函数}
function Fun2(const arr: array of const): string;
var
i: Integer;
const
n = #32;
begin
Result := '';
for i := Low(arr) to High(arr) do with arr[i] do
begin
case VType of
: Result := Result + IntToStr(VInteger) + n;
: Result := Result + BoolToStr(VBoolean, True) + n;
: Result := Result + VChar + n;
: Result := Result + FloatToStr(VExtended^) + n;
: Result := Result + PShortString(VString)^ + n;
: Result := Result + IntToStr(Integer(VPointer)) + n;
: Result := Result + VPChar + n;
: Result := Result + VObject.ClassName + n;
: Result := Result + VClass.ClassName + n;
: Result := Result + VWideChar + n;
: Result := Result + VPWideChar + n;
: Result := Result + PAnsiChar(VAnsiString)^ + n;
: Result := Result + CurrToStr(VCurrency^) + n;
: Result := Result + string(VVariant^) + n;
: Result := Result + IntToStr(Integer(VInterface)) + n;
: Result := Result + PWideChar(VWideString) + n;
: Result := Result + IntToStr(VInt64^) + n;
end;
end;
end; {获取类型名的函数}
function Fun3(const arr: array of const): string;
var
i: Integer;
const
n = sLineBreak;
begin
Result := '';
for i := Low(arr) to High(arr) do with arr[i] do
begin
case VType of
: Result := Result + 'Integer' + n;
: Result := Result + 'Boolean' + n;
: Result := Result + 'Char' + n;
: Result := Result + 'Extended' + n;
: Result := Result + 'String' + n;
: Result := Result + 'Pointer' + n;
: Result := Result + 'PChar' + n;
: Result := Result + 'Object' + n;
: Result := Result + 'Class' + n;
: Result := Result + 'WideChar' + n;
: Result := Result + 'PWideChar' + n;
: Result := Result + 'AnsiString'+ n;
: Result := Result + 'Currency' + n;
: Result := Result + 'Variant' + n;
: Result := Result + 'Interface' + n;
: Result := Result + 'WideString'+ n;
: Result := Result + 'Int64' + n;
end;
end;
end; {测试}
procedure TForm1.Button1Click(Sender: TObject);
var
a: Integer;
b: Boolean;
c: Char;
d: Extended;
e: ShortString;
f: Pointer;
g: PChar;
h: TButton;
i: TClass;
j: WideChar;
k: PWideChar;
l: AnsiString;
m: Currency;
n: Variant;
o: IInterface;
p: WideString;
q: Int64;
begin
a := ;
b := True;
c := 'a';
d := ;
e := 'S';
f := Pointer();
g := 'P';
h := TButton(Sender);
i := TForm;
j := #19975;
k := '一';
l := 'A';
m := ;
n := ;
//o;
p := '万一';
q := ; ShowMessage(Fun1([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q]));
ShowMessage(Fun2([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q]));
{结果如下:}
{1 True a 2 S 3 P TButton TForm 万 一 A 4 5 0 万一 7 } ShowMessage(Fun3([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q]));
{结果如下:
Integer
Boolean
Char
Extended
String
Pointer
PChar
Object
Class
WideChar
PWideChar
AnsiString
Currency
Variant
Interface
WideString
Int64
}
end; {我试试没有在 TVarRec 中的类型是怎么归类的}
procedure TForm1.Button2Click(Sender: TObject);
var
a: Byte;
b: Word;
c: Cardinal;
d: Double;
e: Real;
f: TStrings;
begin
ShowMessage(Fun3([a,b,c,d,e,f]));
{结果如下:
Integer
Integer
Integer
Extended
Extended
Object
}
end; end.
从这个例子中还能得到的启示是(根据网友的提示, 下面可能理解错了!):
//不超过 4 字节的简单类型, 在内存中只有一个存放处.
Integer;
Boolean;
Char;
WideChar; //超过 4 字节的类型(包括字符串), 在内存中有两个存放处: 一个是指针位置; 一个是数据位置.
Int64;
Extended;
Currency;
Variant;
ShortString;
AnsiString;
WideString; //指针: 只有 4 字节大小.
Pointer;
PChar(PAnsiChar);
PWideChar; //对象: 复杂了...
Object
Class;
IInterface;
关于 array of const的更多相关文章
- Delphi中array of const应用
Delphi的Format函数大家都用得很多,第二个参数用着确实很方便.最近在数据库开发应用中需要自己创建一个带array of const参数的函数,对于常用的类型String,Integer,Po ...
- C lang:Protect array data——Const
Xx_Introduction Use pointer translate parameter array original data will change data,and use const p ...
- c++实现的Array数据结构
1.Array.h,Array<T>的定义 template <class T> class Array { protected: T *data; //一个指向数组数据的指针 ...
- 从Chrome源码看JS Array的实现
.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line spa ...
- ES6,Array.of()函数的用法
ES6为Array增加了of函数用已一种明确的含义将一个或多个值转换成数组. 因为,用new Array()构造数组的时候,是有二意性的. 构造时,传一个参数,表示生成多大的数组. 构造时,传多个参数 ...
- C++中const指针用法汇总
这里以int类型为例,进行说明,在C++中const是类型修饰符: int a; 定义一个普通的int类型变量a,可对此变量的值进行修改. const int a = 3;与 int const a ...
- [Functional Programming] Randomly Pull an Item from an Array with the State ADT (Pair)
Functor composition is a powerful concept that arises when we have one Functor nested in another Fun ...
- [Functional Programming] Draw Items from One JavaScript Array to Another using a Pair ADT
We want to be able to pick nine random cards from an array of twelve cards, but can run into problem ...
- [Tips + Javascript] Make a unique array
To make an array uniqued, we can use Set() from Javascript. const ary = ["a", "b" ...
随机推荐
- HBase集群环境搭建v1.0
本文档环境基于ubuntu14.04版本,如果最终不使用SuperMap iServer 9D ,可以不配置geomesa-hbase_2.11-2.0.1-bin.tar.gz (转发请注明出处:h ...
- Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用
一. Spring Boot 简介 开箱即用的一站式 Java EE 解决方案 Spring 技术栈的大整合 核心问题 暂时无法回答 Spring Boot 和 SOA 有什么区别? Spring B ...
- 汽车电子测试项目管理系统-TPA
概述 INTEWORK-TPA(Test Project Administrator, 以下简称TPA) 是一款集成的测试项目管理工具,它可以管理测试过程中的所有数据,包括需求.用例.样件.计划.报告 ...
- python 单元测试(unittest)
自动化测试在各大互联网公司全面铺开,那么针对于自动化测试好的设计思想有哪些呢?.....今天我们共同探讨下Unittest之数据驱动(DDT是 “Data-Driven Tests”的缩写). 对于接 ...
- 微信小程序API~检查登录状态
wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...
- 小程序框架之视图层 View~获取界面节点信息
获取界面上的节点信息 WXML节点信息 节点信息查询 API 可以用于获取节点属性.样式.在界面上的位置等信息. 最常见的用法是使用这个接口来查询某个节点的当前位置,以及界面的滚动位置. 示例代码: ...
- Spring中Model,ModelMap和ModelAndView
目录 1.Model接口 2.ModelMap 3.ModelAndView 1.Model接口(org.springframework.ui.Model) Model是一个接口,包含addAttri ...
- eclipse更改jdk版本(1.6》1.7 以此类推)
电脑装了两个版本的JDK,在开发项目的时候默认使用的是高版本的,但是公司又要求用低版本的JDK来编译,肿么办???么事,小编这就来给你支招! eclipse 安装两个版本的JDK 1 打开eclips ...
- 使用notepad++/excle快速将cvs文件转换为insert语句技巧以及注意点
使用notepad++/excle快速将cvs文件转换为insert语句技巧以及注意点 业务场景 最近nc项目经理从第三方弄来了一个300w行的csv文件,让导入数据库做处理,出现了下列问题: csv ...
- Zookeeper中的watcher监听和leader选举机制
watcher监听 什么是watcher接口 同一个事件类型在不同的通知状态中代表的含义有所不同,下图列举了常见的通知状态和事件类型. Watcher通知状态与事件类型一览 上图列举了ZooKeepe ...