【问题标题】:Why does Format crash when anything but "%s" is used with a Variant?为什么将“%s”以外的任何内容与 Variant 一起使用时,Format 会崩溃?
【发布时间】:2011-07-29 09:07:54
【问题描述】:

我正在使用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 中检查了这种行为。

【问题讨论】:

    标签: delphi variants


    【解决方案1】:

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

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

    【讨论】:

    • 如何将其包含在Firemonkey 中?
    • 我假设你会像在 Firemonkey 中包含其他任何东西一样包含它,@Tardoandre。如果您遇到问题,请考虑asking a question on Stack Overflow。包括您尝试执行的操作的详细信息,以及具体出了什么问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 你的阅读速度比我快一分钟;我一定生锈了。 (或者你开始得更早。)+1
    • @Ken,哈哈,我对汇编程序不是很精通,但我正在努力改进……很高兴看到我成功了。 :D
    • @RRUZ Un gusto, Rodrigo ;)。 Usualmente me pregunto si se vale hablar un poco de español aquí。 :D
    • se siente un poco extraño postear en español en S.O, pero a veces lo hago tambien en comentarios。 ;)
    猜你喜欢
    • 2017-06-24
    • 2021-12-08
    • 1970-01-01
    • 2016-08-14
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多