2017-07-18 10 views
-1

Delphi 10.2ではfastreport 5.4.6を使用していますが、Format関数をUnicode argsで表示するとfastreportにエラーが発生します。ここでエラーFastReport Format関数のunicodeエラー

テキスト=とのメモを作成し、[書式( '%s' は、[ 'nghìnTY'])]nghìnTY

それは "nghìnトン?nghìnTY" と表示されますです

どのように修理する。私を助けてください。

編集 IはFastReportの

変化

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'])]のfs_itools.pasに機能VariantToVarRecを変更

は「mộtnghìntỷ」と表示されます。私はその機能を変えれば何が起こるのか分かりません(私はデルファイの初心者です)

+0

私たちはここの方法より多くの情報を必要とする、あなたは、FastReportののどのバージョンを何デルファイのバージョンを使用していますか? – whosrdaddy

+0

@whosrdaddy私はfastreport 5.4.6とdelphi 10.2を使用します –

+0

そして実際のコードはなんですか? –

答えて

1

修正されました。 FR 5.6.2は正常に動作します。 5.6.2から fs_isysrtti.pas:5.6.2から

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:

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; 
関連する問題