)
簡介Raize_6.1.1.12_DX10_1_Berlin_cocashu修正版是一份針對(duì) Delphi Berlin即 DX10.1環(huán)境的 Raize 組件庫安裝資源重點(diǎn)修正了原版 pas 文件錯(cuò)誤導(dǎo)致的編譯失敗問題。資源面向使用 Delphi 10.1 Berlin 并需要集成 Raize 控件的開發(fā)者也適合需要查看組件源碼或進(jìn)行二次封裝的進(jìn)階用戶。按說明將文件解壓到 C:\Program Files\Raize\ 后執(zhí)行 RC6\Source 目錄下的 !Build_RC6.cmd 即可完成環(huán)境配置作者親測可用。包體共包含 956 個(gè)文件大小約 10.74MB涵蓋 hpp 頭文件、pas 源文件、dcu 預(yù)編譯單元、dfm 窗體布局、bmp 圖像素材以及 dpk/dproj 工程文件和 cmd 構(gòu)建腳本結(jié)構(gòu)清晰便于按需選用。壓縮包內(nèi)還附有安裝說明和預(yù)先調(diào)整好的配置文件能幫助使用者快速避開組件編譯時(shí)的常見坑點(diǎn)。目前已有 330 人學(xué)習(xí)下載適合作為 Delphi Berlin 環(huán)境下 Raize 組件安裝與使用的可靠參考。1. Raize 6.1.1.12 在 Delphi 10.1 Berlin 上裝不上的真正原因版本、順序與路徑拿到 Raize_6.1.1.12_DX10_1_Berlin_cocashu修正版 這份安裝包時(shí)我第一反應(yīng)不是解壓而是先確認(rèn)它對(duì)應(yīng)的是哪個(gè) Delphi 版本。Raize6 的 DX10.1 安裝說明關(guān)鍵詞其實(shí)只有一個(gè)10.1 Berlin。這個(gè)版本寫錯(cuò)一個(gè)數(shù)字組件面板就會(huì)在裝完后一片空白IDE 啟動(dòng)還可能直接彈“Cant load package”。裝 Raize 和裝普通控件不一樣它不是編譯完一個(gè)包就結(jié)束而是運(yùn)行期包、設(shè)計(jì)期包、Library Path 三條線要同時(shí)落位。很多人裝不上真不是包壞了而是把設(shè)計(jì)期包當(dāng)運(yùn)行期包裝或者編譯順序搞反了再不就是路徑里有中文把編譯腳本坑了。這篇筆記就是留給還在 10.1 Berlin 上維護(hù)老項(xiàng)目的開發(fā)者看的照著順序走十分鐘把它裝進(jìn) IDE。2. 安裝前準(zhǔn)備先核對(duì)版本號(hào)再解壓2.1 確認(rèn) IDE 版本、編譯器和包名的對(duì)應(yīng)關(guān)系Delphi 10.1 Berlin 在 IDE 的 About 界面里顯示版本號(hào)為 24.0對(duì)應(yīng)條件編譯指令是 VER240。Raize 6.1.1.12 的 DX10_1 目錄顧名思義就是為 10.1 Berlin 準(zhǔn)備的包文件命名里一般會(huì)體現(xiàn) 10_1少數(shù)使用 24 這個(gè)內(nèi)部代號(hào)。拿到安裝包先不要急著解壓先把目錄名看清楚確認(rèn)不是 DX10_2 或 DX10_3。我曾經(jīng)裝錯(cuò)過一次 10.2 的包IDE 重啟后直接報(bào)二進(jìn)制格式錯(cuò)誤整個(gè)組件面板消失最后只能靠清理注冊項(xiàng)救回來屬于最不值得踩的坑。確認(rèn)版本還有一個(gè)土辦法用記事本打開 .dpk 包文件看頭部引用的編譯器版本指令。如果是 VER240那就是給 10.1 Berlin 用的如果是 VER250 或 VER260那說明這份包是在別的 Delphi 版本下編譯的不要期待它能直接裝進(jìn) 10.1 Berlin。Raize 6.1.1.12 修正版之所以叫修正版通常是在原版基礎(chǔ)上補(bǔ)過編譯順序或高 DPI 下的圖標(biāo)問題它并不改變版本對(duì)應(yīng)關(guān)系。修正版包里一般會(huì)附一個(gè)說明文件安裝前建議先讀一遍。2.2 解壓位置與權(quán)限別放進(jìn) Program FilesRaize 組件包和大多數(shù) Delphi 控件一樣源碼與 .dpk 包文件需要保持路徑穩(wěn)定因?yàn)榫幾g產(chǎn)生的 .dcu 會(huì)寫入包目錄或 Lib 目錄之后 Library Path 引用的是絕對(duì)路徑。一旦解壓到 Program Files 這類系統(tǒng)保護(hù)目錄文件寫入會(huì)被 UAC 攔下編譯時(shí)報(bào)拒絕訪問這是新手最容易遇到的坑而且是那種看起來莫名其妙、實(shí)際原因很簡單的坑。我一般把 Raize 放在 C:\Raize_6.1.1.12 或者 D:\Raize\6.1.1.12路徑里不要帶中文、不要帶空格。帶空格路徑在少數(shù)批處理腳本里會(huì)被截?cái)郔DE 本身能處理但修正版自帶的編譯腳本不一定能處理。解壓后大致是這樣一個(gè)結(jié)構(gòu)目錄 / 文件作用Packages存放 .dpk 包文件運(yùn)行期包與設(shè)計(jì)期包分開命名Lib編譯輸出的 .dcu 和運(yùn)行時(shí) bpl 默認(rèn)落在這里Sources組件源碼 .pas之后 Library Path 需要指向這里Demos示例工程驗(yàn)證階段可以直接打開來測試不同修正版的目錄名可能有細(xì)微差別以包內(nèi)說明為準(zhǔn)。這里補(bǔ)充一條經(jīng)驗(yàn)解壓完先不要打開 Delphi先把目錄整個(gè)移動(dòng)到位因?yàn)橐坏┚幾g過再移動(dòng)整個(gè)目錄之前的 dcu 和 bpl 路徑全部作廢又得重新編譯一遍。2.3 備份現(xiàn)有 IDE 包配置給后悔藥留個(gè)位置裝 Raize 之前我強(qiáng)烈建議先備份當(dāng)前 IDE 的包配置。Delphi 的已安裝包清單不是存在某個(gè)普通配置文件里而是寫在用戶配置目錄的 BDS\24.0 下的 Known IDE Packages 注冊項(xiàng)中。裝新組件包之前打開注冊表編輯器把 BDS\24.0 下和 Packages 相關(guān)的項(xiàng)導(dǎo)出成 .reg 文件保存到磁盤萬一裝壞了可以直接導(dǎo)回去。這個(gè)操作是血淚經(jīng)驗(yàn)換來的。有次我在一個(gè) 10.1 Berlin 環(huán)境里同時(shí)裝了 Raize 兩個(gè)版本IDE 每次啟動(dòng)都彈找不到 bpl組件面板也壞了最后就是靠這份備份導(dǎo)回去才恢復(fù)。備份文件很小幾十 KB但能省下半天排查時(shí)間。導(dǎo)出時(shí)注意把 HKCU 和 HKLM 兩處的 BDS\24.0 都導(dǎo)出不同組件包注冊的位置不完全一樣。2.4 看修正版自帶的批處理腳本在做什么很多修正版會(huì)帶一個(gè) Install.bat 或 Build.bat。不要直接雙擊運(yùn)行先打開看內(nèi)容。我見過的腳本里有些會(huì)先清理當(dāng)前已編譯的 dcu 文件再調(diào)用命令行編譯器重新編譯如果此時(shí) Delphi IDE 正開著并且占用了某些 bpl 文件腳本會(huì)在清理或復(fù)制階段中途失敗報(bào)文件被占用。正確順序是先關(guān)閉 Delphi IDE再單獨(dú)運(yùn)行腳本或者干脆不用腳本完全參照腳本里的編譯順序在 IDE 里手動(dòng)編譯?;煊脙煞N方式是翻車高發(fā)區(qū)腳本編到一半切到 IDE 手動(dòng)編譯經(jīng)常留下編譯一半的 dcu后面裝設(shè)計(jì)期包時(shí)各種報(bào)錯(cuò)都來了。確定走哪條路之后就一條路走到底。3. 編譯與安裝先運(yùn)行期包后設(shè)計(jì)期包3.1 運(yùn)行期包與設(shè)計(jì)期包的分工要先搞清楚Raize 的包文件命名規(guī)則不帶 D 后綴的是運(yùn)行期包負(fù)責(zé)提供組件實(shí)現(xiàn)代碼程序編譯和發(fā)布時(shí)依賴它帶 D 后綴的是設(shè)計(jì)期包負(fù)責(zé)把組件圖標(biāo)注冊到 IDE 的組件面板只在 IDE 里加載。安裝順序因此是固定的先編譯運(yùn)行期包讓 bpl 和 dcu 落地再打開設(shè)計(jì)期包點(diǎn)擊 Install。順序反了設(shè)計(jì)期包找不到運(yùn)行期包里的類編譯時(shí)直接報(bào)找不到 RzButton 之類的引用。如果無法從文件名分辨哪個(gè)是設(shè)計(jì)期包就打開 .dpk 看 Requires 子句。設(shè)計(jì)期包幾乎都會(huì)在 Requires 列表里引用剛剛編譯好的運(yùn)行期包而運(yùn)行期包的 Requires 里只有 VCL 和 RTL 這些 IDE 自帶包。這個(gè)判斷方法對(duì)所有 Delphi 第三方組件通用不只限于 Raize。3.2 在 IDE 里編譯運(yùn)行期包操作按下面四步走關(guān)閉可能占用 bpl 的其他 Delphi 工程打開 Delphi 10.1 Berlin。File Open定位到 Packages 目錄選擇不帶 D 后綴的 .dpk 文件。在 Project Manager 里右鍵該包節(jié)點(diǎn)選擇 Compile。編譯完成后確認(rèn) Messages 窗口沒有 E2003 或類似報(bào)錯(cuò)。編譯前我習(xí)慣先打開 Project Options把輸出目錄指到包目錄下的 Lib 文件夾。這樣做的目的是讓 dcu 位置可控之后配置 Library Path 時(shí)不用寫一堆分散的路徑排查問題也容易。有些修正版默認(rèn)把輸出指到了系統(tǒng) BPL 目錄這種也能用但換機(jī)器遷移時(shí)路徑容易對(duì)不上。編譯成功的標(biāo)志是 Messages 窗口出現(xiàn) Build OK 或 Done 字樣。這一步千萬不要順手點(diǎn) Install運(yùn)行期包沒有 Install 選項(xiàng)強(qiáng)行安裝會(huì)報(bào)“Cannot install a runtime package”到時(shí)候還得回頭查是不是點(diǎn)錯(cuò)了文件。3.3 安裝設(shè)計(jì)期包并檢查組件面板運(yùn)行期包編譯通過后的下一步File Open 打開那個(gè)帶 D 后綴的 .dpk 文件。在 Project Manager 里右鍵包節(jié)點(diǎn)選擇 Install。彈出安裝成功的提示后組件面板應(yīng)該出現(xiàn)一個(gè)名為 Raize 的頁簽頁簽里是一整套 Rz 開頭的組件。如果組件面板沒出現(xiàn) Raize 頁簽先不要急著判定失敗。有時(shí)候要新建或切換一個(gè) Form 才會(huì)刷新組件的顯示有時(shí)候是 IDE 緩存了組件列表重啟 IDE 后頁簽才出現(xiàn)。這就是為什么驗(yàn)證一定要放在最后統(tǒng)一做而不是裝到一半就下結(jié)論。我還遇到過頁簽出現(xiàn)了、組件卻拖不出來的情況這種多半和后面要說的 Library Path 配置有關(guān)。3.4 腳本安裝也是這條路只是自動(dòng)化了決定用批處理腳本安裝的話邏輯和手動(dòng)是一樣的。腳本一般會(huì)依次完成清理舊 dcu、編譯運(yùn)行期包、復(fù)制 bpl 到系統(tǒng)目錄。但腳本很難替你做設(shè)計(jì)期包的 Install 動(dòng)作因?yàn)檫@個(gè)操作依賴 Delphi IDE 的交互環(huán)境批處理無法穩(wěn)定模擬。所以腳本跑完后大概率還是需要手動(dòng)回到 IDE 打開設(shè)計(jì)期包點(diǎn)一次 Install這一步省不了。如果你在 32 位環(huán)境下安裝不要被網(wǎng)上一些“64 位包”的說法干擾。Delphi 10.1 Berlin 的 IDE 本身是 32 位程序組件包也是面向 IDE 加載的不存在 64 位 IDE 安裝包這種東西。出現(xiàn)“64 位”字樣的說明多半指的是運(yùn)行時(shí)庫面向 Win64 目標(biāo)平臺(tái)的編譯支持跟 IDE 安裝沒有關(guān)系。4. 環(huán)境配置Library Path 與運(yùn)行時(shí)包缺一不可4.1 Library Path不加就是 File Not Found安裝完成后新建項(xiàng)目組件面板里能看到組件拖到 Form 上也沒問題但一編譯就報(bào) File not found 或者找不到 dcu這是 Library Path 沒配。設(shè)計(jì)期包的 Installation 只解決 IDE 面板顯示不負(fù)責(zé)給項(xiàng)目編譯提供源碼路徑這是兩個(gè)完全獨(dú)立的配置。打開 Tools Options Delphi Options Library在 Library path 里追加兩個(gè)路徑Raize 的 Sources 目錄和 Lib 目錄中間用分號(hào)分隔。加 Sources 是因?yàn)槟承┙M件在同一工程里既有編譯期源碼引用又有設(shè)計(jì)期表現(xiàn)加 Lib 是為了讓編譯器能找到已經(jīng)編譯好的 .dcu 文件。路徑寫好后點(diǎn)輸入框右側(cè)的省略號(hào)按鈕確認(rèn)路徑真實(shí)存在然后再重啟一次 IDE。這里有個(gè)細(xì)節(jié)容易被忽略Library Path 配置完成后IDE 的代碼補(bǔ)全有時(shí)不會(huì)立刻刷新。重啟 IDE 是最穩(wěn)妥的方式不要省這一步。我見過有人在 Library Path 里寫了一個(gè)不存在的路徑IDE 編譯時(shí)靜默跳過結(jié)果還是報(bào)找不到單元反過來懷疑包沒裝好來回折騰半天。4.2 運(yùn)行時(shí)包的選擇壓進(jìn) exe 還是動(dòng)態(tài)引用Raize 運(yùn)行期包有兩種使用方式。第一種是靜態(tài)鏈接在 Project Options 里不勾選 Use runtime packages組件代碼直接編譯進(jìn) exe部署時(shí)不需要額外帶 bpl 文件。第二種是動(dòng)態(tài)引用勾選 Use runtime packages并在包列表里加入 Raize 對(duì)應(yīng)的 bpl 名稱exe 體積會(huì)小一些但部署時(shí)必須把對(duì)應(yīng) bpl 一起帶上。維護(hù)老項(xiàng)目時(shí)我一般選靜態(tài)鏈接。Raize 的 bpl 依賴 VCL 運(yùn)行時(shí)包如果系統(tǒng)里同時(shí)存在多個(gè)版本或其他組件包的 bpl動(dòng)態(tài)引用場景下經(jīng)常出現(xiàn)啟動(dòng)時(shí)彈找不到 bpl 的錯(cuò)誤而這個(gè)錯(cuò)誤對(duì)話框一閃而過用戶截圖都截不到排查效率極低。靜態(tài)鏈接把一切壓進(jìn) exe部署現(xiàn)場少一個(gè)變量。但如果項(xiàng)目本身已經(jīng)啟用了 runtime packages那就不要為了 Raize 單獨(dú)改成靜態(tài)整個(gè)項(xiàng)目統(tǒng)一用動(dòng)態(tài)最穩(wěn)混用會(huì)在運(yùn)行時(shí)出現(xiàn)類重復(fù)注冊的報(bào)錯(cuò)那個(gè)報(bào)錯(cuò)文本加長都看不懂。順著報(bào)錯(cuò)看下去會(huì)發(fā)現(xiàn)是同一份類被加載了兩次根源就是混用。4.3 版本殘留把舊的 dcu 和 bpl 清干凈再裝老項(xiàng)目之前用過 Raize 5.x這次裝完 6.1.1.12 以后編譯舊代碼報(bào)類型不匹配大概率是舊 dcu 殘留。Delphi 編譯時(shí)對(duì) dcu 的查找順序是 Library Path 優(yōu)先如果舊版 dcu 還躺在某個(gè)目錄里編譯器會(huì)優(yōu)先命中舊文件新裝的和舊的打架報(bào)出來全是類型轉(zhuǎn)換錯(cuò)誤。清理按這個(gè)順序來到 Raize 安裝目錄下搜索 *.dcu 和 *.bpl確認(rèn)沒有舊版本殘留文件。到用戶目錄下 BDS\24.0 對(duì)應(yīng)的 bpl 緩存目錄搜索 Rz*.bpl有就刪除。在 IDE 的 Component Install Packages 里看 Raize 條目是否存在兩個(gè)版本先移除舊版再裝新版。確認(rèn)干凈后重新編譯一次運(yùn)行期包再安裝一次設(shè)計(jì)期包。清理順序不要顛倒。先刪文件、后動(dòng)注冊項(xiàng)否則 IDE 啟動(dòng)時(shí)還會(huì)嘗試加載已經(jīng)被刪掉的包報(bào)錯(cuò)比原來還難看。這一步做完再回去編譯舊項(xiàng)目類型不匹配的報(bào)錯(cuò)通常會(huì)消失。如果還沒消失去工程的搜索路徑里檢查一遍看有沒有單獨(dú)寫死指向舊版 dcu 的路徑那種手動(dòng)加的路徑會(huì)繞過全局 Library Path屬于隱藏雷。5. 安裝排錯(cuò)五個(gè)反復(fù)出現(xiàn)的坑5.1 編譯運(yùn)行期包報(bào) E2003現(xiàn)象點(diǎn) Compile 后 Messages 窗口彈出 E2003行號(hào)指向 Raize 源碼里某個(gè)文件代碼看起來卻沒問題。原因多數(shù)情況是源碼所在路徑里有中文或空格少數(shù)情況是 IDE 緩存了上一個(gè)版本的 dcu導(dǎo)致新舊源碼混編。E2003 這類序號(hào)錯(cuò)誤經(jīng)常被誤判為源碼損壞實(shí)際上源碼好好的是環(huán)境問題。解決把整個(gè) Raize 目錄復(fù)制到一個(gè)純英文、無空格的路徑下重新編譯并在編譯前刪除 Lib 目錄下所有 dcu 文件。這個(gè)動(dòng)作我在不同機(jī)器上做過至少五次每次都能解決。5.2 設(shè)計(jì)期包 Install 按鈕是灰的現(xiàn)象打開帶 D 后綴的 .dpk 后右鍵菜單里的 Install 是禁用狀態(tài)點(diǎn)不下去。原因打開錯(cuò)了包文件某些修正版把運(yùn)行期包的文件名也加了 D 后綴或者當(dāng)前 IDE 里已經(jīng)加載了這個(gè)包重復(fù)加載狀態(tài)下 Install 會(huì)被禁用。解決對(duì)比 Requires 子句確認(rèn)它依賴了剛編譯好的運(yùn)行期包。然后到 Component Install Packages 里搜索 Raize如果已經(jīng)存在就先 Remove 再回來重新 Install。這個(gè)問題最容易發(fā)生在安裝腳本跑過一半之后所以前面強(qiáng)調(diào)安裝方式要二選一。5.3 有 Raize 頁簽但組件是空白的現(xiàn)象IDE 重啟后組件面板出現(xiàn) Raize 頁簽展開后沒有組件圖標(biāo)或者圖標(biāo)是一個(gè)空方塊。原因設(shè)計(jì)期包注冊成功了但包依賴的某個(gè) bpl 不能被 IDE 找到。常見于運(yùn)行期包編譯后沒有復(fù)制到系統(tǒng) BPL 目錄IDE 只加載到了設(shè)計(jì)期包設(shè)計(jì)期包加載過程中找不到依賴組件圖標(biāo)自然出不來。解決把 Lib 目錄下生成的 Rz*.bpl 全部復(fù)制到系統(tǒng) BPL 目錄重啟 IDE。如果是高分屏下圖標(biāo)空白但組件能拖那是 DPI 縮放問題嘗試關(guān)閉 IDE 的 DPI 縮放或者確認(rèn)裝的是修正版里包含高 DPI 修復(fù)的那一份。5.4 舊項(xiàng)目編譯通過但 Form 打開空白現(xiàn)象編譯沒有任何報(bào)錯(cuò)運(yùn)行時(shí)整個(gè) Form 是空白的或者 IDE 設(shè)計(jì)界面提示 Class RzButton not found。原因項(xiàng)目里的 dfm 文件引用的是 Raize 5.x 的類名而 IDE 里只注冊了 6.1.1.12dfm 里舊類名在設(shè)計(jì)期找不到對(duì)應(yīng)的已注冊類。這個(gè)現(xiàn)象在老項(xiàng)目里非常普遍不是 Raize 6 裝壞了是新舊版本的類名變更沒有被同步。解決用記事本打開 Form 的 .dfm 文件檢查 Rz 開頭的對(duì)象類名把舊版類名替換為安裝包里實(shí)際提供的類名。dfm 文件默認(rèn)是文本格式直接查找替換即可如果項(xiàng)目里 dfm 被配置成二進(jìn)制格式先轉(zhuǎn)成文本再處理。替換前記得備份文件這一步相當(dāng)于給舊項(xiàng)目打補(bǔ)丁改錯(cuò)了可以還原。5.5 IDE 啟動(dòng)時(shí)報(bào) Cant load package現(xiàn)象IDE 一啟動(dòng)就彈錯(cuò)誤框提示某個(gè) Rz*.bpl 無法加載附帶類似“%1 is not a valid Win32 application”或“不是有效的 Win32 應(yīng)用程序”的內(nèi)容。原因這個(gè)報(bào)錯(cuò)基本可以斷定包是在其他 Delphi 版本下編譯的。誤裝了其他版本對(duì)應(yīng)編譯的 bpl會(huì)讓 IDE 在啟動(dòng)階段嘗試加載時(shí)就掛掉連進(jìn)入主界面的機(jī)會(huì)都沒有。解決確認(rèn)安裝的是對(duì)應(yīng) 10.1 Berlin 的版本不要混裝 10.2 或更高版本的包。如果已經(jīng)誤裝去 IDE 用戶配置目錄 BDS\24.0 下的已知包注冊項(xiàng)找到對(duì)應(yīng) Rz*.bpl 條目并刪掉然后在安裝目錄里把不匹配的 bpl 也清掉重新編譯運(yùn)行期包后再裝設(shè)計(jì)期包。操作時(shí)先關(guān) IDE改完再啟動(dòng)。這個(gè)問題每次都有人踩原因就是下載時(shí)沒核對(duì)路徑里的 DX10_1 標(biāo)記順手把別的版本也裝進(jìn)去了。6. 裝完怎么驗(yàn)證新建一個(gè) VCL 工程拖上 Rz 組件跑一遍驗(yàn)證不是最后才做而是每次裝完立刻做。裝完 Raize 6.1.1.12 后我固定走四步四步全過才算這套環(huán)境真的能用。第一步新建一個(gè) VCL Forms Application在 Project Options 里確認(rèn) Target Platform 是 32 位 Windows并取消勾選 Use runtime packages避免驗(yàn)證過程混入 bpl 路徑問題。第二步打開組件面板里的 Raize 頁簽依次拖 TRzButton、TRzEdit、TRzMemo 到 Form 上先看頁簽組件是否能正常落位。第三步為按鈕寫一句代碼調(diào)用組件procedure TForm1.RzButton1Click(Sender: TObject); begin // 向 RzMemo 寫入當(dāng)前時(shí)間用來確認(rèn)運(yùn)行期包里的類真的可用 RzMemo1.Lines.Add(FormatDateTime(yyyy-mm-dd hh:nn:ss, Now)); end;這里用了 FormatDateTime屬于 RTL 標(biāo)準(zhǔn)函數(shù)不依賴 Raize真正要驗(yàn)證的是 RzMemo 和 RzButton 這兩個(gè)類是否能正常實(shí)例化、是否能正確響應(yīng)事件。第四步按 F9 編譯運(yùn)行點(diǎn)擊按鈕窗口上的 RzMemo 中出現(xiàn)一行時(shí)間戳說明運(yùn)行期包和編譯鏈都正常。如果 RzMemo 顯示空白優(yōu)先查 Library Path 里兩個(gè)目錄的順序和存在性。順帶提醒驗(yàn)證工程不要直接拿老項(xiàng)目試。老項(xiàng)目里殘留的舊 Raize 引用會(huì)讓驗(yàn)證結(jié)果失真萬一報(bào)錯(cuò)也分不清是新裝環(huán)境的問題還是老項(xiàng)目自身的問題。每次裝完任何 Delphi 控件我都強(qiáng)制自己新建一個(gè)空工程拖一套組件跑一遍確認(rèn)之后再開始真正的遷移。這個(gè)習(xí)慣救過我很多次希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取