Почему происходит сбой Форматирования, когда что-либо, кроме "% s", используется с Вариантом? - PullRequest
11 голосов
/ 04 апреля 2011

Я работаю с функцией 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.

Ответы [ 2 ]

12 голосов
/ 04 апреля 2011

Это ограничение функции.В Delphi XE соответствующая часть в SysUtils начинается со строки 10870, которая выглядит следующим образом:

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

Это вызывается для любого варианта аргумента.Регистр CL имеет тип, требуемый строкой формата для этого конкретного аргумента, для чего-либо, отличного от 'S', возникает исключение.

10 голосов
/ 04 апреля 2011

Это ограничение функции.Для более многофункциональной версии Format попробуйте функцию WideFormat из JCL.(Я его автор.) Он поддерживает варианты различных типов, Boolean и TClass.Он также принимает типы указателей символов для формата %p и значения Int64 и Variant для аргументов индекса.

Несмотря на свои расширения, он был удален из дистрибутива JCL около года назад, поскольку его основной целью был Delphi.5, которая не предоставляла собственную версию WideString Format, а JCL больше не поддерживает Delphi 5. Последняя ревизия, в которую она была включена, была 3140 .

...