I'm working with the SysUtils.Format
function and variant
values, and I found that this function only works if the format string is %s
. I checked the documentation about the Format
function but there does not exist any reference to how variant values are treated.
Consider this simple application:
{$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.
Is this a bug or a simple limitation of this function?
I've checked this behavior in Delphi 5, Delphi 2007 and Delphi XE.
It is a limitation of the function. In Delphi XE, the relevant part in SysUtils starts at line 10870, which looks like this:
@CvtVariant:
CMP CL,'S'
JNE @CvtError
This is called for any variant argument. The CL register have the type required by the format string for that particular argument, for anything different than 'S', the exception is raised.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With