2017-07-18 48 views
-1

我在Delphi 10.2上使用fastreport 5.4.6,但当显示使用unicode参数的格式化函数时,fastreport有错误。这是错误FastReport格式函数unicode错误

创建文本=备忘录[格式( '%s' 的,[ 'nghìnTY'])nghìnTY

它会显示 “nghìnT'nghìnTY”

如何修理它。请帮帮我。

编辑 更改功能VariantToVarRec在FastReport中的fs_itools.pas

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' 的,[ 'MOTnghìnTY'])]

将显示“mộtnghìntỷ”。我不知道如果我改变功能,会发生什么(我是德尔菲的新手)

+0

我们需要这里的方式更多的信息,您使用的是什么样的FastReport版本的Delphi是什么版本? – whosrdaddy

+0

@whosrdaddy我使用fastreport 5.4.6和delphi 10.2 –

+0

究竟你的真实代码是什么? –

回答

1

固定。 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; 

fs_itools.pas从5.6.2:

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;