向Delphi 2009转移

2016-08-22 10:17:19来源:http://lmain.blog.51cto.com/779468/167431作者:cmain83人点击


  先前公司的一个项目因开发时间与项目定位导致结构失衡。在经过前段日子的评估与调查后,从今天开始进行重构。
  也想趁这个机会,将界面的开发由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

  花了一下午,终于成功编译了原有的代码。发现的问题大多是字符串的类型问题。随着后续工作的深入,问题会越来越多或者会发现些啥好东东。到时再添加上来。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台