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说。如果你有麻烦,请考虑。包括你试图做的事情的细节,以及具体出了什么问题。