向Delphi 2009转移

  先前公司的一个项目因开发时间与项目定位导致结构失衡。在经过前段日子的评估与调查后,从今天开始进行重构。
  也想趁这个机会,将界面的开发由Delphi 6转向Delphi 2009。从而逐步放弃Delphi 6这个用了近7年的开发工具。也知道在转移的过程中会碰到许多问题,因此在此处对这些问题进行记录(其中包含了很多警告信息,但偶喜欢追求0警告),以供参考。
1)首先将自写的控件转移。直接从以前的.dpk安装控件,发现安装不上去,出现很多编译错误。只好另外新建一个D2009的包文件,再将源码文件添加进来。安装成功。
虽然安装成功,却有以下问题:[DCC Warning] Lilac.dpk(62): W1033 Unit 'VirtualTrees' implicitly imported into package 'Lilac'

从词面上知道解决方法,却不知道为什么会产生这个问题。
解决方法:将VirtualTrees所在包的dcp文件添加到Requires中。
2)由以下代码产生的警告 [DCC Warning] RVMarker.pas(1122): W1063 Widening given AnsiChar constant (#$A7) to WideChar lost information
var
ch: Char;
begin
if (ch >= #$A7) then //或者 if (ch >= #167) then
end;
产生原因:D2009的Char为宽字符WideChar,而#$A7代表的是AnsiChar。
解决方法:要将 #$A7 或 #167 改为 #$00A7 即可
3)由以下代码产生的警告 [DCC Warning] RVMarker.pas(1120): W1057 Implicit string cast from 'AnsiChar' to 'string'
// 函数的声明:procedure ReplaceStr(var str: String; oldstr, newstr: String);
ReplaceStr(stResult, #$A7, 'A');
ReplaceStr(stResult, #167, 'A');
产生原因:同上
解决方法:同上
4)protected域的procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;在编译时出现警告:[DCC Hint] uMLBoxCtrls.pas(722): H2269 Overriding virtual method 'TMLListBox.GetChildren' has lower visibility (protected) than base class 'TMLControl' (public)
从信息可以看出是因为将父类(TCustomControl)的public域函数覆盖到了protected域导致的
产生原因:此函数(TCustomControl.GetChildren)在D6中是protected域的函数,在D2009中却成了public域了
解决方法:将此函数声明到public域中
5)调用API函数gethostname出错:[DCC Error] uVIMPublicFun.pas(449): E2010 Incompatible types: 'Array' and 'PAnsiChar'
var
hostName : array [0..255] of char;
begin
gethostname(hostName, sizeof (hostName));
end;
产生原因:D2009的Char为宽字符WideChar,而gethostname第一个参数是PAnsiChar。
解决方法:将hostName的声明改成array [0..255] of AnsiChar;即可。
6)以下代码生成警告:[DCC Warning] uEditor.pas(192): W1058 Implicit string cast with potential data loss from 'TCaption' to 'ShortString'
var
DisName : string[80];
begin
DisName := Self.cmg_Edit.Text;
end;
产生原因:又是一个类型问题
解决方法:这种以前在D6中常的代码以后不能用了:(,改正也简单:DisName := ShortString(Self.cmg_Edit.Text);。
7)以下代码编译错误:[DCC Error] PageFrm_Owner.pas(3695): E2008 Incompatible types
var
DisName : string[80];
AliasName: array[0..80] of Char;
begin
DisName := AliasName;
end;
产生原因:还是类型问题
解决方法:DisName := ShortString(AliasName);
8)以下代码产生警告:[DCC Warning] VirtulFirm.pas(127): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.
procedure TVirtualFirm.edFirmKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9']) then
begin
Key := #0;
end;
end;
产生原因:类型问题
解决方法:if not (AnsiChar(Key) in ['0'..'9']) then
9)cm_Pt := SmallPointToPoint(Message.Pos)会产生一行提示:[DCC Hint] uMLPageControl.pas(326): H2443 Inline function 'SmallPointToPoint' has not been expanded because unit 'Types' is not specified in USES list
产生原因:查看函数的声明发现一个以前没有在delphi中出现过的inline,估计此关键字的功能与C++的相同或相似。
解决方法:根据提示信息即可知道如何解决,即uses types
  花了一下午,终于成功编译了原有的代码。发现的问题大多是字符串的类型问题。随着后续工作的深入,问题会越来越多或者会发现些啥好东东。到时再添加上来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值