【问题标题】:Porting a Delphi 2006 app to XE将 Delphi 2006 应用程序移植到 XE
【发布时间】:2012-05-22 02:25:48
【问题描述】:

我想将几个大型应用程序从 Delphi 2006 移植到 XE。原因与 Unicode 没有太大关系,而是为了利用(希望)更好的 IDE 稳定性、原生 PNG 支持、更多组件、更少 VCL 错误、更少依赖 3rd 方的东西、更少从你们那里抄袭等等。的应用程序可能会受益于 Unicode,但目前这不是问题。目前我只想采取最直接的方式让它们再次编译。

首先,我已将所有不明确的字符串声明更改为 AnsiString 或 ShortString,将 char 更改为 AnsiChar,将 pChar 更改为 pAnsiChar,并使用 D2006 重新编译。到现在为止还挺好。什么都没坏。

我的问题是:从这里到哪里?假设我只是将我的源代码展示给 XE 编译器并点亮触摸纸,那么可能是什么大问题?

例如,

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

这会产生错误吗?一个警告?我假设 VCL 现在是 Unicode,或者 XE 会引入非 Unicode 组件,还是转换字符串?在 XE 中保留一个使用 8 位字符串的应用实际上是否可行,还是会让人头疼?

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

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

任何(积极的!)评论表示赞赏。

【问题讨论】:

    标签: unicode delphi-xe porting delphi-2006 ansistring


    【解决方案1】:

    从 2006 年到 2011 年是一个长距离的跳跃

    但如果你考虑到这一点是可能的:

    • 您必须使用新的转换方法转换字符串变量;
    • 您必须检查 2006 年和 xe 之间的所有版本才能了解库的变化情况,因为有些已拆分,有些已合并,有些已删除;
    • 您必须购买/下载第 3 方组件的升级(如果有)。

    【讨论】:

      【解决方案2】:

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

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

      最好不要像这样对代码进行 Ansi-fing。拥抱 Unicode。您的代码将更易于管理,并且更易于移植到未来的版本和平台。您应该将AnsiString 的使用限制在实际需要 Ansi 的地方——网络通信、遗留数据的文件 I/O 等。如果您想在应用程序中节省内存,特别是如果您只使用 ASCII 字符,请使用UTF8String 而不是 AnsiString。 UTF-8 是 Unicode 的 8 位编码,UTF8StringUnicodeString 之间的转换是无损的,没有编译器警告。

      【讨论】:

      • 谢谢@Remy。在全球范围内从AnsiString 回到String 没什么大不了的(FART 是一个很好的工具)。有合理数量的代码需要并假定字节大小的 ASCII 字符串。如果我将所有声明恢复为“字符串”,XE 将采用 UnicodeString。当我编写类似 if (S [3] = ':') then... 的代码时它会警告我吗?这是我不想忽视的场景。
      • ':' 是一个字符文字。字符文字和字符串文字现在是上下文相关的。当与 UnicodeString 一起使用时,文字将是 Unicode(在 #XX 的特定情况下,#80-#FF 范围内的 2 位数文字,其 Unicode 表示受新 HIGHCHARUNICODE 的影响编译器指令)。 StringCharPChar 现在都是 Unicode。如果SUnicodeString,那么您将比较WideCharWideChar。如果 SAnsiString 相同,您将比较 AnsiCharAnsiChar。在这两种情况下,都不需要编译器警告。
      • 好的。 @Remy 我的意思是,如果我有现有代码:var S : string ; begin S := 'hello' ; Writeln (SomeTextFile, S) ; 并且文件需要是 8 位 ASCII 并在该代码执行后包含字节 $68, $65, $6C, $6C, $5F, $0D, $0A,XE 编译器不会警告我它正在运行将 S 视为 Unicode 而不是 Asni,文件内容会不同(和错误)?我理解正确吗?
      • 没有。老式的 Pascal 文件 I/O 例程,如 WriteLn(),根本不支持 Unicode。如果您将UnicodeString 传递给WriteLn(),它将在写入文件之前转换为 Ansi。只要UnicodeString 包含ASCII 字符,您就会得到您期望的输出。如果它包含非 ASCII 字符,您可能会因转换而丢失数据。如果您想支持 Unicode 文件 I/O,请改用 VCL 的 TStreamWriter 类。它有一个WriteLine() 方法并支持TEncoding 类。
      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2010-11-29
      • 2011-08-04
      • 2014-05-28
      相关资源
      最近更新 更多