Servus,
nachdem ich zur Zeit das zweifelhafte Vergnügen habe, eine bestehende Delphi 2007 Anwendung nach XE zu portieren mal eine Frage zu Stringdeklarationen:
ich habe eine
Unit, die Aufrufe aus der
DEC 5.3 Library kapselt, z.B.
Delphi-Quellcode:
function StrToMime64(const AString: String): String;
...
function StrToMime64(const AString: String): String;
begin
Result := TFormat_MIME64.Encode(AString);
end;
Aufgerufen wird die Funktion an diversen Stellen, die nach einer Umstellung auf Delphi XE durchaus auch Unicodedaten enthalten können. Wie müßte ich denn diese Funktion nun korrekt übersetzen? Erschwerend kommt hinzu, daß die
Unit auch weiterhin von Delphi 2007 (und tiefer) Projekten dann verwendet wird, sprich auch unter nicht
Unicode Delphi noch funktionieren muß. Und das das Folgende nur eine Beispiel ist, würde ich bedingte Compilierung so gut es geht vermeiden wollen.
Im
Unicode Fall erwartet und liefert TFormat_MIME64 ja einen RayByteString. Wie kann man hier denn nun diverse Warnungen verhindern (speziell die mit Datenverlust).
Hier mal die diversen Varianten, die mir so in den Sinn kommen, wobei ich bei keiner so wirklich sicher bin, ob sie korrekt ist:
Delphi-Quellcode:
// dann aber W1058/1057 Warnung, da String auf RawByteString gewandelt wird
function StrToMime64(const AString: String): String;
...
function StrToMime64(const AString: String): String;
begin
Result := TFormat_MIME64.Encode(AString);
end;
Delphi-Quellcode:
// dann aber W1058/1057 Warnung beim Aufruf der Funktion mit String, da String auf AnsiString gewandelt wird
function StrToMime64(const AString: AnsiString): AnsiString;
...
function StrToMime64(const AString: AnsiString): AnsiString;
begin
Result := TFormat_MIME64.Encode(AString);
end;
Delphi-Quellcode:
// dann kommt zumindest mal keine Warnung
function StrToMime64(const AString: String): AnsiString;
...
function StrToMime64(const AString: String): AnsiString;
begin
Result := TFormat_MIME64.Encode(AnsiString(AString));
end;
Momentan tendier ich hier zur letzten Variante.
Wie ist es nun bei der Umkehrung
Delphi-Quellcode:
function Mime64ToStr(const AData: String): String;
...
function Mime64ToStr(const AData: String): String;
begin
Result := TFormat_MIME64.Decode(AData);
end;
Welches ist hier die korrekte XE Variante:
Delphi-Quellcode:
// gibt aber Warnung 1058 da String implicit auf RayByteString gecastet wird
function Mime64ToStr(const AData: String): String;
...
function Mime64ToStr(const AData: String): String;
begin
Result := TFormat_MIME64.Decode(AData);
end;
oder
Delphi-Quellcode:
function Mime64ToStr(const AData: String): String;
...
function Mime64ToStr(const AData: String): String;
begin
Result := TFormat_MIME64.Decode(RawByteString(AData));
end;
Und wie ist das eigentlich bei den Rückgabewerten in den letzten beiden Fällen: Macht der implizite Cast von RawByteString auf String hier irgendwelche Probleme bzgl. Codepages bzw. muß man das erst in einen AnsiString laden und dann ans Ergebnis schreiben:
Delphi-Quellcode:
function Mime64ToStr(const AData: String): String;
...
function Mime64ToStr(const AData: String): String;
var
asResult: AnsiString;
begin
asResult := TFormat_MIME64.Decode(RawByteString(AData));
Result := asResult;
end;
Irgendwie bin ich bei diesen ganzen Stringvarianten nun ziemlich durcheinander gekommen.
Danke,
Uli