Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
使用Delphi 7开发时,是否准备好迎接Delphi 2009及更高版本?_Delphi_Unicode - Fatal编程技术网

使用Delphi 7开发时,是否准备好迎接Delphi 2009及更高版本?

使用Delphi 7开发时,是否准备好迎接Delphi 2009及更高版本?,delphi,unicode,Delphi,Unicode,我正在Delphi 7中开发一个Word addin,但很快我会将其升级到Delphi 2010,正如您所知,因为版本2009 Delphi引入了新的字符串类型UnicodeString,它等于关键字string。另一方面,根据需要,我们需要使用WideString与COM进行通信 我的问题是,在Delphi 7中开发的同时,我应该做什么来为Delphi 2010的未来做好准备?目前,在我的代码中,我使用了一种用户定义的UnicodeString类型,其思想是当使用D7编译时,我的字符串是Wid

我正在Delphi 7中开发一个Word addin,但很快我会将其升级到Delphi 2010,正如您所知,因为版本2009 Delphi引入了新的字符串类型UnicodeString,它等于关键字string。另一方面,根据需要,我们需要使用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}

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

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

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

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

步骤6、7、8、9和10
不要试图通过重新定义编译器的内部类型来猜测它。你正面临许多头疼的问题。问题是VCL、运行时库和第三方组件都“理解”了什么是String。当您升级到Delphi 2009时,“新理解”仍将共享

如果您更改了该定义,那么由于隐式兼容性,旧版本中的内容可能仍然有效;然而,当2009年德尔福的情况突然发生变化时,它可能会发生可怕的变化

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

注释
关于您对COM开发中WideString的担忧:
旧版本的Delphi提供了字符串和WideString之间的自动类型转换——让编译器尽可能地为您工作。显然,您的COM接口必须使用WideString声明,但请尽量避免超出此范围的任何内容

编辑
请看休斯提供的链接:

还需要强调的是:每个新版本的Delphi都试图保持一定程度的向后兼容性(包括Delphi2009)如果您只是“正常”编写代码,您不太可能受到很大程度的影响。事实上,反过来通常是正确的;你得到的幻想越多,你就越有可能遇到问题

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

  • 没有源代码的第三方代码/库
  • 未维护的第三方代码,开发人员使用各种编码“技巧”
  • Delphi3中的Midas代码是一个特别艰巨的升级。(不过,开发人员绕过推荐的技术也是一大罪魁祸首。)

很好地了解

(VST的奇怪pbyte声明可能更适合于解决{$pointermath on}是D2009这一事实,并且不能在较低版本中对pbyte进行过度索引。它可能与unicode无关)

您可以遵循一条简单的规则,使您在Delphi 7中编写的代码能够非常轻松地迁移到Unicode世界:

不要假设任何地方的
字符的大小为1

换句话说,始终使用

SizeOf(Char)
而不是代码中的1


如果您在编写代码时牢记了这条简单的规则,那么您的路径应该是非常平滑的。完全可以编写在两种环境中都可以编译的代码

+1:我浏览了这篇文章,看起来很透彻。。。强烈推荐,我将阅读全部内容。我忘了提一个要求:现在使用D7时,我需要使用WideString来支持Unicode…嗨,Craig,谢谢你的详细回答,我忘了提一个要求:现在使用D7时,我需要使用WideString来支持国际语言。嗨,Edwin,因此,按照步骤1,您确实有一个特定于应用程序的理由不使用普通字符串。在这种情况下:-您应该在必要时使用宽字符串。-您可能已经避免了错误假设字符大小的常见陷阱。-你仍然不应该对编译器进行“二次猜测”。PS:我想你的应用程序将超越“西方”语言的国际化;否则,Ansi已经支持许多西文字符。嗨,Craig,我使用WideString(以及其他第三方LIB),因为这是使用D7实现国际化的唯一方法。谢天谢地,自从我开始学习编程以来,我就养成了这个好习惯;)