Delphi转换Unicode问题

时间:2009-10-21 01:03:38

标签: delphi

我们有大型商业应用程序,我们想要从Delphi 6转换到2010年。大约10个第三方组件集,都有源代码......我听说过有关2010年的Unicode警告 - 有没有人有经验和建议?

6 个答案:

答案 0 :(得分:19)

答案 1 :(得分:3)

您将在这些StackOverflow问题中找到一些有用的答案:

Move project from Delphi 3 to Delphi 2010

When and Why Should I Use TStringBuilder?

Convert function to delphi 2009/2010 (unicode)

Unicode problems with Delphi 2009 / 2010 and windows API calls

另外,为了价值,我购买了Marco Cantu's Delphi 2009 Handbook。这就是我需要在几周内完成从Delphi 4到Delphi 2009的相对平稳的转换。

alt text

但是,我建议你确保你的第三方软件包有Delphi 2009升级,否则你可能会遇到一些真正的困难。转换自己的代码是一回事。转换别人的是另一个。

我使用两个第三方软件包,都包含源代码。两者都有可用的升级,其中一个的开发人员写道,他在将非常复杂的组件升级到Delphi 2009的Unicode时遇到了很多麻烦。他花了几个月的时间,但他完成了它。结果,当我升级时,我的组件实现没什么问题。

答案 2 :(得分:1)

我最近一直处于同样的境地。你最需要注意应用程序的“边缘”。 INI文件,文件I / O,日志文件等从delphi工作中获取API调用,因为它们现在已经连接了unicode API调用。检查每个第三方组件集,以确保它们至少为Delphi 2009做好准备......更好的是2010年。即使我使用数据库也不是问题......几乎所有东西都能正常运行。这不是什么大不了的事。任何依赖于角色大小的东西都应该被审查。

真正最关注的转变是2007_or_earlier - > 2009_or_later。

有很多关于它的讨论/博客文章。你可以阅读,阅读,阅读...或者你可以开始使用&走着瞧吧。 (我做了一些)。我确定存在讨论你的问题的“堆栈溢出”问题。我不是假装详细描述会发生什么。

它根本不像听起来那么可怕。

答案 3 :(得分:1)

  

大约10个第三方组件集,都包含源代码。

我要补充的一件事是,如果组件不支持Delphi 2009/2010,请不要尝试通过黑客攻击代码来升级它。

以下是我在How do the new string types work in Delphi 2009/2010?上发布的内容:

  

请参阅Delphi and Unicode,这是MarcoCantù撰写的白皮书,我猜   The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),由乔尔撰写。

     

一个缺陷是默认的Win32 API调用已被映射为使用W(宽字符串)版本而不是A(ANSI)版本,例如ShellExecuteA如果您的代码执行棘手的指针代码假设内部AnsiString的布局,它会破裂。后退是将PChar替换为PAnsiChar,将Char替换为AnsiChar,将string替换为AnsiString,并在Win32 API的末尾追加A.要求那部分代码。代码实际编译并正常运行后,您可以重构代码以使用stringUnicodeString)。

答案 4 :(得分:1)

我必须将Carey Jensen的这篇文章添加到其他人提到的文章中。它被标记为:“Delphi Unicode迁移仅仅是真人:前线的故事和建议”(英文版)。 http://www.danysoft.com/free/delphiunicodemigration.pdf

正如您在标题中所看到的,您会发现许多经验,提示和技巧。我认为这是你问题的答案。仔细阅读后,您一定会知道下一步该做什么。 :)

发现于:http://www.danysoft.com/productos/migrar-aplicaciones-a-delphi-xe-o-cbuilder-xe.html

答案 5 :(得分:0)

要注意的另一点是,使用带字符串的Variant类型和字符串的VarType函数测试:一个需要使用varUString而不是varString。

假设AValue的类型为Variant并且已分配了Unicode字符串值,则以下内容将不起作用:

  if VarType(AValue) = varString then ...

需要更改为

  if VarType(AValue) = varUString then ...