Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Implizite String-Umwandlung von 'AnsiString' zu 'string' (https://www.delphipraxis.net/155420-implizite-string-umwandlung-von-ansistring-zu-string.html)

pustekuchen 22. Okt 2010 10:29

Delphi-Version: 2010

Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Guten Tag,

Ich habe desöfteren in meinem Projekten folgende Warnung nach dem Compilen.

Beispiel:
Delphi-Quellcode:
mmoInfo.Lines.Add(dbInfo.DBFileName);
Code:
[DCC Warnung] XXX.pas(XX): W1057 Implizite String-Umwandlung von 'AnsiString' zu 'string'
Kann man diese Warnung getrost ignorieren und die String-Formatüberprüfung ausschalten?
Oder sollte ich die Zeile folgendermaßen umschreiben?
Delphi-Quellcode:
mmoInfo.Lines.Add(String(dbInfo.DBFileName));

himitsu 22. Okt 2010 11:09

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
An deinem Beispiel fehlt der Hinweis, daß DBFileName wohl ein AnsiString ist.

Aber diese Meldung kannst du auch einfach ignorieren.
ANSI paßt in Unicode rein.

Zitat:

Implizite String-Umwandlung von 'string' zu 'AnsiString'
Andersrum sollte man schon eher aufpassen, denn nicht jedes Unicodezeichen paßt in eine ANSI-Kodierung rein, weswegen dort Informationen verloren gehen können.

Satty67 22. Okt 2010 11:15

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Warnungen abschalten mache ich persönlich ungerne, manchmal ist auch nur eine Warnung ganz hilfreich.

Man kann aus der Umwandlung eine explizite machen:
Delphi-Quellcode:
mmoInfo.Lines.Add(String(dbInfo.DBFileName));
.
dann sollte die Warnung eigentlich auch verschwinden, oder?

***

implizite Umwandlung: versteckte oder durch Programmier-Code nicht direkt angegebene Umwandlung
explizite Umwandlung: direkt sichtbare oder forcierte/gewollte Umwandlung

himitsu 22. Okt 2010 11:19

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Ja, explizite Umwandlungen werden nicht bemängelt.

Wobei ich mich zuerst mal an DBFileName wenden würde ... man könnte ja mal schauen, ob sich dieses nach String/UnicodeString umdeklarieren läßt.

pustekuchen 22. Okt 2010 11:30

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Okay gut zu wissen ;)

Dann lass ich die Überprüfung Sicherheitshalber an und Ignoriere die Nachrichten ;)

Assarbad 22. Okt 2010 13:19

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Zitat:

Zitat von himitsu (Beitrag 1057138)
Aber diese Meldung kannst du auch einfach ignorieren.
ANSI paßt in Unicode rein.

Säääähkunde! ANSI hat noch immer verschiedene Codeseiten. Und auch wenn jede einzelne locker in Unicode reinpaßt, ist die Warnung dazu da dich darauf hinzuweisen daß bspw. bei Umlauten, ß oder anderen seltsamen Zeichen (kyrillisch, chinesisch) die Umwandlung eventuell nicht wie gewollt stattfindet. Am Ende weiß immernoch der Programmierer am besten welche Codeseite die korrekte ist.

himitsu 22. Okt 2010 13:23

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Wenn man dieses bescheuerte Encoding-Word (die Codepage) im D2009+-String ordentlich gesetzt hat, dann gibt es keine Probleme, bei einer automatischen Umwandlung.

Und dieses setzen natürlich alle ordentlich auf die nötige codepage, wenn diese sich von der Standard-Codepage unterscheidet. :roll:
PS: Ob es nun implizit oder explizit, via String(...), umgewandelt wird, daß macht keinen Unterschied.

OK, wer weiß was eine Codepage ist und bewußt eine Andere nutzt, der wird dieses auch ordentlich behandeln.


Aber genau deswegen würde ich diese Meldung belassen.
So vergißt man es nicht und kann sich notfalls auch mal gezielt um das Problem kümmern.
> doch explizit umwandeln, wenn man sich sicher ist, daß es so OK ist
> manuell umwandeln (z.B. über TEncoding)
> doch die Stringvariable auf Unicode erweitern
> oder das Ziel auf ANSI beschränken

Wobei Letzeres hier nix bringt, da 'ne StringList, bzw. das Memo sowieso kein ANSI mögen.

Assarbad 23. Okt 2010 01:55

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Zitat:

Zitat von himitsu (Beitrag 1057177)
PS: Ob es nun implizit oder explizit, via String(...), umgewandelt wird, daß macht keinen Unterschied.

Point taken ;)

Micha88 30. Nov 2011 19:31

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Was genau bedeutet das eigentlich, aus einer impliziten eine explizite Umwandlung zu machen?

himitsu 30. Nov 2011 19:40

AW: Implizite String-Umwandlung von 'AnsiString' zu 'string'
 
Delphi-Quellcode:
var
  W: WideString;
  A: AnsiString;
  I: Integer;
  C: Cardinal;

// implizit (unbeabsichtigt/automatisch)
W := A;
L := I;

// explizit (absichtlich/manuell)
W := WideString(A);
C := Cardinal(I);
Eventuell auch mal in Wiki die Artikel zum Implizit und Explizit durchlesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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