我正在开发Delphi 7中的Word插件,但很快我会将其升级到Delphi 2010,如您所知,自2009年版Delphi引入新的字符串类型 UnicodeString 等于关键字字符串。另一方面,根据this thread,我们需要使用WideString与COM通信。
我的问题是,为了在将来开发Delphi 7时为Delphi 2010做好准备,我该怎么做?目前在我的代码中我使用用户定义的类型UnicodeString,其想法是当使用D7编译时我的字符串是WideString,当使用D2009编译并使用它的UnicodeString时,我看到Virtual TreeView使用这样的技术,如下面的代码: p>
{$ifndef COMPILER_12_UP}
type
UnicodeString = WideString;
PByte = PAnsiChar;
{$endif COMPILER_12_UP}
答案 0 :(得分:6)
第1步
通常你应该尽可能坚持使用'普通'类型:即字符串和字符
这样,您的代码将在升级时“自动”转换
注意:有一些特定于应用程序的例外情况。
如果你不这样做,你可能会遇到一个问题,我在升级某些地方使用AnsiString的代码库时遇到了问题。当AnsiString = String时,这在旧Delphi中不是问题。但显然,当类型不再相同时,这是有问题的。
第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开始,默认使用Wide版本。
备注强>
关于您在COM开发中对WideString的关注:
较旧版本的Delphi在String和WideString之间提供自动类型转换 - 让编译器尽可能地为您工作。显然你的COM接口必须用WideString声明,但是尽量避免使用它。
修改强>
看看Hughes提供的链接:Get ready for Delphi 2009 and up when developing with Delphi 7?
另外要强调的是:每个新版本的Delphi都试图保持某种程度的向后兼容性(包括Delphi 2009)。 如果您只是“正常”编码,则不太可能受到任何影响。事实上,反过来通常是正确的;你获得的花哨越多,就越有可能遇到问题。
我搬到新版Delphi时遇到的唯一严重问题是:
答案 1 :(得分:3)
答案 2 :(得分:1)
您可以遵循一条简单的规则,使您在Delphi 7中编写的代码可以非常轻松地迁移到Unicode世界中:
不要假设任何地方 Char
的大小为1.
换句话说,请始终使用
SizeOf(Char)
而不是代码中的1。
如果您使用这个简单的规则进行编码,那么您的路径应该非常顺畅。完全可以编写将在两种环境中无需更改地编译的代码。
答案 3 :(得分:0)
(VST的奇数声明可能更像是{$ pointermath on}是D2009的事实,你不能在低版本中过度索引pbyte。它可能不是unicode相关的)