想要从Delphi 7(及以下版本)升级到Delphi 2010的人有什么提示吗?

21

我对重新评估Delphi 2010很感兴趣。主要问题似乎是ASCII到Unicode的转换。您有发现有用的提示或资源吗?


更新

我想让所有感兴趣的人了解我的进展。希望大家能从中学到东西。

目前,我建议那些想要升级的人可以查看以下内容:

http://www.embarcadero.com/images/dm/technical-papers/delphi-in-a-unicode-world-updated.pdf
Is WideString identical to String in Delphi 2009
What is the compiler version for Delphi 2010?
http://chee-yang.blogspot.com/2008/10/delphi-2009-unicode.html

GIF问题:

请注意,Gif(由Melander)和Png(由Martijn Saly?)图像现在已经纳入Delphi 2010中。您将需要使用条件语句才能使用正确的GIF单元:
USES Windows, SysUtils, Graphics, blabla
{$IFDEF VER150}
  , GIFImage,     {Delphi 7}
{$ELSE}  
  GIFImg          {Delphi 2010}
{$ENDIF}; 

另外,您需要“修复”Embarcadero提供的PNG: http://talkdelphi.blogspot.com/2009_03_01_archive.html

其他需要知道的事情是,在打开Delphi 2010之前,您真的需要备份项目。即使您没有按保存按钮,Delphi 2010也会更改您的DFM文件。表单将丢失数据,并且在D7中无法编译。


升级到Delphi XE

我终于购买了Delphi XE。Delphi XE提供了一些新功能,但不幸的是,其中很少有功能能够正常工作(后台编译、UML建模、代码洞察等)。其他功能也被降级了(例如帮助)。 IDE也不像Delphi 7那样稳定和快速,工具栏也存在实际问题(最好不要自定义IDE)。还有一个讨厌的bug,即IDE的CPU利用率达到100%(请参阅我的其他帖子以了解所有这些问题)。 我希望在更新2和3中,他们将解决一些最紧迫的问题。

无论如何,我认为我升级得太早了,因为现在Embarcadero宣布了64位编译器,所以可能我将不得不再次支付大量资金来升级到下一个版本的Delphi,以获取该编译器。对于那些仍在考虑升级到Delphi XE的人,我建议严格试用Delphi XE。 结论:

Delphi XE带来了许多新功能,但显然您不会使用所有功能。 IDE的稳定性并没有得到改善。 它可以帮助您构建更现代化的应用程序(现代UI打开/保存对话框,应用程序清单)。 支持Unicode。

升级到 Delphi XE7

与从 Delphi 7 升级到 XE 相比,XE 和 XE7 之间的差别并不是那么大。IDE 的稳定性与以往一样(RTL 中有很多崩溃和随机访问冲突)。


升级到Delphi Rio

考虑到自上次更新以来的时间,我可以放心地说,XE7和Rio之间的差异几乎看不出来 - 除了那些对跨平台应用程序(Mac、Android但不包括Linux!)感兴趣的人。对我来说,(适当的)跨平台支持来得太晚了。

优点

  • 真正的高DPI支持(Embarcadero?这么多年后才有?)。
  • IDE崩溃的频率不像XE7时那样频繁。
  • VCL主题终于(似乎)起作用了。
  • 迄今为止最稳定的IDE(如果您打开一个包含多个项目的项目组,仍会崩溃)。
  • 几乎完整的跨平台支持(您需要购买更昂贵的Architect版本才能获得Linux)。幸运的是,对我来说,这有点太晚了。我需要跨平台的项目已经在Lazarus下启动。
  • 升级代码非常容易。

缺点

  • 一些被高度宣传的功能,如暗黑主题根本不起作用!
  • Insight 仍然存在问题:IDE 不支持新语言特性(如声明内联变量),代码将会有下划线红色波浪线。这个问题可能永远无法解决。
  • 另一个超级烦人的 IDE 问题是,即使你已经修复了最后的提示/警告/错误,编译器仍然会显示它们。看起来日志数据仍然保留在某种缓存中。

总体而言,这是目前最稳定的 IDE,但我仍然想知道(特别是与 Lazarus 相比)是否值得那么多钱。

升级到 Delphi Sydney

Sydney 相当稳定。泛型更好。GetIt 几乎可用。对迭代器的支持非常好。喜欢可以在过程体中任何位置声明的新 VAR 和类型推断。
如果你仍然拥有旧版 Delphi,我强烈建议你升级到 Sydney。

升级到 Delphi Alexandria

一切都走向了亚历山大。当我尝试安装库时,IDE崩溃了。IDE中还有许多其他奇怪的问题。社区没有急于更新插件和库以适应亚历山大。
我很高兴地降级回到了悉尼。


多年来的结论: Delphi是一种非常好、清晰的语言。Delphi编译器速度如此之快,以至于使任何C++编译器看起来都像是儿童玩具。 当我说我是Delphi开发人员时,人们仍然会轻视我,我感到很羞愧。Delphi作为一门语言已经灭绝了。在德国寻找Delphi工作只有74个职位列出(但大部分与C#和其他语言混合)。而C++则有超过1500个职位!他们现在提供了一个免费(尽管是残缺的)版本的Delphi,但伤害已经造成。现在复活Delphi已经太迟了。
我认为这种状况主要有三个原因:
  1. Borland放弃了Delphi(与其他语言相比,Delphi落后了)。
  2. Embarcadero接手了,但不尊重客户(产品过于错误和昂贵)。
  3. 主要问题:这门语言多年来没有得到推广。没有理智的公司会为一个已经濒临死亡的语言花费数千美元的许可证费用。而缺乏免费许可证则完全排斥了新一代程序员。

因此,我们在StackOverflow上每年都在思考是否值得投资购买新的Delphi许可证。

更新
最终,Emba发布了一个免费(即社区)版本,你可以看到效果。
多年以来,我第一次不感到羞耻地公开说我使用一种濒临死亡的语言。然而,Delphi仍需要更多的宣传。所有年轻一代都认为Delphi是一个不酷的庞然大物。


1
http://stackoverflow.com/search?q=[delphi]+[unicode]+upgrade - Craig Stuntz
1
我相信到今天为止,D7的IDE仍然是最强大的。而且它基本上不需要运行任何安装程序就能工作 - 如果有疑问,您可以快速在客户端的PC上运行它(当然是为了调试目的)。 - AmigoJack
7个回答

15
我们已经专门为这个问题创建了一个网页: http://www.embarcadero.com/rad-in-action/migration-upgrade-center 在那里,您可以找到涵盖迁移问题的网页、文档、网络研讨会重播等等。
人们首先说的是:“我有一大堆代码库,迁移到Unicode需要很长时间”,几乎没有例外的是他们发现“很长时间”实际上比他们最初想象的要短得多,而Delphi 2010的新功能使得一切都值得。

2
+1. 这是对我工作地点发生的事情的非常好的描述,我们的代码库确实非常庞大。(在几个不同的项目中,我们可能有接近500万行的Delphi代码。) - Mason Wheeler
@Nick -> 你是指那个页面中的“有关转换为Unicode的更多资源”部分吗?我会看一下。谢谢。 - Gabriel

5
最大的问题在于第三方库和VCL。如果它们不支持D2010,那么可能会很痛苦。如果你使用字符串或PChar数组的长度进行计算,并假设每个字符占用一个字节,则会出现Unicode问题。通常情况下,你可以将所有内容都视为旧式的AnsiString / AnsiChar,但这样你就无法享受Unicode的好处。如果你没有任何需要在Unicode中难以实现的内容,那么请尽量使用Unicode,而不必担心来回切换所带来的问题。

4
将代码转换为Unicode并不需要太多时间,只要您的字符串没有做任何“有趣”的事情。我在不到2周的时间内将近100万行的代码和数据库转换了过来。CodeGear的团队在简化方面做得非常好。
您的代码在D2010中可能不需要任何更改就能重新编译(但会有很多提示/警告)。
从转换中最糟糕的问题来自于对Window API的调用出现错误。例如,函数GetComputerName要求您以TChars的格式指定缓冲区的大小。在Ansi中,TChar=1个字节,因此Length=SizeOf。在Unicode中,这种说法不再正确。更糟糕的是,调用API可能不会失败。它只会覆盖一些有效的内存部分,并且在许多后续时刻崩溃。
哦...还有Windows API中Ansi和Unicode之间的细微差别。例如,在CreateProcess的lpCommandLine参数中,在Ansi版本中只读,在unicode版本中读/写。因此,在Ansi中使用常量作为参数工作得很好,但在Unicode中将在Kernel32.dll中崩溃。
总体而言,这取决于您正在处理的代码的质量。糟糕的代码可能很难移植到D2010。良好的代码应该相当容易。
并阅读Nick Hodges链接的资源,它们非常有帮助。

3

阅读Jensen白皮书时,应该忽略类似“一旦您的应用程序在Delphi 2009或更高版本中运行,请查看当您通过用户界面有意向数据库添加Unicode字符时会发生什么”的句子。或者更好的做法是不要忽略它们,思考它们存在哪些问题。 - mghie
另一个宝石:“可能会发现输入Unicode数据的用户不比输入错误日期的用户更少问题。垃圾进,垃圾出。” - mghie

2
我们已经从Delphi 7升级到Delphi 2007,2009和2010!以下是我们发现的最大问题:
  • 线程已更改,Resume和Suspend已被弃用。
  • Unicode
  • 项目结构已更改,不向后兼容。
  • dfm结构已更改,不向后兼容。
希望这可以帮助您。

哇,哇,哇! 我知道其他所有问题,但不知道“dfms的结构已更改且不向后兼容”。你的意思是说,一旦我在D2010中加载和保存了一个项目,我就无法返回D7吗??? - Gabriel
你可以回去 - 你只需要重新填写项目选项。D7将选项存储在.cfg文件中,D2010则存储在.dproj文件中。如果你想回去 - 你需要删除.dproj文件并打开.dpr/.dpk文件。 - Alex
我没有尝试回去,但我记得你不能在Delphi 7中打开D2009 DFM。 - mmmm
@Mmarquee:那是错误的。你可以在D7中打开一个D2009 DFM;你只会得到一些“属性不存在”的错误,但你可以告诉IDE将其删除。这些是D2009中新增的属性,在D7中并不存在,删除后DFM仍然可以正常工作。 - Ken White
但是您不能打开相同的 DFM 并在 D2010 和 D7 中同时使用它们。 - mmmm
我确认一下:Delphi 2010将会破坏一个Delphi 7的表单。将一个D7项目通过D2010并在不保存的情况下按下编译键后,DFM的大小从117KB减少到了9KB! - Gabriel

1

我同意Chris的观点-将我们的代码迁移到2010年时遇到的最大问题是使所有第三方库都正常工作。其中一些需要进行轻微的源代码编辑,并且必须从修改后的源代码中安装。尽管如此,这不算什么,只需要花一天左右的时间将事情处理好。

我们在迁移到2010年时遇到的唯一其他问题涉及一个小的代码部分,由于2010年ProcessMessages的工作方式发生了变化而导致出现了故障。这是一个旧的代码片段,可能本来就不应该以它的方式编写(ProcessMessages和Sleep()在while循环中等待OPC变量更改)。它在2007年可以工作,但在2010年却吞噬了系统消息并锁定了OPC服务器。对我们而言,这是一个小修复,但像肯所说的那样,它可能取决于您正在移植的代码质量。2010年似乎对不良实践和丑陋的黑客攻击容忍度较低。


0

你能否总结一下链接资源中相关的部分? - user9478968

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