Delphi低版本源码移植到高版本可能遇到的警告信息解决方法

阅读: 评论:0

Delphi低版本源码移植到高版本可能遇到的警告信息解决方法

Delphi低版本源码移植到高版本可能遇到的警告信息解决方法

本文来自:.aspx

先前公司的一个项目因开发时间与项目定位导致结构失衡。在经过前段日子的评估与调查后,从今天开始进行重构。

也想趁这个机会,将界面的开发由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 := _Edit.Text; 
       end;        
       产生原因:又是一个类型问题 
       解决方法:这种以前在D6中常的代码以后不能用了:(,改正也简单:DisName := _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 花了一下午,终于成功编译了原有的代码。发现的问题大多是字符串的类型问题。随着后续工作的深入,问题会越来越多或者会发现些啥好东东。到时再添加上来。

本文发布于:2024-01-28 23:31:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170645588211086.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:Array与Arrays
下一篇:C++. size
标签:版本   解决方法   源码   信息   Delphi
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23