:從解壓到皮膚加載)
簡介這是為Delphi 13.1RAD Studio 13.1 Alexandria打造的DevExpress VCL Controls 25.2.7完整控件套件面向需要構(gòu)建現(xiàn)代企業(yè)桌面應(yīng)用的中高級開發(fā)者內(nèi)含超過兩百個原生VCL組件覆蓋高級數(shù)據(jù)網(wǎng)格、樹形列表、圖表、Ribbon、日程管理、PDF導(dǎo)出等高頻業(yè)務(wù)場景可解決高DPI適配、Windows 11風(fēng)格界面、無障礙與多語言支持等落地難題。RAR壓縮包內(nèi)共兩千個文件約四百九十八兆字節(jié)文件以cpp/h/pas源碼、CHM離線幫助、可運行示例工程、PNG設(shè)計資源為主同時包括DFM窗體布局和XML/JSON配置文件便于按模塊閱讀、調(diào)試和二次改造。目前已有111人學(xué)習(xí)下載。隨包提供完整幫助文檔、三十余套皮膚模板、代碼級調(diào)試符號及大量Demo可幫助開發(fā)者快速掌握數(shù)據(jù)網(wǎng)格百萬行加載、皮膚動態(tài)切換、報表導(dǎo)出等關(guān)鍵開發(fā)技巧并與FireDAC等數(shù)據(jù)庫框架無縫協(xié)作組件基于原生Win32實現(xiàn)無外部運行時依賴適合需要升級舊版Delphi項目并接入新版DevExpress能力的團隊。1. 拿到 Delphi 13.1 的 DevExpress VCL Controls 25.2.7先搞清楚你拿到的是什么Delphi 13.1 對應(yīng)的 RAD Studio 版本里裝一套 DevExpress VCL Controls 25.2.7是很多桌面管理系統(tǒng)開發(fā)者的第一反應(yīng)公司買的正版授權(quán)、網(wǎng)上流傳的離線安裝包、或者項目交接時上一任同事留下的 rar 壓縮包解壓之后少說也有兩三個 GB里面全是 dcu、bpl、demo 源碼和一堆看起來莫名其妙的安裝腳本。這套控件解決的是 Delphi 原生 Win32/Win64 應(yīng)用里最瑣碎也最耗時的那部分從登錄界面、TreeView 導(dǎo)航、數(shù)據(jù)表格、報表打印到界面皮膚所有要手工調(diào)半天的東西它基本都替你做好了。這篇筆記寫給三種人剛跳進 Delphi 維護坑、被老板要求三天內(nèi)把老系統(tǒng)界面翻新的新手已經(jīng)在用 DevExpress 但每次升級都要折騰半天編譯順序的老手以及正在評估這個控件包到底值不值得買、值不值得在項目里繼續(xù)投入的技術(shù)負責(zé)人。我不會把安裝文檔復(fù)述一遍而是按我自己實際裝過、用過、踩過坑的順序把這套控件的安裝流程、關(guān)鍵參數(shù)、常見翻車點和驗證方法講清楚。2. 從 rar 到 IDE 里可用的控件安裝前必須理解的三個概念2.1 為什么 DevExpress VCL 用壓縮包分發(fā)而不是一個 setup.exeDevExpress VCL Controls 25.2.7 這類控件包交付形態(tài)幾乎永遠是 rar 或 zip而不是雙擊安裝的 exe。原因是它要同時支持 Delphi 的多個版本、32 位和 64 位編譯、以及 Win32/Win64 兩套輸出路徑如果做成一個 setup.exe安裝程序就得內(nèi)置所有版本的編譯配置體積和出錯概率都會翻倍。所以官方才把編譯好的 dcu/bpl和可重新編譯的 pas 源碼打成一個包讓使用者在自己機器的 Delphi IDE 里執(zhí)行安裝腳本或手動安裝。解壓后你通常能看到 Source、Packages、Library、Demo、ExpressInstall 之類的目錄。Source 里是按控件類別組織的 pas 文件Packages 里是按 Delphi 版本區(qū)分的工程組groupprojLibrary 里是編譯產(chǎn)物 dcu。我自己判斷一個包干不干凈的習(xí)慣是先看 Packages 目錄下有沒有按版本號命名的子目錄——有說明這個包支持多版本共存沒有就要格外小心它會不會污染你現(xiàn)有的 IDE 庫路徑。2.2 版本配套關(guān)系控件包版本和 Delphi 版本必須一一對應(yīng)這是最容易翻車的地方。DevExpress VCL Controls 25.2.7 里的 25.2.7 是控件本身的版本號跟 Delphi 13.1 沒有必然對應(yīng)關(guān)系但編譯出來的 bpl 和 dcu 是和具體 Delphi 版本綁定的。也就是說你拿到的包里雖然可能同時帶著 D12、D13 甚至 DXE 版本的編譯產(chǎn)物但你的 IDE 是 Delphi 13.1就必須選擇對應(yīng) 13.1 的那一份絕不能圖省事直接把看起來最新的 dcu 丟進你的工程。我見過一個典型翻車現(xiàn)場同事把 25.2.7 解壓后直接把 Source 全加進 IDE 的 Library path然后打開原來的工程結(jié)果報一堆 Cannot find unit cxGrid 的錯誤。原因很簡單——他加的 Source 路徑里是跨版本共享的源碼而編譯時 IDE 找到的是上一版本殘留的 dcu版本不匹配導(dǎo)致全部失效。正確做法是只認(rèn)準(zhǔn)一個版本編譯產(chǎn)物所在的路徑讓 IDE 只看到那一份。2.3 安裝策略要么全量編譯要么先跑一次安裝腳本常見的安裝步驟是這樣以 rar 解壓后的根目錄為起點提示安裝前先把殺毒軟件退掉把 Delphi IDE 完全關(guān)閉。原因是 dcu 生成、bpl 注冊的過程會大量寫庫文件實時防護容易誤攔而且 IDE 占用 dcu 文件時編譯會直接失敗。第一步用 WinRAR 或 7-Zip 把 rar 解壓到一個沒有空格和中文的路徑我的習(xí)慣是放D:\DevExpress25。如果你拿到的測拉流不是完整包解壓會報校驗錯誤這時候別硬著頭皮繼續(xù)先確認(rèn)壓縮包完整性。第二步進入 Packages 目錄找對應(yīng)你 Delphi 版本的 groupproj用 IDE 打開。如果包里有安裝腳本常見命名是Install.bat或者MakeAll之類的批處理先讀一下腳本內(nèi)容確認(rèn)它指向的注冊表鍵名是HKEY_CURRENT_USER\Software\Embarcadero\BDS\13.0還是更高版本——這個鍵名定死了你的 IDE 版本搞錯了會導(dǎo)致控件出現(xiàn)在 IDE 里但編譯時找不到。第三步編譯安裝。如果你不想一次編完所有包最小做法是只編譯dxPackages里你實際用到的類別運行時核心cx 開頭的通用控件、數(shù)據(jù)網(wǎng)格dxGrid、樹形列表dxTreeList和皮膚引擎dxSkins。至少這四個類別這時候跑你的登錄界面和數(shù)據(jù)管理界面就夠了其余的報表、圖表、日程安排可以等真正用到再編譯。第四步編譯成功后在 IDE 里打開Component Install Packages把生成的 bpl 逐個 Add確認(rèn)列表里出現(xiàn) DevExpress 開頭的運行時包界面正常啟動這一步才算完成。注意如果編譯過程中報 bpl 缺失或 dcu 沖突先看是不是同一包目錄下混了多個 Delphi 版本的編譯產(chǎn)物多數(shù)情況不是你機器的問題而是路徑指向了舊版本。刪掉 Library 目錄下非當(dāng)前版本的殘留只保留當(dāng)前使用的 dcu重上一次就好。3. 最小可復(fù)現(xiàn)從登錄界面到 TreeView 導(dǎo)航一條龍3.1 先搭出一個能跑起來的登錄界面骨架裝好控件后的第一個寫代碼目標(biāo)我建議不是一上來就啃 cxGrid 的高級功能而是先把整套控件的宿主線程搭起來窗體用 DevExpress 的皮膚、背景用它的標(biāo)題欄、事件循環(huán)用 Delphi 自帶的。這里先繞一個思路DevExpress VCL 控件的使用方式不是拖拽一次完成美化的而是在窗體上放一個TdxSkinController或TcxImageList用一份代碼給整個項目統(tǒng)一安裝皮膚。寫一個最小登錄窗體的骨架示例unit uLoginFrame; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, dxSkinsCore, dxSkinsDefaultPainters, cxGraphics, dxSkinsdxBarPainter, dxSkinVS2013; type TfrmLogin class(TForm) dxSkinController1: TdxSkinController; edtUser: TEdit; edtPass: TEdit; btnLogin: TButton; procedure btnLoginClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmLogin: TfrmLogin; implementation {$R *.dfm} procedure TfrmLogin.btnLoginClick(Sender: TObject); begin // 這一步的核心是讓窗體皮膚生效 dxSkinController1.SkinName : VS2013; // 對賬邏輯在此處可以掛數(shù)據(jù)庫或配置文件 if (edtUser.Text admin) and (edtPass.Text 123456) then begin ModalResult : mrOk; // 登錄成功關(guān)閉窗體 end else MessageBox(Handle, 用戶名或密碼錯誤, 提示, MB_OK); end; end.這個代碼塊的說明dxSkinsCore、dxSkinsDefaultPainters是皮膚引擎的運行單元dxSkinVS2013是你選的具體皮膚文件。dxSkinController1.SkinName在按鈕點擊后才賦值是因為窗體在創(chuàng)建之前皮膚還沒加載完畢如果寫在 FormCreate 里會有偶發(fā)黑屏。這里用了 MessageBox 而不是 DevExpress 的彈窗是為了讓新手分清DevExpress 負責(zé)界面美化業(yè)務(wù)邏輯仍然是你自己的代碼兩種能力是解耦的。3.2 用數(shù)據(jù)庫驅(qū)動 TreeView把菜單和權(quán)限做成可配置的登錄成功后緊接著的問題就是左側(cè) TreeView 從哪來。搜Delphi 通過數(shù)據(jù)庫實現(xiàn) TreeView的人多半是在做權(quán)限管理系統(tǒng)——一邊是用戶、一邊是菜單中間用一張映射表做授權(quán)關(guān)系。DevExpress VCL 里對應(yīng)的控件是TdxTreeView它的數(shù)據(jù)填充方式有兩種一種是綁 DataSource一種是手動 Add 子節(jié)點。做權(quán)限系統(tǒng)我更推薦手動 Add因為每一層的節(jié)點狀態(tài)是否有子節(jié)點、是否可點擊需要和數(shù)據(jù)庫行一一對應(yīng)用數(shù)據(jù)感知控件會綁死你的結(jié)構(gòu)。procedure TfrmMain.LoadModules(const AUserId: string); var SQL: string; qry: TFDQuery; TopNode, ChildNode: TdxTreeViewItem; begin // 用 FireDAC 查用戶可見的一級菜單 SQL : SELECT ModuleID, ModuleName, ParentID FROM Sys_Module WHERE ParentID 0 AND ModuleID IN (SELECT ModuleID FROM Sys_Role_Module WHERE RoleID :UserId) ORDER BY SortNo; qry : TFDQuery.Create(nil); try qry.Connection : FConn; qry.SQL.Text : SQL; qry.ParamByName(UserId).Value : AUserId; qry.Open; dxTreeView1.Items.Clear; while not qry.Eof do begin // 頂點節(jié)點畫像文件列表的主干 TopNode : dxTreeView1.Items.Add(nil, qry.FieldByName(ModuleName).AsString); TopNode.Tag : qry.FieldByName(ModuleID).AsInteger; LoadChildNodes(TopNode, TopNode.Tag); // 遞歸加載子節(jié)點 qry.Next; end; finally qry.Free; end; end;這里要注意一個實踐點用Tag屬性保存數(shù)據(jù)庫主鍵而不是用節(jié)點的 Text 去匹配是因為菜單文本可能是我的工作臺這種中文標(biāo)題改個名字就把邏輯改壞了而Tag是整數(shù)型存取數(shù)據(jù)庫主鍵剛剛好。另外遞歸加載子節(jié)點時我習(xí)慣單獨寫一個函數(shù)而不是嵌套在同一個循環(huán)里否則 SQL 連接會在每次遞歸時重新建立界面就會卡頓。3.3 在 cxGrid 里呈現(xiàn)業(yè)務(wù)數(shù)據(jù)三個必調(diào)的顯示參數(shù)數(shù)據(jù)樹搭好之后右邊主區(qū)域放的就是TcxGrid。DevExpress 的 cxGrid 和 Delphi 自帶的 DBGrid 完全是兩個物種它由 View顯示層和 DataController數(shù)據(jù)控制層組成新手最直接的感知差異是——它默認(rèn)不顯示行號、不自動適應(yīng)列寬、雙擊列頭不排序。如果你直接把 DBGrid 的使用習(xí)慣搬過來會覺得很別扭。這里給出我總結(jié)的三個必調(diào)參數(shù)調(diào)完之后體驗才接近正常人用的表格。第一個是OptionsView.NoDataToDisplayInfo設(shè)為False會顯示No data to display占位提示但如果沒有綁定數(shù)據(jù)源只會顯示一行文字而不是空表格調(diào)試數(shù)據(jù)時很容易誤以為有數(shù)據(jù)。所以調(diào)試時關(guān)掉它上線時打開。第二個是OptionsBehavior.IncSearch打開后鍵盤輸入會自動定位到匹配行對大型數(shù)據(jù)集的本地過濾非常有幫助。第三個是OptionsView.ColumnAutoWidth : True代碼里設(shè)置cxGrid1DBTableView1.OptionsView.ColumnAutoWidth : True;這個參數(shù)的含義是讓所有列寬按網(wǎng)格寬度等比分配它和cxGrid1DBTableView1.Columns[0].Width : 120這種手動設(shè)寬是同時生效的——手動設(shè)了 Width 的列優(yōu)先保持寬度其余列再去瓜分剩余空間。如果你發(fā)現(xiàn)列寬怎么設(shè)都不生效先檢查是不是自己在 FormShow 里改了DataController的字段映射cxGrid 的列寬有時會被字段聲明顯式覆蓋。4. 把 VCL 控件嵌進真實業(yè)務(wù)系統(tǒng)登錄界面、權(quán)限樹、報表的組裝順序4.1 登錄界面到主界面的切換模態(tài)窗體與皮膚加載的時序問題登錄界面寫完后最常見的翻車是登錄成功后主界面一閃而過就退出或者皮膚一會兒有一會兒沒有。原因是很多人在 Application.Initialize 之后、Application.Run 之前把登錄窗體用ShowModal顯示返回 mrOk 后卻沒有重新創(chuàng)建主窗體而 VCL 默認(rèn)的主窗體是第一個出現(xiàn)在 dpr 里的 Form。你得在BeginLogin函數(shù)里鎖定邏輯Login 成功才把 MainForm 設(shè)為 Application.MainFormOnTaskBar否則顯示一個空窗體占位。正確結(jié)構(gòu)是放在 dpr 里控制順序program Main; uses Vcl.Forms, uMain in uMain.pas {frmMain}, uLogin in uLogin.pas {frmLogin}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskBar : True; Application.CreateForm(TfrmLogin, frmLogin); if frmLogin.ShowModal mrOk then begin // 登錄失敗或取消不進入主窗體 Exit; end; Application.CreateForm(TfrmMain, frmMain); Application.Run; end.這段代碼的關(guān)鍵是ShowModal在CreateForm(TfrmMain)之前執(zhí)行這樣登錄窗體的皮膚控制器已經(jīng)加載過皮膚資源主窗體繼承同一份皮膚配置不會有跳閃。如果你把登錄界面放在主窗體里用 PageControl 切換那皮膚加載的時序就跟你無關(guān)了——這是兩種不同的方案不要混用。我自己更偏向獨立登錄窗體因為權(quán)限系統(tǒng)里主窗體的窗體池是按登錄用戶動態(tài)創(chuàng)建的放在 dpr 順序里更好控制。4.2 FastReport VCL 與 DevExpress 的配合報表組件裝在哪個層級搜索熱詞里FastReport VCL和 DevExpress 經(jīng)常一起出現(xiàn)這兩者根本不是競爭而是協(xié)作關(guān)系DevExpress VCL 負責(zé)屏幕上的交互界面FastReport VCL 負責(zé)把同樣的數(shù)據(jù)打印成 PDF/Excel。實際項目中我遇到最多的問題是同事把 FastReport 的 TfrxReport 拖到 DevExpress 皮膚窗體上結(jié)果報表預(yù)覽窗體的皮膚和主界面不一致但預(yù)覽又是 FastReport 自己的窗體不受 dxSkinController 控制。這個問題的解法不是修改 FastReport而是接受兩者皮膚各自獨立這個現(xiàn)實把報表預(yù)覽的視覺風(fēng)格統(tǒng)一交給 FastReport 自己的主題設(shè)置。做法是在項目里保留兩份皮膚配置一份是 DevExpress 的 dxSkinController控制所有 cx/dx 控件另一份是 FastReport 的TfrxReport的PrintSettings里的主題屬性比如frxComponent顏色。若你的報表要從 cxGrid 取數(shù)據(jù)最簡單的方式是用cxGrid1DBTableView1.DataController.DataSource.DataSet獲取當(dāng)前激活的數(shù)據(jù)集再賦給報表的 TfrxDBDataset而不是重新打開一遍數(shù)據(jù)庫。4.3 多線程界面刷新Delphi 主線程與工作線程的邊界登錄界面這種低頻交互還好說一旦你的管理系統(tǒng)要從數(shù)據(jù)庫拉幾萬行數(shù)據(jù)填充 cxGrid就繞不開多線程。Delphi 里 VCL 控件有鐵律只能在主線程里操作。搜索熱詞Delphi 多線程對應(yīng)的坑大多發(fā)生在用 TThread 的Execute里直接訪問 cxGrid 的DataController運行起來一會兒正常一會兒崩潰有時干脆在第 70 行報Invalid pointer operation。正確的做法是讓工作線程只做數(shù)據(jù)獲取把取到的TList或MemoryStream塞進隊列用Synchronize或TThread.Queue回主線程更新界面對應(yīng)的表。DevExpress 的 cxGrid 在這方面比傳統(tǒng) DBGrid 寬容你仍然不能繞開這個約束。我自己的習(xí)慣是所有數(shù)據(jù)讀取用TFDQuery放在線程里把結(jié)果集序列化成TArrayByte傳回主線程再做 UI 綁定這樣既避免線程里開 BDE 或 FireDAC 連接的不穩(wěn)定也不至于讓界面線程卡在查詢上。提示用TThread.Queue而不是Synchronize的原因是Queue 不阻塞調(diào)用線程多個任務(wù)依次在主線程執(zhí)行Synchronize 會等主線程處理完才返回數(shù)據(jù)量大時你的工作線程會倒退連主線程的垃圾回收都被拖住。5. DevExpress VCL 25.2.7 安裝與使用的暗坑排查5.1 安裝時提示無法定位 bpl多半是目錄清理沒做干凈現(xiàn)象編譯工程時報Cannot find dxCore.bpl但 IDE 的 Package 列表里分明已經(jīng)加載了 DevExpress 的包運行時包也注冊了。原因dxCore 是 DevExpress 最底層的運行時包它依賴的庫路徑指向了舊版本的 dcu 目錄。DevExpress 升級后不會自動清掉舊版本的 bpl如果你從 25.1.6 升到 25.2.7舊 bpl 不僅還在系統(tǒng)路徑里而且它們引用的 DLL 版本和新的不匹配Delphi 加載時先認(rèn)路徑后認(rèn)版本舊包被優(yōu)先加載就會報找不到。解決打開 IDE 的Tools Options Environment Options Delphi Options Library把里面和 DevExpress 相關(guān)的所有路徑清掉重新添加 25.2.7 的 Library 目錄。然后Component Install Packages里移除所有 DevExpress 開頭的包關(guān)閉 IDE進入C:\Users\你的用戶名\AppData\Roaming\Embarcadero\BDS\13.0刪掉KnownIDEAssemblies之類的緩存文件如果有再重新打開 IDE 安裝新包。這聽著繁瑣但比在報錯彈窗里猜路徑高效得多。5.2 運行時報 Cannot create fileDCC 臨時目錄的權(quán)限問題現(xiàn)象編譯安裝時一半控件編譯成功一半報Cannot create file C:\Users\...\AppData\Local\Temp\dxGLXY.DCU然后整個編譯中斷。原因Windows 對 AppData 臨時目錄的權(quán)限管理Delphi 編譯時會在這里寫中間文件。如果臨時目錄被系統(tǒng)清理工具或公司安全策略設(shè)置為只讀dccDelphi 編譯器就會創(chuàng)建文件失敗。這種情況多半是殺毒軟件在實時防護里攔住了 bpl 生成流程或者 IT 策略把 IE 均衡目錄的寫權(quán)限收走了。解決不修改系統(tǒng)臨時目錄權(quán)限而是改編譯器的臨時目錄。打開Tools Options Environment Options Delphi Options Compiling把Temporary directory改成一個你自己隨意創(chuàng)建的目錄比如D:\DelphiTemp確保這個目錄有完全控制權(quán)限。改完后重新編譯安裝。5.3 編譯能過但打開窗體閃退皮膚文件未包含到項目里現(xiàn)象工程在別人的電腦上編譯正常拷到你電腦上運行時登錄窗體一顯示就閃退事件日志里沒有任何異常信息。原因DevExpress 的皮膚是作為資源編譯進 bpl 或者獨立文件分發(fā)的如果窗體上拖了TdxSkinController但對應(yīng)皮膚單元未包含在項目里因為 Delphi 的 uses 子句在編譯器優(yōu)化作用下可能被干掉運行時找不到皮膚資源而崩潰。這個現(xiàn)象很像傳統(tǒng) VCL 里忘加{$R *.res}但這里特指 DevExpress 的皮膚在運行時動態(tài)加載。解決在項目的 dpr 文件前部顯式引用皮膚單元例如dxSkinVS2013 in ...dxSkinVS2013.pas或者在主窗體上放一個可見的TdxSkinController并在FormCreate里加一句強制加載皮膚dxSkinController1.SkinName : VS2013。兩者取一不要只依賴設(shè)計器的皮膚選擇器。我仍推薦第二種因為運行時顯式賦值可以配合配置文件做換膚開關(guān)。5.4 cxGrid 數(shù)據(jù)導(dǎo)出為 Excel 失敗版本適配的老?,F(xiàn)象用cxGridExportToXLSX導(dǎo)出幾張表時報錯有時是中文列名亂碼有時是權(quán)限報錯。原因DevExpress 的 cxGrid 導(dǎo)出 Excel 依賴cxExport系列單元而不同版本對這些單元的實現(xiàn)有變化。亂碼多半是因為目標(biāo)格式用了老舊的 XLSBIFF8而這種格式的字符集處理一直有歷史遺留問題權(quán)限報錯是導(dǎo)出組件嘗試調(diào)用 Office COM 接口但本機沒裝對應(yīng)版本的 Excel。解決優(yōu)先用 XLSX 格式避免走 COM。調(diào)cxGridExportToXLSX時用TcxXLSXExport的AddTitle和AddSummary參數(shù)補齊標(biāo)題行導(dǎo)出前先把 cxGrid 的列寬固定一個合理值否則導(dǎo)出的文件打開后列寬全為默認(rèn)寬度。若你的項目里確實需要導(dǎo)出 CSV那就只能自己去拼字符串注意列值里有逗號和換行時要轉(zhuǎn)義別讓導(dǎo)出組件背這個鍋。5.5 為什么卸載控件比安裝更難bpl 殘留的連鎖效應(yīng)現(xiàn)象想從 25.2.7 退回 25.1.6直接把 Packages 目錄刪除然后打開舊工程結(jié)果 IDE 出現(xiàn)幾十個Cannot find unit連 Delphi 自帶的 Vcl 單元都報錯。原因DevExpress 安裝時會把它的 dcu 路徑、bpl 路徑寫進 IDE 的配置文件卸載時這些文件不會自動移除。你刪了控件包但 Library path 里還掛著它IDE 找不到 dcu 就回溯到所有可用路徑最終連 Delphi 自帶庫都受牽連實際是它把自帶庫的優(yōu)先級觸底了。解決先導(dǎo)出當(dāng)前 IDE 配置Tools Options Environment Options Export備份一份然后在Library路徑里一個個刪掉指向 DevExpress 目錄的行再打開Component Install Packages移除所有 DevExpress bpl。最后重啟 IDE 并恢復(fù)你之前的工程這時再用舊包重新安裝。這一步別偷懶我見過太多人直接重裝 IDE白費一上午。6. 把安裝成功變成項目資產(chǎn)驗證控件可用性的三個動作一個控件包裝完不是說編譯通過就是萬事大吉。我會做三件事來確認(rèn)這套環(huán)境可以進生產(chǎn)第一是拿最小工程去驗證皮膚和核心控件能跑第二是檢查運行時包是否已注冊到系統(tǒng) PATH防止部署時缺 dll第三是把控件版本和 Delphi 版本的信息固化進項目的構(gòu)建記錄。驗證皮膚的最快方法新建一個空白 VCL 應(yīng)用放一個TdxSkinController和一個TdxRatingIndicator評分組件運行時把SkinName循環(huán)切一遍觀察窗體和按鈕是否跟隨換膚。這個操作能同時驗證皮膚引擎和基礎(chǔ)組件的運行庫是否完整。至于運行時包打開Component Install Packages看到 DevExpress 的運行時包旁有小圖標(biāo)標(biāo)注版本號再切換一次主窗體皮膚的皮膚列表確認(rèn)里面能列出 VS2013 等主題基本就可以認(rèn)定環(huán)境沒問題。到了這一步你再回頭看那個 rar心里應(yīng)該清楚它分量幾何。DevExpress VCL Controls 不是拿來就能畫出漂亮界面的魔法箱它是一套需要你理解版本配套、安裝時序、皮膚加載機制和高頻參數(shù)的框架。我自己的教訓(xùn)是永遠不要在解壓即用的幻覺下去升級這個控件包每一次升級都按上面的流程把舊路徑清干凈、把最小 demo 跑通再切到真實工程這不是小心而是用血淚換來的規(guī)矩。希望這篇筆記能幫你少走一次我沒能避開的彎路。本文還有配套的精品資源點擊獲取