const 数组使您可以自由添加字符串、整数、浮点数等,并将这些格式化为字符串。您可以添加的项目数量没有限制。
Delphi 处理这个问题的方式是 const 数组实际上是一个 TVarRec 数组。
TVarRec 是以下类型的记录:
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);
内部值的类型由值TVarRec
决定VType
。
这使您可以灵活地将您希望的任何类型添加到 const 数组中,就像在 Format() 函数中一样:
Format( '%s 是字符串,%d 是整数', ['string',10] );
在您自己的过程中使用 const 数组没什么大不了的。看看这个例子:
procedure VarArraySample( AVarArray : array of const );
var
i : integer;
begin
for i := 0 to High(AVarArray) do
do_something;
end;
函数 High() 返回数组的最后一个索引。
您还可以转换 TVarRec 的内容。此示例取自 Delphi 在线帮助,并稍作修改。该函数将 TVarRec 转换为字符串:
function VarRecToStr( AVarRec : TVarRec ) : string;
const
Bool : array[Boolean] of string = ('False', 'True');
begin
case AVarRec.VType of
vtInteger: Result := IntToStr(AVarRec.VInteger);
vtBoolean: Result := Bool[AVarRec.VBoolean];
vtChar: Result := AVarRec.VChar;
vtExtended: Result := FloatToStr(AVarRec.VExtended^);
vtString: Result := AVarRec.VString^;
vtPChar: Result := AVarRec.VPChar;
vtObject: Result := AVarRec.VObject.ClassName;
vtClass: Result := AVarRec.VClass.ClassName;
vtAnsiString: Result := string(AVarRec.VAnsiString);
vtCurrency: Result := CurrToStr(AVarRec.VCurrency^);
vtVariant: Result := string(AVarRec.VVariant^);
else
result := '';
end;
end;
您可以将上述两个函数组合为一个函数,将 const 数组中的所有元素转换为一个字符串:
function VarArrayToStr( AVarArray : array of const ) : string;
var
i : integer;
begin
result := '';
for i := 0 to High(AVarArray) do
result := result + VarRecToStr( AVarArray[i] );
end;
您现在可以创建自己的 Format() 函数。Format() 函数扫描 % 并将 %something 替换为 const 数组中的值,具体取决于格式说明符和精度说明符。