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

機能の制限です。のより機能豊富なバージョンについては、JCLFormatの関数を試してください。WideFormat(私はその作成者です。) さまざまな型のバリアント、ブール値、および TClass をサポートしています。また、フォーマットの文字ポインター型と、%pインデックス引数の Int64 および Variant 値も受け入れます。

拡張機能にもかかわらず、約 1 年前に JCL ディストリビューションから削除されました。これは、主なターゲットが Delphi 5 であり、ネイティブの WideString バージョンの を提供しておらずFormat、JCL が Delphi 5 をサポートしなくなったためです。3140 .

于 2011-04-04T18:55:10.887 に答える