1. 程式人生 > >Delphi低版本原始碼移植到高版本可能遇到的警告資訊解決方法

Delphi低版本原始碼移植到高版本可能遇到的警告資訊解決方法

先前公司的一個專案因開發時間與專案定位導致結構失衡。在經過前段日子的評估與調查後,從今天開始進行重構。

  也想趁這個機會,將介面的開發由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   花了一下午,終於成功編譯了原有的程式碼。發現的問題大多是字串的型別問題。隨著後續工作的深入,問題會越來越多或者會發現些啥好東東。到時再新增上來。

相關推薦

Delphi版本原始碼移植版本可能遇到的警告資訊解決方法

先前公司的一個專案因開發時間與專案定位導致結構失衡。在經過前段日子的評估與調查後,從今天開始進行重構。   也想趁這個機會,將介面的開發由Delphi 6轉向Delphi 2009。從而逐步放棄Delphi 6這個用了近7年的開發工具。也知道在轉移的過程中會碰到許多問

版本JDK的專案在版本執行報 a jni error has occurred 錯誤解決方法

這個問題確實是由較高版本的JDK編譯的java class檔案試圖在較低版本的JVM上執行產生的錯誤。     1、解決措施就是保證jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,則在命令列中分別輸入java -version和javac -

VMWare版本無法開啟版本建立的虛擬機器解決方案

created by a VMware product that is incompatible with this version of VMware 我使用version 8 的虛擬機器開啟

VS版本工程開啟版本工程方法

由於VS版本比較多,低版本無法直接開啟高版本的工程檔案,通過對工程檔案進行一些修改可以解決這些問題。 通過修改Solution檔案和Project檔案,可以使低版本轉換為高版本。 例如將VS2015工程轉換為VS2010工程。 1.修改解決方案檔案 使用記事本開啟.lsn檔案:

設置版本VDA註冊版本DDC

com log nag ddc img term tex mar 註冊 獲取計算機目錄信息獲取交付組目錄信息更改計算機目錄接受7.8版本的VDI註冊。更改交付組接受7.8版本的VDI註冊。 設置低版本VDA註冊高版本DDC

專案從vs版本升級到版本

如果是單一,無關聯的,無引用庫檔案的話,超級簡單, vs 自動幫你搞定,只要選擇高版本的 vs 開啟原 sln 檔案即可 如果是大型專案,專案中包含了很多的庫檔案,這個就頭大了,要將庫檔案先升級到高版

版本中開啟版本Visual Studio建立的專案檔案

Dr. Ing. 白途思(Begtostudy) 微訊號:Begtostudy QQ:370566617 Email: [email protected] 點選這裡給我發郵件 工作單位:上海航天技術研究院 身份:上海交通大學 工學博士 校內名片

VMware版本無法開啟版本建立的虛擬機器

created by a VMware product that is incompatible with this version of VMware 我使用version 9 的虛擬機器開啟 version 10 的建立的虛擬機器系統 丟擲錯誤資訊: The con

[JIRA] 從版本升級到版本(3.6.2->6.0.8)

前言:JIRA是Atlassian公司出品的專案與事務跟蹤工具,被廣泛應用於缺陷跟蹤、客戶服務、需求收集、流程審批、任務跟蹤、專案跟蹤和敏捷管理等工作領域。公司原來用的是JIRA 3.6.2版本,Atlassian官方已不推薦使用JIRA 4.4之前的版本,之前的版本有漏洞也

如何讓VMware版本執行VMware版本建立的虛擬機器

解決辦法:       以記事本的形式開啟高版本下建立的虛擬機器的.vmx,找到virtualHW.version引數,可以看到虛擬機器是在哪個版本的VMware workstation下建立的,把它改成你所裝低版本的VMware workstation的版本號,例如:由v

版本XCode支援版本iOS真機除錯的實現

雙擊開啟DMG檔案,在出來的資料夾裡面,右鍵點選XCode這個包,點選右鍵選單裡面的“顯示包內容”,然後進行如下操作:把XCode包中的 Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/5.1 (9B

【PB】不求人一招搞定版本PB連線版本SQLServer

實驗物件:PowerBuilder8.0                      Microsoft SQL Server 2005 概要說明:就是通過通用介面ODBC進行連線 首先在PB8.0裡面進入DB PROFILE.. 然後進入ODB ODBC下Utilities

maven打包時出現【java source 1.3中不支援泛型 請使用 -source 5 或更版本以啟用泛型】錯誤時的解決方法

出現【java source 1.3中不支援泛型 請使用 -source 5 或更高版本以啟用泛型】問題的原因是因為jdk版本使用不對,maven編譯打包時找到的是低版本的jdk,可以在總pom中新增以下語句顯示指明使用版本為1.6的jdk即可解決這個問題 <buil

win10更新1809版本後執行Dev-cpp, dos控制檯字元亂碼解決方法

  微軟:請勿安裝windows10 1809版本,有bug會刪除個人檔案 雖然微軟非常利索的在釋出會後及時推送了新的windows10新版本,但自從推送後,諸多問題層出不窮。之前使用者曾表示1809版本windows 10的工作管理員存在CPU使用率錯誤顯示的問題。 不過,可

關於Tomcat版本更換時,安裝不成功的問題解決方法

最近在學習JavaEE程式架構,用到了Tomcat。 使用的Eclipse,沒有Tomcat,我想建立一個本地的伺服器。 在構建過程中,我使用了Tomcat9,但是版本太新了,Eclipse不支援,我只好換回Tomcat8。 Tomcat8 有兩個版本8.0.36和8.5.4。我首先安裝

【Git】先commit後pull由於版本衝突,提交內容看不到的解決方法

已commit,pull版本衝突,push不成功,找到自己commit修改過的。 根據提交記錄,還原版本     git reflog   檢視提交記錄(找到commit版本號)     git reset --hard HEAD版本號   還原到commit版本

Kibana6.x.x 版本下啟動之後出現的一些警告資訊及對其處理

問題1:  log   [08:59:02.297] [warning][security] Generating a random key for xpack.security.encryptionKey. To prevent sessions from being i

centos安裝docker源ubuntu:16.04版本後,無法使用iptables命令原因和解決方法

Dcoker容器在使用的過程中,有的時候是需要使用在容器中使用iptables進行啟動的,預設的docker run時都是以普通方式啟動的,沒有使用iptables的許可權,那麼怎樣才能在容器中使用iptables呢?要如何開啟許可權呢? 那麼在docker進

kali4.9 64位系統2017版本安裝w3af詳細步驟以及遇到的問題解決方法

    眾所周知,w3af作為web站點的掃描利器,但是不知為何在kali 2017版本里面沒有了,所以只能手動安裝。下面是詳細步驟,期間google解決了很多問題,有些問題困擾了好幾天,希望能給以後安裝的小夥伴一些幫助。     首先google搜尋 w3af安裝 然後根

IAR版本不相容導致無法正常開啟工程檔案--解決方法

嵌入式開發/學習過程中,難免需要借鑑別人的工程,但是開發環境的匹配始終是個問題==版本不匹配—無法正常的開啟工程檔案。 一般官方標配的開發環境包括: MDK IAR 這裡描述IAR環境下,如何解決版本相容問題。 IAR版本引起的提示訊息: br