Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unicode 将Delphi 2006应用程序移植到XE_Unicode_Delphi Xe_Porting_Delphi 2006_Ansistring - Fatal编程技术网

Unicode 将Delphi 2006应用程序移植到XE

Unicode 将Delphi 2006应用程序移植到XE,unicode,delphi-xe,porting,delphi-2006,ansistring,Unicode,Delphi Xe,Porting,Delphi 2006,Ansistring,我想把几个大型应用程序从Delphi2006移植到XE。原因不在于Unicode,而是利用(希望)更好的IDE稳定性、本机PNG支持、更多的组件、更少的VCL错误、更少的对第三方内容的依赖、更少的来自你们的嘲笑等等。一些应用程序可能会从Unicode中受益,但目前这不是一个问题。目前,我只想采取最直接的方法让它们重新编译 首先,我更改了所有不明确的字符串声明,即string改为ansisting或ShortString,char改为AnsiChar,pChar改为pAnsiChar,并用D200

我想把几个大型应用程序从Delphi2006移植到XE。原因不在于Unicode,而是利用(希望)更好的IDE稳定性、本机PNG支持、更多的组件、更少的VCL错误、更少的对第三方内容的依赖、更少的来自你们的嘲笑等等。一些应用程序可能会从Unicode中受益,但目前这不是一个问题。目前,我只想采取最直接的方法让它们重新编译

首先,我更改了所有不明确的字符串声明,即string改为ansisting或ShortString,char改为AnsiChar,pChar改为pAnsiChar,并用D2006重新编译。到现在为止,一直都还不错。什么也没破

我的问题是:从这里到哪里?假设我只是将我的源代码展示给XE编译器,并轻描淡写,那么最大的问题可能是什么

比如说,

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

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

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


欢迎评论。

VCL现在完全是Unicode,因此您显示的代码将生成一个编译器警告,而不是错误,关于从
AnsiString
UnicodeString
的隐式转换。如果
AnsiString
包含非ASCII字符(编译器无法验证),则这可能是有损转换。如果继续使用
AnsiString
,则必须执行显式类型转换以避免出现警告:

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

最好不要像这样修改代码。接受Unicode。您的代码将更易于管理,并且更易于移植到未来的版本和平台。您应该将
AnsiString
的使用限制在实际需要Ansi的地方-网络通信、旧数据的文件I/O等。如果您想在应用程序中节省内存,特别是如果您仅使用ASCII字符,请使用
UTF8String
而不是
AnsiString
。UTF-8是一种8位的Unicode编码,
UTF8String
UnicodeString
之间的转换损失较小,没有编译器警告。

VCL现在完全是Unicode,因此您显示的代码将生成编译器警告,而不是错误,关于从
AnsiString
UnicodeString
的隐式转换。如果
AnsiString
包含非ASCII字符(编译器无法验证),则这可能是有损转换。如果继续使用
AnsiString
,则必须执行显式类型转换以避免出现警告:

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

最好不要像这样修改代码。接受Unicode。您的代码将更易于管理,并且更易于移植到未来的版本和平台。您应该将
AnsiString
的使用限制在实际需要Ansi的地方-网络通信、旧数据的文件I/O等。如果您想在应用程序中节省内存,特别是如果您仅使用ASCII字符,请使用
UTF8String
而不是
AnsiString
。UTF-8是一种8位的Unicode编码,
UTF8String
UnicodeString
之间的转换在没有编译器警告的情况下损失更少。

这是从2006年到2011年的一个飞跃

但是如果你认为:

是可能的。
  • 您必须使用新的转换方法转换字符串变量
  • 您必须检查2006年到xe之间的所有版本,以了解库是如何更改的,因为有些库已被删除,有些库已被合并,还有一些库已被删除
  • 您必须购买/下载第三方组件的升级(如果有)

这是一次从2006年到2011年的跳远

但是如果你认为:

是可能的。
  • 您必须使用新的转换方法转换字符串变量
  • 您必须检查2006年到xe之间的所有版本,以了解库是如何更改的,因为有些库已被删除,有些库已被合并,还有一些库已被删除
  • 您必须购买/下载第三方组件的升级(如果有)

谢谢@Remy。从
AnsiString
全局返回到
String
没有什么大不了的(屁是一个很好的工具)。有相当数量的代码需要并假定字节大小的ASCII字符串。如果我将所有声明都恢复为“string”,XE将假定为UnicodeString。当我编写类似于
的代码时,如果(S[3]=':')那么…
,它会警告我吗?这是我不想忽视的场景。
:“
是一个字符文本。字符文字和字符串文字现在是上下文敏感的。当与
Unicode解压
一起使用时,文字将是Unicode(在
#XX
的特定情况下,在
#80
-
#FF
范围内的两位文字,其Unicode表示受新的
HIGHCHARUNICODE
编译器指令的影响)
String
Char
PChar
现在都是Unicode。如果
S
是一个
UnicodeString
,则将
WideChar
WideChar
进行比较。如果
S
改为
AnsiString
,则将
AnsiChar
AnsiChar
进行比较。在这两种情况下,都不需要编译器警告。确定@Remy我的观点是,如果我有现有的代码:
vars:string;开始S:=“你好”;Writeln(SomeTextFile,S)并且文件需要是8-bi