delphi – 为什么格式崩溃时,除了“%s”之外的任何变体?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么格式崩溃时,除了“%s”之外的任何变体?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 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”不同的任何异常,引发异常.

猜你在找的Delphi相关文章