Delphi6项目迁移到Delph7时最常见问题

本文探讨了从Delphi6迁移到Delphi7过程中遇到的问题,特别是在字符串处理函数上的变化导致的死循环现象,并提供了兼容性的解决方案。

 

一个遗留的老项目,原来是在Delphi 6(D6)环境下开发和编译的。这两天计划将其迁移到Delphi 7(D7)下,结果使用D7编译后的新程序不能正常运行,出现某些界面打不开的情况。经跟踪测试发现原来在D6下可正常执行的代码在D7中发生了“死循环”的情况。

D6D7版本之间的差异应该说还是比较小的,怎么会出现这种情况呢?查阅了D7What’s New文档,终于找到了缘由。

原来在出错的代码段中使用了常见的系统字符串函数LeftStrRightStr。根据文档说明,D7中修改了它们的实现,目的是为了支持多字节字符集,比如汉字。除了以上两个函数外,还包括一个MidStr

这一组字符串函数的功能是取字符串的子串,位于StrUtils单元。在D6中,他们只有一种实现,参数与返回值类型都是String(默认为AnsiString)。而在D7中,分别有单字节和多字节两种实现,即AnsiStringWideString版本。这样,如果参数中存在汉字或全角符号等双字节的字符,会自动调用到WideString版本,从而导致出现了不希望的结果。

打开StrUtils单元,比较D6D7的对应部分,一目了然。(以LeftStr为例)

D6

  1. function LeftStr(const AText: stringconst ACount: Integer): string;
  2. begin
  3.   Result := Copy(AText, 1, ACount);
  4. end;

D7

  1. function LeftStr(const AText: stringconst ACount: Integer): string;
  2. begin
  3.   Result := Copy(AText, 1, ACount);
  4. end;
  5. function LeftStr(const AText: WideString; const ACount: Integer): WideString; overload;
  6. begin
  7.   Result := Copy(AText, 1, ACount);
  8. end;
  9. function LeftBStr(const AText: AnsiString; const AByteCount: Integer): AnsiString;
  10. begin
  11.   Result := Copy(AText, 1, AByteCount);
  12. end;
  13. function AnsiLeftStr(const AText: AnsiString; const ACount: Integer): AnsiString;
  14. begin
  15.   Result := LeftStr(AText, ACount);
  16. end;

举例说明:

    ShowMessage( LeftStr(‘中华人民共和国’, 2));

同样一行代码在D6中将会显示“中”,D7中显示“中华”。

但如果参数不含有多字节字符,全部是单字节字符,则不会有问题。

如:

    ShowMessage( LeftStr(‘China’, 2));

D6D7中都将显示“Ch”。

 

那么,如果代码中大量使用了以上三个字符串函数,在迁移时如何处理呢?

实际上Delphi的工程师们已经为我们准备好了保持兼容的简单方法。那就是为上述三个函数准备了对应的兼容版本,名称分别为LeftBStrRightBStrMidBStr。也就是说,只要将原有代码中的LeftStrRightStrMidStr分别作替换即可。当然,如果确定这些函数仅可能会处理单字节字符,则可以不作任何变动。

 

更多细节及迁移到D7的注意事项可参见What’s New in Delphi 7文档。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值