Einzelnen Beitrag anzeigen

michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#5

AW: tReader-Objekt unter 10.4.1

  Alt 8. Okt 2020, 11:35
Da ich nicht warten wollte, bis Embarcardero soweit ist, habe ich einen kleinen Workaround gebaut. Ich benutze dann nicht tReader, sondern tMGReader zum Auslesen der Stringvalues.

Vielleicht kann es ja übergangsweise noch jemand gebrauchen.


Code:
//**********************************************************************************************
// MGReader.pas
//
// Unit für den Workaround des bei Embacadero gemeldeten Fehlers RSP-31215
// Mit dem tMGReader werden die Umlaute wieder korrekt gelesen
//
// Link zum Fehler: https://quality.embarcadero.com/browse/RSP-31215
//
// Autor: Michael Groß
// Stand: 08.10.2020
//
//***************************************************************************************

unit MGReader;

interface

uses
  System.Classes, System.SysUtils, System.RTLConsts;

type
  tMGReader=class(tReader)
    private
    public
      function ReadString:String; reintroduce;
  end;

implementation

procedure ReadError(Ident: PResStringRec); overload;
  begin
    raise EReadError.CreateRes(Ident) at ReturnAddress;
  end;

procedure PropValueError;
  begin
    ReadError(@SInvalidPropertyValue);
  end;

function TMGReader.ReadString:String;
  var
    L: Integer;
    LResult: TBytes;
  //  S: ShortString;
  begin
    L := 0;
    case ReadValue of
      vaWString:
        begin
          Read(L, SizeOf(Integer));
          SetLength(LResult, L*sizeof(WideChar));
          Read(LResult, L*sizeof(WideChar));
          Result := TEncoding.Unicode.GetString(LResult);
        end;
      vaUTF8String:
        begin
          Read(L, SizeOf(Integer));
          SetLength(LResult, L);
          Read(LResult, L);
          Result := TEncoding.UTF8.GetString(LResult);
        end;
      (*
      das war Original bei 10.4.1
      vaString:
        begin
          Read(S[0], SizeOf(Byte));
          Read(S[1], NativeInt(S[0]));
          Result := UTF8IdentToString(@S);
        end;
      *)
      vaString: //übernommen aus 10.3.3, damit funktionieren die Umlaute wieder
        begin
          Read(L, SizeOf(Byte));
          SetLength(LResult, L);
          Read(LResult, L);
          Result := TEncoding.Default.GetString(LResult);
        end;
      vaLString:
        begin
          Read(L, SizeOf(Integer));
          SetLength(LResult, L);
          Read(LResult, L);
          Result := TEncoding.Default.GetString(LResult);
        end;
      else
        PropValueError;
    end;
  end;

end.
  Mit Zitat antworten Zitat