Delphi FastReport格式函数unicode错误

Delphi FastReport格式函数unicode错误,delphi,fastreport,delphi-10.2-tokyo,Delphi,Fastreport,Delphi 10.2 Tokyo,我在Delphi 10.2上使用fastreport 5.4.6,但当使用unicode参数显示格式函数时,fastreport出现错误。这是一个错误 使用text=[格式('%s',['nghìn t]创建备忘录ỷ'])] nghìn tỷ 它将显示“nghìn t?nghìn tỷ" 怎么修,请帮帮我 编辑 我在fastreport的fs_itools.pas中更改函数VariantToVarRec procedure VariantToVarRec(v: Variant; var ar:

我在Delphi 10.2上使用fastreport 5.4.6,但当使用unicode参数显示格式函数时,fastreport出现错误。这是一个错误

使用text=[格式('%s',['nghìn t]创建备忘录ỷ'])] nghìn tỷ

它将显示“nghìn t?nghìn tỷ"

怎么修,请帮帮我

编辑 我在fastreport的fs_itools.pas中更改函数VariantToVarRec

procedure VariantToVarRec(v: Variant; var ar: TVarRecArray);
var
...
      varOleStr, varString:
        begin
//          ar[i].VType := vtString;
//          New(ar[i].VString);
//{$IFDEF Delphi12}
//          ar[i].VString^ := AnsiString(v[i]);
//{$ELSE}
//          ar[i].VString^ := v[i];
//{$ENDIF}
          ar[i].VType := vtUnicodeString;
          ar[i].VString := pointer(UnicodeString(v[i]));

       end;
{$IFDEF Delphi12}
      varUString:
        begin
          ar[i].VType := vtUnicodeString;
          New(ar[i].VUnicodeString);
          PUnicodeString(ar[i].VUnicodeString)^ := v[i];
        end;
{$ENDIF}
...
end;
变动后

[格式('%s',['m]ột nghìn tỷ'])]

将显示“m”ột nghìn tỷ“。我不知道如果我将函数更改为该函数会发生什么(我是delphi的新手)

已修复。FR 5.6.2工作正常。 5.6.2中的fs_isysrtti.pas:

function FormatV(const Fmt: String; Args: Variant): String;
var
  ar: TVarRecArray;
  sPtrList: TList;
begin
  VariantToVarRec(Args, ar, sPtrList);
  Result := Format(Fmt, ar);
  ClearVarRec(ar, sPtrList);
end;
    procedure VariantToVarRec(v: Variant; var ar: TVarRecArray; var sPtrList: Tlist);
    procedure ClearVarRec(var ar: TVarRecArray; var sPtrList: TList);
        ...
    procedure VariantToVarRec(v: Variant; var ar: TVarRecArray; var sPtrList: TList);
    var
      i: Integer;
    {$IFDEF Delphi12}
      pWStr: PWideString;
    {$ELSE}
      pAStr: PAnsiString;
    {$ENDIF}
    begin
      SetLength(ar, VarArrayHighBound(v, 1) + 1);

      sPtrList := TList.Create;
      for i := 0 to VarArrayHighBound(v, 1) do
    ...
                    varString:
                    begin
                      ar[i].VType := vtString;
                      New(ar[i].VString);
            {$IFDEF Delphi12}
                      ar[i].VString^ := AnsiString(v[i]);
            {$ELSE}
                      ar[i].VString^ := v[i];
            {$ENDIF}
                    end;
                  varOleStr:
                    begin
            {$IFDEF Delphi12}
                      ar[i].VType := vtWideString;
                      New(pWStr);
                      sPtrList.Add(pWStr);
                      pWStr^ := WideString(v[i]);
                      ar[i].VWideString := PWideString(pWStr^);
            {$ELSE}
                      ar[i].VType := vtAnsiString;
                      //New(ar[i].VAnsiString);
                      New(pAStr);
                      sPtrList.Add(pAStr);
                      pAStr^ := AnsiString(v[i]);
                      ar[i].VAnsiString := PAnsiString(pAStr^);
            {$ENDIF}
                    end;
            {$IFDEF Delphi12}
                  varUString:
                    begin
                      ar[i].VType := vtUnicodeString;
                      New(ar[i].VUnicodeString);
                      PUnicodeString(ar[i].VUnicodeString)^ := v[i];
                    end;
            {$ENDIF}
                  varVariant:
                    begin
                      ar[i].VType := vtVariant;
                      New(ar[i].VVariant);
                      ar[i].VVariant^ := v[i];
                    end;
                end;
    ...

procedure ClearVarRec(var ar: TVarRecArray; var sPtrList: TList);
var
  i: Integer;
begin
  for i := 0 to Length(ar) - 1 do
    if ar[i].VType in [vtExtended, vtString, vtVariant {$IFDEF Delphi6}, vtInt64 {$ENDIF}] then
      Dispose(ar[i].VExtended);
  for i := 0 to sPtrList.Count - 1 do
    Dispose(sPtrList[i]);
  sPtrList.Free;
  Finalize(ar);
end;
5.6.2中的fs_itools.pas:

function FormatV(const Fmt: String; Args: Variant): String;
var
  ar: TVarRecArray;
  sPtrList: TList;
begin
  VariantToVarRec(Args, ar, sPtrList);
  Result := Format(Fmt, ar);
  ClearVarRec(ar, sPtrList);
end;
    procedure VariantToVarRec(v: Variant; var ar: TVarRecArray; var sPtrList: Tlist);
    procedure ClearVarRec(var ar: TVarRecArray; var sPtrList: TList);
        ...
    procedure VariantToVarRec(v: Variant; var ar: TVarRecArray; var sPtrList: TList);
    var
      i: Integer;
    {$IFDEF Delphi12}
      pWStr: PWideString;
    {$ELSE}
      pAStr: PAnsiString;
    {$ENDIF}
    begin
      SetLength(ar, VarArrayHighBound(v, 1) + 1);

      sPtrList := TList.Create;
      for i := 0 to VarArrayHighBound(v, 1) do
    ...
                    varString:
                    begin
                      ar[i].VType := vtString;
                      New(ar[i].VString);
            {$IFDEF Delphi12}
                      ar[i].VString^ := AnsiString(v[i]);
            {$ELSE}
                      ar[i].VString^ := v[i];
            {$ENDIF}
                    end;
                  varOleStr:
                    begin
            {$IFDEF Delphi12}
                      ar[i].VType := vtWideString;
                      New(pWStr);
                      sPtrList.Add(pWStr);
                      pWStr^ := WideString(v[i]);
                      ar[i].VWideString := PWideString(pWStr^);
            {$ELSE}
                      ar[i].VType := vtAnsiString;
                      //New(ar[i].VAnsiString);
                      New(pAStr);
                      sPtrList.Add(pAStr);
                      pAStr^ := AnsiString(v[i]);
                      ar[i].VAnsiString := PAnsiString(pAStr^);
            {$ENDIF}
                    end;
            {$IFDEF Delphi12}
                  varUString:
                    begin
                      ar[i].VType := vtUnicodeString;
                      New(ar[i].VUnicodeString);
                      PUnicodeString(ar[i].VUnicodeString)^ := v[i];
                    end;
            {$ENDIF}
                  varVariant:
                    begin
                      ar[i].VType := vtVariant;
                      New(ar[i].VVariant);
                      ar[i].VVariant^ := v[i];
                    end;
                end;
    ...

procedure ClearVarRec(var ar: TVarRecArray; var sPtrList: TList);
var
  i: Integer;
begin
  for i := 0 to Length(ar) - 1 do
    if ar[i].VType in [vtExtended, vtString, vtVariant {$IFDEF Delphi6}, vtInt64 {$ENDIF}] then
      Dispose(ar[i].VExtended);
  for i := 0 to sPtrList.Count - 1 do
    Dispose(sPtrList[i]);
  sPtrList.Free;
  Finalize(ar);
end;

我们需要更多信息,您使用的是什么delphi版本,什么版本的fastreport?@我使用的是谁的fastreport 5.4.6和delphi 10.2,您的真实代码是什么?@RudyVelthuis我的真实代码是备忘录文本=[格式('%s',['m])ột nghìn tỷ'])] . 快速报告显示“m?t nghìn t?”