簡體   English   中英

將項目從Delphi 3移至Delphi 2010

[英]Move project from Delphi 3 to Delphi 2010

我被要求重新開放我在1998/99在Delphi 3中編寫的一個項目,從那時起它一直運行穩定。 我有一個老舊的Windows 98機器上的Delphi 3代碼庫,它只是為了讓這個項目保持活力。 顯然,在進行任何重大修改之前,我想將源代碼庫帶入21世紀。

我很高興地注意到Delphi 2010(我目前在2007年)聲稱能夠從Delphi 2導入項目。 有沒有人有從Delphi 3導入大型項目的經驗? 我可以期待這是一個簡單的過渡,還是一個困難的過渡?

此外,原始項目使用第三方組件,包括DBISAM,WPTools和TMS Planner。 我注意到所有這些仍然可用於最新版本的Delphi。 假設我首先將新版本安裝到Delphi 2010中,我是否可以期望我的應用程序中使用這些組件的部分也被翻譯? 我知道至少WPTools已經改變了它的一些組件結構和接口,因為原始應用程序中使用的版本顯然我會有一些重新編碼去做,但程序的那些部分的失敗會阻止我的代碼庫正在升級?

應該很有可能進行這種遷移,並且根據代碼的編寫方式,它可能是痛苦的,也可能是無痛的。 不幸的是,在開始遷移過程之前,不容易說出哪些內容。

我要做的第一件事是確保所有DFM文件都轉換為它們的文本表示。 我相信這在Delphi的后續版本中設置為默認值,但我記得Delphi 3使用的是二進制格式。 在delphi 3 bin目錄中應該有一個名為DFMConvert的實用程序文件,它允許您將DFM轉換為文本。 您希望這樣做的原因是,如果由於組件未加載而必須手動編輯DFM,則可以確保您可以閱讀源代碼。 您不僅會跳轉Delphi的版本,而且還會跳過您使用的每個組件的版本,並且可能存在一些可能導致組件加載失敗的不兼容性。 我發現如果是這種情況並且您有一個“新”版本,那么直接使用編輯DFM源並將測試表單與其上的組件與舊版本包含的內容進行比較。 刪除任何不合適的(或重命名),然后嘗試再次加載表單。

正如Frabricio所提到的,如果您使用變體,那么您需要對您的使用條款進行微調。

好消息是,一旦你更正了components / uses子句,你的代碼本身應該可以正常工作。 如果你直接進入Delphi 2010,你唯一的另一個問題就是Unicode,並且編譯器通過錯誤和警告將所有這些問題都指向了你。

正如你有D2007並假設所有這些組件集都帶有D2007 dcus,我建議你先嘗試在D2007上重新打開代碼庫。 然后,轉到D2010,因為實際VCL的Unicode功能 - 這可能會產生一些遷移問題(我不會在這里討論,因為它在網上和SO上都有深入的討論)。

我會說,因為在D5和D7之間的某個地方(沒有准確記錄)發生了rtl的單元重組(創建了Variants.pas單元和許多OTAPI單元更改了名稱等)。 這就是你出現第一個問題的地方。 編輯:不僅Variants被重新定位,而且還有很多IDE集成 - 以避免未經許可的代碼被部署。 如果您有一些OTAPI代碼(例如,允許在繼承表單上發布屬性的代碼),則需要將其重定位到包項目中。

正如skramradt所說,你可能不得不處理二進制DFM的事情....

之后,如果一切正常,請轉到Unicode。 根據應用程序的不同,它可以很容易也可以不容易。 對於我的,不是很煩惱。 但我知道還有其他人面臨比我更大的問題。

以下是我們關於升級到Delphi 2010的一些注意事項

  1. Delphi2010中編譯的可執行文件大約是Delphi3編譯的字節數的3倍。
  2. 任何編譯都會比Delphi3產生更多警告和提示。 好的做法是刪除所有提示和警告。
  3. 我發現幾個損壞的Pascal文件在Delphi3中編譯得很好但在Delphi2010中沒編譯。 在視覺上看來沒有問題或區別。 但編譯錯誤清楚地表明錯誤的行號錯誤。 在我的例子中,問題與CR / LF有關,在我的Delphi中只有一個CR。 要解決的難題和實時浪費。 但是,可以在記事本中或使用WinHex.exe查看文本。 我編寫了一個名為PARSER.EXE的程序,它允許識別這些控制字符。 一旦知道控制字符的位置,這是在記事本中編輯這些文件的最佳方法。
  4. AnsiString類型。 Delphi 2010現在使用AnsiStrings,MBCS和WideStrings(UniCode)。 與使用ASCII字符串的Delphi 3相反。 標准的Delphi 2010實現使用字符串作為Unicode和字符作為16位字符。 現在有必要確保將許多8位ASCII字符串定義為AnsiStrings。 顯然,使用PChars定義接口的舊dll現在需要PAnsiChar。
  5. 由於以下原因,代碼在Delphi平台之間不可互換
  6. Delphi 2010具有額外的功能和變量類型,如AnsiChar,AnsiStrings。
  7. 這些表單在版本之間不兼容,因為后面的Delphi版本具有額外的屬性。
  8. dcus在版本之間不兼容。
  9. 軟件包在版本之間不兼容。 Delphi 2010中沒有Crystal Reports,因此您可能需要單獨購買。 使用的任何其他軟件包也可能需要升級,但需要付費。
  10. 許多函數,如Readfile,Writefile,GettickCount現在堅持將參數作為DWORD,而Delphi3則更寬容。 其中一些功能與更高的磁盤容量相關聯。
  11. 彈出菜單。 這些有一個名為AUTOHOTKEY的新屬性。 這應該設置為手動。 如果將其設置為默認值,則標題將插入“&”以提供熱鍵功能。
  12. 光標。 使用游標的方法已經改變。
  13. 似乎Delphi2010具有更多的功能,這些功能的添加是為了使其更易於使用。 可能Delphi 3有一個更好,更容易使用的界面。
  14. 救命。 也許比Delphi 3更好。但似乎消失了幾分鍾試圖找到幫助信息。 互動幫助是一件麻煩事。
  15. BorlandMM.dll在使用Delphi 2010應用程序的Windows 2000上不起作用。 因此,如果要使用此dll,則可能需要升級大量PC。

我有大約100個應用程序dll和COM服務器進行升級。 可能大約12周的調試工作。 希望這可以幫助。

為了讓您放心,我最近將我正在開發的軟件從Delphi 4轉換為Delphi 2009以獲得Unicode功能,我遇到了很多問題,但它們都可以在幾周內解決。

有一點需要注意:如果您使用任何第三方軟件包,請確保它們具有Delphi 2010版本,您可以在轉換之前升級到該版本。 Delphi 2009可以,但我不會嘗試在D2010中使用舊版軟件包。

關於將D3遷移到D2010,我不能說太多,但我最近成功地將D6遷移到了D2010。 首先,我所做的是確保您在D3中使用的所有第三方組件也可在D2010中使用。 從D6到D2010重新編譯任何自定義構建的組件。 加載我的D6源代碼,並編譯。 處理所有unicode問題。 一個接一個地處理所有編譯器錯誤...所有在大約3天內完成(大約30000行代碼)

我確認其他人在說什么:就你自己的代碼而言,將D3應用程序轉換為D2010通常很容易。

我看到兩個困難:

  1. 您使用String作為通用緩沖區,存儲除字符之外的其他內容。
  2. 您的代碼假設sizeof(char)為1,即使用SizeOf()時使用Length()或反之。

最困難的部分是第三方組件。

看起來您正在使用的所有組件仍然存在於D2010,這是一個好點。 但它們的界面很可能已經改變,當然還需要進行一些代碼更改。

我有一個Delphi 7項目組,Delphi 2010很快就升級了。 不幸的是,在下一次開始使用新創建的Delphi 2010項目組文件時,IDE在加載項目后崩潰並消失。 沒有顯示異常,沒有錯誤消息。 我的解決方法是一直使用Delphi 7文件,讓Delphi 2010升級它喜歡的任何東西,而不使用新創建的項目文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM