Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Umstellung Projekt von 2007 auf XE: wie Strindeklarationen anpassen? (https://www.delphipraxis.net/159802-umstellung-projekt-von-2007-auf-xe-wie-strindeklarationen-anpassen.html)

ULIK 13. Apr 2011 13:51

Delphi-Version: XE

Umstellung Projekt von 2007 auf XE: wie Strindeklarationen anpassen?
 
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. :roteyes:

Danke,
Uli


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz