2012-05-22 123 views
1

我想将几个大型应用程序从Delphi 2006移植到XE。原因不在于使用Unicode,而是为了利用(希望)更好的IDE稳定性,本地PNG支持,更多组件,更少的VCL bug,更少依赖第三方的东西,减少对你们的影响等。的应用程序可能受益于Unicode,但目前这不是问题。目前我只想采取最直接的方法让他们再次编译。作为开始,我已经将所有含糊不清的字符串声明,即字符串改为AnsiString或ShortString,将字符串改为AnsiChar,并将pChar改为pAnsiChar,然后用D2006重新编译。到现在为止还挺好。没有什么破坏将Delphi 2006应用程序移植到XE

我的问题是:从哪里来?假设我只是向XE编译器提供消息来源并点亮触摸纸,那么可能是什么问题呢?

例如,

var 
    S : AnsiString ; 
... 
MainForm.Caption := S ; 

这是否会产生一个错误?一个警告?我假设VCL现在是Unicode,还是将XE拉入非Unicode组件,或者转换字符串?在XE中保留使用8位字符串的应用程序实际上是否可行?还是会有太多令人头痛的问题?

如果最好的/最简单的方法是Unicode,我会这样做,即使我不会使用扩展字符,至少在不久的将来。

我想知道的另一件事是第三方的东西。我想我需要获得与XE兼容的更新版本。

任何(肯定!)评论赞赏。

回答

0

现在VCL完全是Unicode,所以你显示的代码将生成一个编译器警告,而不是一个错误,关于从AnsiString到到UnicodeString的隐式转换。如果AnsiString包含非ASCII字符(编译器无法验证),那么这是一种潜在的有损转换。如果继续使用AnsiString,那么你必须做一个明确的类型转换,以避免该警告:

var 
    S : AnsiString ; 
... 
MainForm.Caption := String(S); 

你是最好的关闭不是ANSI-fying你这样的代码。拥抱Unicode。您的代码将更容易管理,并且对未来的版本和平台而言,它将更具可移植性。您应该将AnsiString的用法限制在Ansi实际需要的地方 - 网络通信,传统数据的文件I/O等。如果要将内存保存在应用程序中,尤其是仅在使用ASCII字符时,请使用UTF8StringAnsiString。 UTF-8是Unicode的8位编码,并且UTF8StringUnicodeString之间的转换无损失,无编译器警告。

+0

谢谢@Remy。从全球范围的'AnsiString'回到'String'没什么大不了的(FART是一个很棒的工具)。有合理数量的代码需要并采用字节大小的ASCII字符串。如果我将所有声明都还原为“字符串”,则XE将假定UnicodeString。当我编写类似'if(S [3] =':')然后...'的代码时它会警告我吗?这是我不想忽视的情况。 – rossmcm

+0

'':'是字符文字。字符文字和字符串文字现在是上下文相关的。当与'UnicodeString'使用的,将文字是Unicode(在'#XX' 2位数中的'#的范围内字面的特定情况下80'-'#FF',其Unicode表示是由新的影响'HIGHCHARUNICODE'编译器指令)。 'String','Char'和'PChar'现在都是Unicode。如果'S'是一个'UnicodeString',那么你将比较'WideChar'和'WideChar'。如果'S'是'AnsiString',那么你会比较'AnsiChar'和'AnsiChar'。在这两种情况下,都不需要编译器警告。 –

+0

好的。 @Remy我的观点是,如果我有现有的代码:'var S:string;开始S:='你好'; Writeln(SomeTextFile,S);'和文件需要8位ASCII和包含字节'$ 68 $ 65 $ 6C,$ 6C,$ 5F,$ 0D,$ 0A'后代码执行时,XE编译器不会警告我会将S视为Unicode而不是Asni,并且文件内容将会不同(并且错误)?我理解正确吗? – rossmcm

1

这是一个跳远以2006年到2011

但如果你认为这是可能的:

  • 您可以选择使用新的转换方法,将字符串变量;
  • 你必须检查2006年和xe之间的所有版本,以了解库如何改变,因为有些已经被抽出,其他人被合并,并且被删除了一些;
  • 您必须购买/下载第三方组件的升级(如果有)。
相关问题