Toto je trochu odlišné od SameText
otázka.
Potrebujem konvertovať AnsiString
do Integer
.
var
param: AnsiString;
num: Integer;
begin
if TryStrToInt(param, num) then
...
V pred Unicode Delphi by som použil TryStrToInt
fungujú, ale v modernej Delphi existuje iba jeho verzia Unicode, takže dostávam toto upozornenie: W1057 Implicitné reťazce prenášané z „AnsiString“ na „reťazec“ pri volaní.
Moja otázka je, ako správne previesť AnsiStrings v moderných Delphi bez toho, aby sa zobrazovali varovania kompilátora (a bez zbytočného odovzdávania reťazcov do UnicodeString (text))
odpovede:
7 pre odpoveď č. 1K dispozícii máte rôzne možnosti:
- Prijímajte a prijímajte Unicode. Prestaňte používať
AnsiString
. - Použite výslovný prevod do
string
:TryStrToInt(string(param), num)
. - Vypnite varovanie W1057.
- Vykonajte konverziu z ANSI na UTF-16 sami volaním na
MultiByteToWideChar
, Toto nie je vážna možnosť, ale ak chcete ponechať W1057 povolenú a nepoužiť explicitnú konverziu, zostane to.
Úprimne povedané, uprednostňuje sa možnosť 1. Ak sa pokúsite vytrvať v používaní AnsiString
prostredníctvom svojho kódu budete wallowing vnekonečné množstvo obáv a varovaní. Ak potrebujete reťazce kódované ANSI, pravdepodobne bude na hranici interopu. Možno čítate alebo zapisujete súbory, ktoré používajú kódovanie ANSI. Vykonajte prevod medzi ANSI a UTF-16 na hranici interop. Zvyšok času na použitie interného kódu string
.
0 pre odpoveď č. 2
ako správne previesť AnsiStrings v modernej Delphi bez toho, aby sa dostal varovania kompilátora (a bez toho, aby sa zbytočne museli prenášať reťazce na UnicodeString
Ak neodovzdávate z AnsiString do String, kompilátor to urobí za vás. Je to len záležitosť, ak to výslovne urobíte, alebo to kompilátor implicitne urobí za vás.
Ak explicitne vykonáte konverziu v kóde (prostredníctvom obsadenia), kompilátor sa nemusí báť vedľajších účinkov. Predpokladá sa, že viete, čo robíte, a necháva vás tak.
Musíte si vybrať jeden. Varovanie kompilátora alebo explicitné odovzdávanie.
Tieto varovania kompilátora by ste mohli technicky vypnúť (ale nerobte to):
W1057 IMPLICIT_STRING_CAST ON Implicitný reťazec prenášaný z '% s' na '% S' (Delphi)
W1058 IMPLICIT_STRING_CAST_LOSS ON Implicitné zadávanie reťazcov pomocou potenciálna strata údajov z „% s“ na „% s“ (Delphi)