与Delphi 7一起开发时,为Delphi 2009及更高版本做好准备?

5
我正在使用Delphi 7开发Word插件,但很快会升级到Delphi 2010。正如您所知,自2009版本以来,Delphi引入了新的字符串类型“UnicodeString”,它等同于关键字“string”。另一方面,根据this thread,我们需要使用WideString来与COM进行通信。
我的问题是,在当前使用Delphi 7进行开发的同时,为了将来准备好Delphi 2010,我应该怎么做?目前在我的代码中,我使用了用户定义的类型UnicodeString,这样当使用D7编译时,我的字符串就是WideString,当使用D2009及以上版本时,它就是UnicodeString。我看到Virtual TreeView使用了这种技术,例如以下代码:
{$ifndef COMPILER_12_UP}
type
  UnicodeString = WideString;
  PByte = PAnsiChar;
{$endif COMPILER_12_UP}

我忘了提到一个要求:目前在使用D7时,我需要使用WideString来支持Unicode... - Edwin Yip
4个回答

6

步骤1
通常情况下,尽可能使用“正常”类型:即字符串和字符。
这样,当您升级时,您的代码将会被“自动”转换。
注意:有一些特定于应用程序的例外。

如果不这样做,升级代码库时可能会遇到我曾经遇到过的问题,在某些地方使用了AnsiString。在旧版本的Delphi中,AnsiString=String,所以这不是问题。但显然,当类型不再相同时,这是有问题的。

步骤2
阅读迁移到Unicode Delphi 2009的指南。它提到了在处理字符串时通常滥用的函数,因为它假定每个字符是1个字节。请注意这些内容,并根据这些建议进行编码。

步骤3、4和5
避免使用条件编译。这只会让你更头疼。

步骤6、7、8、9和10
不要试图重新定义编译器的内部类型,否则会遇到许多问题。事实上,VCL、运行时库和第三方组件都对有一个“理解”。在升级到Delphi 2009时,“新的理解”仍将被共享。

如果更改该定义,则在旧版本中可能仍然有效,由于隐式兼容性; 但是,在Delphi 2009中突然发生变化时,它很可能会彻底崩溃。

记住!使用的字符串类型是Windows API调用的重要考虑因素。Windows通常支持大多数函数的Ansi和Wide版本。在旧版本的Delphi中,默认使用Ansi版本;从Delphi 2009开始,默认使用Wide版本。

注意事项
关于您对COM开发中WideString的担忧:
旧版本的Delphi提供了String和WideString之间的自动类型转换-让编译器尽可能地为您工作。显然,您的COM接口必须声明为WideString,但请尽量避免其他任何东西。

编辑
请查看Hughes提供的链接:使用Delphi 7进行开发时准备好Delphi 2009及以上版本?

还要强调的是:每个新版本的Delphi都试图保持某种程度的向后兼容性(包括Delphi 2009)。如果您只是“正常”编码,您不太可能受到影响。事实上,相反通常是真的:越“花哨”的东西,遇到问题的可能性就越大。

我在升级到新版本的Delphi时遇到的唯一严重问题是:

  • 没有源代码的第三方代码/库。
  • 未维护的第三方代码,其开发人员采用了各种编码“技巧”。
  • Delphi 3中的Midas代码是一次特别艰难的升级。(但是,开发人员绕过推荐的技术也是一个罪魁祸首。)

1
嗨,Craig,感谢您提供详细的答案。我忘记提到一个要求:目前在使用D7时,我需要使用WideString来支持国际语言。 - Edwin Yip
嗨,Edwin,所以根据步骤1,您确实有使用普通字符串的应用程序特定原因。在这种情况下: - 您应该在必要时使用WideString。 - 您可能已经避免了常见陷阱,即错误地假设字符大小。 - 你仍然不应该试图'预测'编译器。 PS:我假设您的应用程序将国际化到“西方”以外的语言;否则,Ansi已支持许多西方语言字符。 - Disillusioned
嗨,Craig,我使用WideString(以及其他第三方库),因为这是在D7中国际化的唯一方法。 - Edwin Yip

3

+1:我浏览了一遍这篇文章,看起来相当详尽...强烈推荐,我会读完整篇文章的。 - Disillusioned

1

您可以遵循一个简单的规则,使您在 Delphi 7 中编写的代码非常容易迁移到 Unicode 环境中:

不要在任何地方假定Char类型的大小为1。

换句话说,在您的代码中始终使用 SizeOf(Char) 代替 1。

如果您牢记这个简单的规则来编写代码,您的路径应该会非常平稳。完全有可能编写能够在这两个环境中都编译通过的代码。


谢天谢地,自从我开始学习编程以来,我就养成了这个好习惯 ;) - Edwin Yip

0

VST 的奇怪的 pbyte 声明可能更多地是因为 {$pointermath on} 是 D2009,而在较低版本中无法超出 pbyte。它可能与 Unicode 无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接