Delphi 为什么格式会在除“以外的任何内容”时崩溃%s";是否与变体一起使用?

Delphi 为什么格式会在除“以外的任何内容”时崩溃%s";是否与变体一起使用?,delphi,variants,Delphi,Variants,我正在使用函数和变量值,我发现只有当格式字符串为%s时,此函数才有效。我查看了有关Format函数的文档,但没有任何关于如何处理变量值的参考 考虑这个简单的应用程序: {$APPTYPE CONSOLE} uses Variants, SysUtils; procedure TestFormat; var v : Variant; begin v:=100; writeln(Format('The VarType of v is %s',[VarTypeAsText(Va

我正在使用函数和
变量
值,我发现只有当格式字符串为
%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中检查过这种行为。

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

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

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

这是函数的一个限制。要获得功能更丰富的
格式
,请尝试JCL中的
WideFormat
功能。(我是它的作者。)它支持各种类型的变体,布尔型和TClass。它还接受
%p
格式的字符指针类型,以及索引参数的Int64和变量值


尽管有扩展,但大约一年前它从JCL发行版中删除了,因为它的主要目标是Delphi 5,Delphi 5没有提供本机WideString版本的
格式
,JCL也不再支持Delphi 5。包括它的上一次修订是。

你阅读汇编的速度比我快一分钟左右;我一定是生锈了。(或者你早点开始。)+1@Ken哈哈,我不是很精通汇编程序,但我正在努力提高。。。很高兴看到我成功了D@RRUZ不,罗德里戈;)。通常情况下,我会在西班牙的水路上散步在西班牙的特别邮递服务中,我们将为您提供免费的邮递服务“我怎样才能将它包含在
Firemonkey
中呢?我想你会像在Firemonkey中包含其他内容一样包含它,”Tardoandre说。如果你有麻烦,请考虑。包括你试图做的事情的细节,以及具体出了什么问题。