12

我正在使用SysUtils.Format函数和variant值,我发现这个函数只有在格式字符串是%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',[VarTypeAsText(VarType(v))]));
  writeln(Format('The value 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 中检查过这种行为。

4

2 回答 2

13

这是功能的限制。在 Delphi XE 中,SysUtils 中的相关部分从第 10870 行开始,如下所示:

@CvtVariant:
        CMP     CL,'S'
        JNE     @CvtError

这对任何变体参数都调用。CL 寄存器具有该特定参数的格式字符串所需的类型,对于与“S”不同的任何内容,都会引发异常。

于 2011-04-04T18:12:30.780 回答
10

这是功能的限制。要获得功能更丰富的版本Format,请尝试WideFormatJCL 中的函数。(我是它的作者。)它支持各种类型的 Variant,Boolean 和 TClass。它还接受%p格式的字符指针类型,以及索引参数的 Int64 和 Variant 值。

尽管有扩展,但它在大约一年前从 JCL 发行版中删除,因为它的主要目标是 Delphi 5,它不提供原生 WideString 版本Format,并且 JCL 不再支持 Delphi 5。包含它的最后一个修订版是3140 .

于 2011-04-04T18:55:10.887 回答