之前应该参考一下: 关于开放数组参数

//这是在 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的更多相关文章

  1. Delphi中array of const应用

    Delphi的Format函数大家都用得很多,第二个参数用着确实很方便.最近在数据库开发应用中需要自己创建一个带array of const参数的函数,对于常用的类型String,Integer,Po ...

  2. C lang:Protect array data——Const

    Xx_Introduction Use pointer translate parameter array original data will change data,and use const p ...

  3. c++实现的Array数据结构

    1.Array.h,Array<T>的定义 template <class T> class Array { protected: T *data; //一个指向数组数据的指针 ...

  4. 从Chrome源码看JS Array的实现

    .aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line spa ...

  5. ES6,Array.of()函数的用法

    ES6为Array增加了of函数用已一种明确的含义将一个或多个值转换成数组. 因为,用new Array()构造数组的时候,是有二意性的. 构造时,传一个参数,表示生成多大的数组. 构造时,传多个参数 ...

  6. C++中const指针用法汇总

    这里以int类型为例,进行说明,在C++中const是类型修饰符: int a; 定义一个普通的int类型变量a,可对此变量的值进行修改. const int a = 3;与 int const a ...

  7. [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 ...

  8. [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 ...

  9. [Tips + Javascript] Make a unique array

    To make an array uniqued, we can use Set() from Javascript. const ary = ["a", "b" ...

随机推荐

  1. linux对象系统---kobject, ktype, kset, subsys

    本文转自:linux中kobject/ktype/kset/subsys之间的关系 随着内核版本的发展,会有一些变化,无论怎样,变化的是形式,不变的是思想! 那么他们之间具有什么关系?那应该不是'小3 ...

  2. mysql json字段

    从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型.   一. 创建json(不可以设置长度,可以是null,不能用有默认值) mysql> CREATE TABLE ...

  3. [ipsec][strongswan]strongswan源码分析--(零)引子

    目录 strongswan sa 资料 编译 启动 进程信息 结构 架构图与插件 配置运行 传统配置方法 新的配置方法 其他配置方法 详细的配置文档 配置示例 用法 加密库 libgmp libcry ...

  4. abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)

    Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...

  5. 创建htpasswd文件在nginx (没有 apache)

    Create htpasswd file for nginx (without apache) APACHE NGINX HTACCESS If you're like me, and use Ngi ...

  6. Can you answer these queries? (线段树

    题目 题意: 初始给你n个数,通过m个操作,  操作0是使区间范围内的每一个a[i]都变成 根号a[i] ,操作1是查询区间范围内数字的和. 思路: 如果一个节点sum[rt]是1的话,根号1还是1, ...

  7. wordpress实现主动推送+熊掌号推送同步进行

    今天给一个朋友http://www.myunigift.cn/ 这个站点是用wordpress,今天帮他改造熊掌号,于是做了数据同步推送. 只要把下面的代码写到funtions.php里面,发布文章的 ...

  8. python get/post接口使用

    背景: 使用python调用get post接口,入参.出参都需要转换,在使用时经常会忘记其中的一步,本文用来记录,后面再使用时直接参考使用 代码如下 post: headers = {'Conten ...

  9. test20190827 NOIP2019 模拟赛

    100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...

  10. Spring源码窥探之:ImportBeanDefinitionRegistrar

    1. 编写实现ImportBeanDefinitionRegistrar的类 /** * description * * @author 70KG * @date 2018/11/13 */ publ ...