我正在使用
SysUtils.Format
功能和变体值,我发现这个功能只有在格式字符串为%s时才有效.我检查了有关Format函数的文档,但是不存在对变量值如何处理的任何引用.
考虑这个简单的应用:
{$APPTYPE CONSOLE} uses Variants,SysUtils; procedure TestFormat; var v : Variant; begin v:=100; writeln(Format('The VarType of v is %s',[VarTypeAsText(VarType(v))])); writeln(Format('The value of v is %s',[v]));//ok v:='100'; writeln(Format('The VarType of v is %s',[v]));//ok v:=100; writeln(Format('The VarType of v is %s',[VarTypeAsText(VarType(v))])); writeln(Format('The value of v is %d',[v]));//raise a EConvertError exception EConvertError: Format '%d' invalid or incompatible with argument end; begin try TestFormat; except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; readln; end.
我在Delphi 5,Delphi 2007和Delphi XE中检查了这个行为.
解决方法
这是功能的限制.在Delphi XE中,SysUtils的相关部分从10870行开始,如下所示:
@CvtVariant: CMP CL,'S' JNE @CvtError
这被称为任何变体参数. CL寄存器具有该特定参数的格式字符串所需的类型,对于与“S”不同的任何异常,引发异常.