我们有大型商业应用程序,我们想要从Delphi 6转换到2010年。大约10个第三方组件集,都有源代码......我听说过有关2010年的Unicode警告 - 有没有人有经验和建议?
答案 0 :(得分:19)
您可以阅读许多可用资源,并且您将协助从Delphi 6迁移到Delphi 2009/2010(Unicode)。
您可以将这些文章用作指南。
再见。
答案 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的相对平稳的转换。
但是,我建议你确保你的第三方软件包有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.要求那部分代码。代码实际编译并正常运行后,您可以重构代码以使用string
(UnicodeString
)。
答案 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 ...