戰(zhàn))
簡(jiǎn)介Delphi開發(fā)中第三方VCL組件庫(kù)是提升桌面應(yīng)用界面與交互效率的關(guān)鍵。DevExpress VCL作為一套覆蓋網(wǎng)格、下拉聯(lián)動(dòng)、布局容器等常見UI場(chǎng)景的重量級(jí)控件集其Full Source版本不僅提供可編譯的完整源碼還支持深入調(diào)試與二次定制。在RAD Studio 12.3環(huán)境下正確規(guī)劃目錄、配置Library路徑、驗(yàn)證BPL注冊(cè)是避免控件丟失和編譯報(bào)錯(cuò)的基礎(chǔ)。通過(guò)cxGrid、cxLookupComboBox等核心控件開發(fā)者可快速實(shí)現(xiàn)數(shù)據(jù)展示、級(jí)聯(lián)選擇與自適應(yīng)布局滿足進(jìn)銷存、報(bào)表平臺(tái)及工業(yè)上位機(jī)等場(chǎng)景需求。本文從版本兼容性、安裝部署流程、常見問(wèn)題排查到源碼調(diào)試技巧系統(tǒng)梳理了DevExpress VCL 23.2.6在實(shí)際工程中的落地方法幫助開發(fā)者縮短環(huán)境搭建時(shí)間聚焦業(yè)務(wù)功能開發(fā)。 十幾年前我剛開始用Delphi的時(shí)候裝個(gè)第三方控件能折騰整整一天組件面板上多出來(lái)二十多項(xiàng)就算大豐收。現(xiàn)在拿到DevExpress VCL 23.2.6 Full Source這個(gè)包在Delphi 12.3上從解壓到跑通第一個(gè)界面半小時(shí)內(nèi)可以搞定。這不是說(shuō)開發(fā)工具變傻瓜了而是這套流程本身就值得整理清楚。DevExpress VCL對(duì)Delphi開發(fā)者來(lái)說(shuō)算是繞不開的重量級(jí)控件庫(kù)。不管是做桌面數(shù)據(jù)庫(kù)應(yīng)用、進(jìn)銷存系統(tǒng)、報(bào)表平臺(tái)還是工業(yè)上位機(jī)界面它幾乎把你要用到的UI控件都包圓了——網(wǎng)格、樹、下拉框、編輯框、圖表、進(jìn)度條、布局容器、導(dǎo)航面板甚至還有皮膚引擎。這個(gè)標(biāo)題里的Full Source版本意味著你拿到的是一整份可以編譯的VCL組件源碼而不是只有編譯好的運(yùn)行包。對(duì)于做二次開發(fā)、追蹤內(nèi)部實(shí)現(xiàn)、甚至自定義控件行為的人來(lái)說(shuō)價(jià)值完全不同。這篇文章我把整個(gè)內(nèi)容拆成五個(gè)部分來(lái)講先搞清楚Full Source包到底包含什么、和普通安裝包有什么區(qū)別再走一遍在Delphi 12.3上的完整安裝部署流程然后挑幾個(gè)最常用的核心控件做實(shí)戰(zhàn)演示接著把我在迭代過(guò)程中踩過(guò)的常見坑和排查思路整理出來(lái)最后分享一些自己的使用心得。適合剛接觸DevExpress VCL的新手也適合準(zhǔn)備從舊版本遷移到Delphi 12.3、或者需要全面了解這套組件庫(kù)的老手參考。1. 拿到Full Source包之后先搞清楚這幾件事1.1 23.2.6這個(gè)版本號(hào)到底代表什么先說(shuō)版本號(hào)。23.2.6是DevExpress VCL的發(fā)行版本序列它和Delphi自身版本號(hào)沒(méi)有任何綁定關(guān)系。DevExpress每年會(huì)發(fā)布大版本比如23.1、23.2后面的6是補(bǔ)丁更新的序號(hào)23.2.6就是23.2這條產(chǎn)品線上的第六次維護(hù)更新。到2024年中的時(shí)候23.2.x已經(jīng)相當(dāng)穩(wěn)定了我自己用下來(lái)它在Delphi 12系列上的表現(xiàn)比早期版本好很多。這個(gè)版本號(hào)還對(duì)應(yīng)了一套內(nèi)部編譯代號(hào)主要表現(xiàn)為它在源碼目錄結(jié)構(gòu)里的命名規(guī)則。比如你用官方安裝程序裝完之后源碼目錄里會(huì)出現(xiàn)類似DXSources這樣的目錄結(jié)構(gòu)不同組件包按VCL套件拆分。你在delphi安裝目錄下的Library路徑配置里添加的也往往是這個(gè)源碼目錄而不是只看某一個(gè).dpk文件。這里要特別提醒一下DevExpress VCL和DevExpress FMX是兩套不同的產(chǎn)品標(biāo)題里寫的是VCL那它只能用在VCL框架下。Delphi 12.3同時(shí)支持VCL和FMX兩種應(yīng)用框架你要是想給FireMonkey移動(dòng)端或者跨平臺(tái)程序用得另外找FMX對(duì)應(yīng)的控件包不能混著來(lái)。1.2 Full Source版本和普通安裝包的區(qū)別Full Source最直觀的優(yōu)勢(shì)就是你能看到所有控件的源碼。這不是廣告詞是實(shí)實(shí)在在能落地的能力。普通安裝包比如ExpressDLL或者編譯好的運(yùn)行時(shí)BPL通常只包含.dcu、.bpl、.dpl這些編譯產(chǎn)物你可以在IDE里使用控件但如果運(yùn)行到某個(gè)控件的內(nèi)部屬性時(shí)想搞清楚它為什么會(huì)這樣工作會(huì)非常痛苦。而Full Source版本里有完整的.dpk工程文件、.pas源碼、.dfm、.res資源還有Demo項(xiàng)目。在IDE里按F7步進(jìn)調(diào)試能直接進(jìn)入到DevExpress控件的內(nèi)部方法里去這對(duì)排查復(fù)雜交互問(wèn)題幾乎沒(méi)有替代價(jià)值。我自己印象最深的一次是排查cxGrid在特定數(shù)據(jù)量下的內(nèi)存暴漲問(wèn)題。當(dāng)時(shí)普通模式下只能干瞪眼后來(lái)把源碼路徑配置好在DataController的加載循環(huán)里打斷點(diǎn)很快就定位到了是某個(gè)事件里重復(fù)觸發(fā)了Bookmark刷新。沒(méi)有源碼的話這種問(wèn)題基本只能靠猜。另外Full Source版本也是做二次定制的基礎(chǔ)。你完全可以在自己的工程里繼承一個(gè)TcxGrid后代類或者直接改掉DevExpress某個(gè)控件的默認(rèn)行為然后把工程引用改成指向你的定制版本。這在商業(yè)項(xiàng)目中屬于比較敏感的操作但擁有源碼意味著你具備這個(gè)能力而不是完全被廠商鎖死。1.3 版本兼容性DevExpress 23.2.6能不能配Delphi 12.3兼容性問(wèn)題是我拿到包之后第一個(gè)要確認(rèn)的。Delphi 12.3在官方支持列表里DevExpress 23.2.6是明確支持的。怎么確認(rèn)裝完之后在DevExpress官方文檔的Release Notes里查一下Supported RAD Studio Versions表格就行或者直接看.DPK文件命名比如文件名里帶有D12、DX12的標(biāo)識(shí)一般都能對(duì)應(yīng)上Delphi 12系列。不過(guò)要注意如果你本機(jī)裝了多個(gè)Delphi版本比如Delphi 10.4、11.3、12.3共存安裝DevExpress的時(shí)候它會(huì)自動(dòng)檢測(cè)到所有IDE版本選擇安裝目標(biāo)時(shí)最好只勾選當(dāng)前需要的那一個(gè)不要一次全勾上。不然多版本混裝容易在Library路徑、BPL注冊(cè)表登記上出沖突后面IDE啟動(dòng)時(shí)報(bào)一個(gè)找不到xxx.bpl的錯(cuò)誤排查起來(lái)挺煩的。我這里把幾個(gè)關(guān)鍵版本的對(duì)應(yīng)關(guān)系整理成了表格DevExpress VCL版本支持的RAD Studio版本關(guān)鍵注意點(diǎn)23.2.xRAD Studio 10.4、11.x、12.x覆蓋較長(zhǎng)12.3可用22.2.xRAD Studio 10.4、11.x對(duì)12.0支持不完整24.1.x更高版本RAD Studio 12.x為主可能放棄部分舊版IDE判斷邏輯很簡(jiǎn)單版本越新對(duì)老IDE的兼容性越弱但也有例外DevExpress在23.2這條線上一直維護(hù)到很靠后的補(bǔ)丁所以在Delphi 12.3上使用23.2.6反而是最穩(wěn)妥的選擇之一。2. 安裝部署從解壓到IDE里看到控件2.1 目錄規(guī)劃和解壓要點(diǎn)拿到DevExpress.VCL.23.2.6.Full.Source.rar之后第一件事情不是雙擊解壓而是先規(guī)劃安裝目錄。這個(gè)步驟很多人忽視結(jié)果后面配置路徑、升級(jí)版本的時(shí)候到處留垃圾。我個(gè)人建議解壓到一個(gè)獨(dú)立且含版本號(hào)標(biāo)識(shí)的目錄比如D:\Components\DevExpress\VCL\23.2.6。這樣做有兩個(gè)實(shí)際好處第一以后同時(shí)維護(hù)多個(gè)版本時(shí)不會(huì)互相覆蓋第二IDE的Library路徑里只需要維護(hù)一個(gè)指向最新版的入口換版本時(shí)改路徑比重新清理一堆殘留快得多。路徑本身最好不要有中文也不要放在桌面上。Delphi 12.3對(duì)中文路徑的處理比以前好但DevExpress的編譯腳本里有些批處理和資源文件路徑拼接邏輯在非ASCII路徑下偶爾會(huì)出現(xiàn)奇怪的問(wèn)題所以我一直堅(jiān)持全英文路徑省心。解壓的時(shí)候還有一個(gè)小細(xì)節(jié)如果你之前裝過(guò)舊版DevExpress務(wù)必先卸載干凈或者至少把舊版本的BPL、DCP從IDE的Library路徑里移除。我見過(guò)太多人直接覆蓋解壓結(jié)果IDE里同時(shí)存在兩套版本的運(yùn)行時(shí)包編譯時(shí)一會(huì)兒用新包一會(huì)兒用舊包報(bào)錯(cuò)時(shí)完全摸不著頭腦。2.2 用官方安裝程序還是手動(dòng)編譯Full Source包解壓完之后里面通常自帶一個(gè)安裝程序比如DevExpress.VCL.Installer.exe或者一個(gè)Build腳本目錄。如果包里有官方安裝程序我強(qiáng)烈建議優(yōu)先用安裝程序來(lái)裝它自動(dòng)完成編譯、注冊(cè)、路徑配置三個(gè)步驟幾乎不會(huì)出錯(cuò)。安裝程序會(huì)做下面這些事情檢測(cè)本機(jī)已安裝的RAD Studio版本根據(jù)檢測(cè)結(jié)果選擇對(duì)應(yīng)的.deploy腳本或.reg注冊(cè)表配置編譯全部或選定的VCL運(yùn)行時(shí)和設(shè)計(jì)時(shí)包把編譯好的BPL注冊(cè)到IDE的組件面板把源碼目錄和編譯輸出目錄寫到IDE的Library搜索路徑里。如果你不想跑安裝程序也可以手動(dòng)操作流程是用IDE打開源碼目錄下的dxVCL_D12.groupproj注意文件名后綴要和你的Delphi版本匹配右鍵項(xiàng)目組選Build然后逐個(gè)安裝。這個(gè)方式的靈活度更高但耗時(shí)也長(zhǎng)全量編譯一次大概十分鐘起步而且需要你對(duì)Delphi的包管理機(jī)制有一定理解。我個(gè)人推薦的做法是第一次安裝用官方安裝程序全部走默認(rèn)如果中間報(bào)錯(cuò)再去手動(dòng)編譯對(duì)應(yīng)的包排錯(cuò)。這樣效率最高。2.3 配置IDE的Library路徑安裝完成后還有一個(gè)經(jīng)常被忽略但至關(guān)重要的環(huán)節(jié)在Delphi 12.3的Tools Options Delphi Compiler Library里確認(rèn)Library Path已經(jīng)加入了DevExpress的源碼目錄和輸出目錄。很多人在IDE里能看到控件但一編譯自己的項(xiàng)目就報(bào)Unit not found: cxClasses.dcu之類的錯(cuò)誤問(wèn)題十有八九出在這里。Library搜索路徑配置不對(duì)Delphi找不到DevExpress的.dcu文件自然就無(wú)法鏈接。這里有個(gè)判斷方法如果你的工程引用了cxGrid打開工程文件.dpr在uses子句里搜一下如果能看到cxGridCustomTableView、cxGridTableView、cxGridDBTableView這些單元名說(shuō)明源碼路徑被正確引入了。反之IDE會(huì)提示找不到單元。補(bǔ)充一下32位和64位編譯目標(biāo)的輸出目錄是分開的DevExpress安裝程序會(huì)分別配置Win32和Win64的路徑。切換平臺(tái)時(shí)如果發(fā)現(xiàn)控件突然丟失先檢查當(dāng)前平臺(tái)的Library配置里有沒(méi)有對(duì)應(yīng)的輸出目錄。2.4 驗(yàn)證安裝是否成功裝完以后不要急著寫代碼先做兩個(gè)快速驗(yàn)證。第一個(gè)驗(yàn)證新建一個(gè)VCL Application打開組件面板找到標(biāo)有DevExpress的選項(xiàng)卡確認(rèn)cxGrid、cxLookupComboBox、cxButton、dxLayoutControl這些常用組件都有圖標(biāo)。隨便拖一個(gè)cxGrid到窗體上能正常顯示就說(shuō)明設(shè)計(jì)時(shí)包沒(méi)壞。第二個(gè)驗(yàn)證運(yùn)行一下這個(gè)空窗體確認(rèn)運(yùn)行時(shí)沒(méi)有彈“找不到xxx.bpl”的窗口。編譯是通過(guò)了但運(yùn)行類程序時(shí)需要加載對(duì)應(yīng)的設(shè)計(jì)時(shí)、運(yùn)行時(shí)BPL如果BPL缺失啟動(dòng)時(shí)會(huì)直接報(bào)錯(cuò)而且報(bào)錯(cuò)信息往往比較隱晦。提示如果運(yùn)行時(shí)空窗體報(bào)錯(cuò)找不到cxLibrary.bpl、dxThemeManager.bpl之類的運(yùn)行時(shí)包基本就是Library路徑或者BPL注冊(cè)表登記的問(wèn)題。不要慌張回第2.3節(jié)檢查L(zhǎng)ibrary路徑然后到IDE的Component Install Packages里確認(rèn)DevExpress相關(guān)的包列表都是勾選狀態(tài)。3. 幾個(gè)繞不開的核心控件實(shí)戰(zhàn)3.1 cxGrid網(wǎng)格控件的三行配置cxGrid是DevExpress VCL里使用率最高的控件沒(méi)有之一。它以一個(gè)網(wǎng)格容器TcxGrid加上若干層View比如TcxGridDBTableView的形式存在和普通DataSource配合來(lái)展示數(shù)據(jù)。很多人第一次接觸時(shí)覺得它層級(jí)多、屬性復(fù)雜實(shí)際上只要抓住幾條主線它就很好用。第一步在窗體上放TcxGrid和一個(gè)TDataSourceDataSource連上你的數(shù)據(jù)集比如TFDQuery、ADOQuery或者ClientDataSet。然后選中cxGrid右鍵選擇Create View選DB Table View生成一個(gè)表格視圖。第二步配置TableView和DataSource的關(guān)聯(lián)procedure TForm1.FormCreate(Sender: TObject); begin cxGrid1DBTableView1.DataController.DataSource : DataSource1; cxGrid1DBTableView1.OptionsView.ColumnAutoWidth : True; cxGrid1DBTableView1.OptionsSelection.MultiSelect : True; end;這里面DataController.DataSource是核心關(guān)聯(lián)點(diǎn)ColumnAutoWidth讓列寬自動(dòng)撐滿網(wǎng)格備選項(xiàng)按需開啟即可。第三步通過(guò)Columns編輯器添加字段列。右鍵點(diǎn)擊TableView選擇Columns Editor點(diǎn)Add然后綁定DataBinding.FieldName為對(duì)應(yīng)字段名。字段類型、下拉編輯器、排序規(guī)則都可以在這里配置。如果你從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)比如在Delphi里寫一個(gè)SELECT語(yǔ)句配合TFDQuery加載訂單數(shù)據(jù)cxGrid立刻就能顯示出來(lái)with FDQuery1 do begin Close; SQL.Text : SELECT * FROM orders WHERE order_date BETWEEN :d1 AND :d2; ParamByName(d1).AsDateTime : Date; ParamByName(d2).AsDateTime : Date 7; Open; end;cxGrid對(duì)這類數(shù)據(jù)集沒(méi)有特殊要求只要DataSource有數(shù)據(jù)它就負(fù)責(zé)渲染、排序、過(guò)濾、分組。代碼量極低回報(bào)很高。我踩過(guò)的一個(gè)小坑默認(rèn)情況下cxGrid的列會(huì)在數(shù)據(jù)源結(jié)構(gòu)變化時(shí)自動(dòng)恢復(fù)默認(rèn)布局如果你的項(xiàng)目需要記住用戶的列寬和排序方式記得把TableView的OptionsCustomize.ColumnHiding和OptionsCustomize.ColumnsQuickCustomization打開再配合LayoutHelper或者自己存注冊(cè)表來(lái)實(shí)現(xiàn)布局持久化。3.2 cxLookupComboBox下拉聯(lián)動(dòng)cxLookupComboBox是另一個(gè)高頻組件它在普通下拉框的基礎(chǔ)上增加了數(shù)據(jù)綁定能力。常見的場(chǎng)景是選擇某一個(gè)分類后另一個(gè)下拉框自動(dòng)顯示該分類下的子項(xiàng)目。核心屬性是Properties.ListSource、Properties.ListFieldNames和Properties.KeyFieldNames。比如我要做一個(gè)“先選省份再選城市”的聯(lián)動(dòng)下拉先在窗體上放兩個(gè)cxLookupComboBox都指定好各自的ListSource比如qryProvince和qryCity。省份下拉不需要聯(lián)動(dòng)直接綁定即可城市下拉需要在省份的EditValue改變事件里動(dòng)態(tài)過(guò)濾數(shù)據(jù)集procedure TForm1.cxLookupComboBox1PropertiesEditValueChanged(Sender: TObject); begin qryCity.Close; qryCity.SQL.Text : SELECT * FROM city WHERE province_id :pid; qryCity.ParamByName(pid).AsInteger : VarAsType(cxLookupComboBox1.EditValue, varInteger); qryCity.Open; cxLookupComboBox2.Properties.ListSource.DataSet : qryCity; cxLookupComboBox2.Properties.KeyFieldNames : city_id; cxLookupComboBox2.Properties.ListFieldNames : city_name; end;有一個(gè)細(xì)節(jié)要注意EditValue的類型可能是variant直接轉(zhuǎn)Integer前最好用VarIsNull判斷一下避免未選擇時(shí)觸發(fā)一次空值過(guò)濾把數(shù)據(jù)集給刷空。這個(gè)問(wèn)題在聯(lián)動(dòng)的第二級(jí)、第三級(jí)下拉里最常見處理方式就是加一個(gè)空值攔截。下拉控件還有一點(diǎn)實(shí)用技巧Properties.DropDownListStyle設(shè)為lsEditFixedList時(shí)用戶只能從列表里選不能自己打字如果允許模糊搜索可以把Properties.IncrementalFiltering打開實(shí)時(shí)過(guò)濾候選列表體驗(yàn)直接上一個(gè)檔次。3.3 布局與間距調(diào)整dxLayoutControl的使用DevExpress布局容器在正式項(xiàng)目中幾乎必用。相比裸用Panel和Anchor屬性dxLayoutControl能幫你自動(dòng)處理子控件之間的間距、對(duì)齊方式以及縮放行為尤其適合做單據(jù)錄入界面、參數(shù)配置界面。比如一個(gè)表格布局左邊一列是Label右邊是輸入框放一個(gè)TdxLayoutControl到窗體上在控件上右鍵選擇Add Item添加一個(gè)LayoutItem把LayoutItem的Caption設(shè)為“客戶名稱”再把一個(gè)TcxTextEdit拖到這個(gè)Item內(nèi)部讓Item作為容器承載它復(fù)制出多行類似Item設(shè)置每行Item的AlignHorz為ahClientLayoutControl會(huì)自動(dòng)把控件拉伸到可用寬度。間距調(diào)整是另一個(gè)高頻需求。很多人在Delphi群里問(wèn)“子控件間距怎么調(diào)”其實(shí)在dxLayoutControl里就兩個(gè)關(guān)鍵屬性O(shè)ptionsItem.SpacingHorz和OptionsItem.SpacingVert。前者控制水平間距后者控制垂直間距單位都是像素。想讓某一行和其他行拉開距離在對(duì)應(yīng)Item的OptionsItem里單獨(dú)改SpacingVert即可。實(shí)際項(xiàng)目里我習(xí)慣把Container的中間區(qū)域都交給LayoutControl只在最外層留一個(gè)主Panel負(fù)責(zé)整體縮放。這樣不管用戶把窗口拉伸到全屏還是縮成一個(gè)窄條控件之間都不會(huì)互相壓疊或留出大片空白。3.4 圖片顯示與局部放大熱詞里有人搜“picturebox控件局部放大”在數(shù)據(jù)化管理類軟件里這其實(shí)是個(gè)很常見的需求商品圖片預(yù)覽、圖紙瀏覽、監(jiān)控截圖回放。DevExpress里對(duì)應(yīng)的是TcxImage基礎(chǔ)用法是設(shè)置圖片和縮放模式cxImage1.Properties.Stretch : True; cxImage1.Properties.Proportional : True; cxImage1.Properties.FitMode : ifmFit;Proportional為True時(shí)圖片會(huì)保持寬高比不會(huì)變形FitMode有三個(gè)關(guān)鍵值ifmFit整體顯示在控件內(nèi)、ifmStretch拉伸填滿、ifmNoScale按原始大小顯示。我這里推薦默認(rèn)用ifmFit它既能看全圖又不會(huì)變形。局部放大比整體縮放復(fù)雜一點(diǎn)我的做法是在鼠標(biāo)移動(dòng)事件里實(shí)時(shí)計(jì)算放大區(qū)域然后借助一個(gè)TForm或者TdxCameraControl之類的輔助元素來(lái)顯示細(xì)節(jié)。如果只是想在同一個(gè)控件上畫出放大選框可以用Canvas直接畫矩形procedure TForm1.cxImage1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin cxImage1.Canvas.DrawFocusRect(Rect(X - 30, Y - 30, X 30, Y 30)); end;這只是畫一個(gè)矩形框真正的局部放大要在MouseMove里源圖對(duì)應(yīng)區(qū)域做二次繪制。一個(gè)簡(jiǎn)潔方案是源圖保存在一個(gè)TBitmap里鼠標(biāo)移動(dòng)時(shí)用StretchBlt把源圖的對(duì)應(yīng)區(qū)域放大到某個(gè)TPaintBox上。這套邏輯寫起來(lái)不算復(fù)雜但需要注意坐標(biāo)換算特別是控件有縮放、圖片不是原始大小時(shí)計(jì)算坐標(biāo)時(shí)要拿圖片實(shí)際尺寸和顯示尺寸做比例換算。4. 日常開發(fā)中最容易踩的坑4.1 控件丟失、IDE里找不到DevExpress選項(xiàng)卡這個(gè)問(wèn)題在熱詞里反復(fù)出現(xiàn)現(xiàn)象是每次重新打開Delphi組件面板上的DevExpress選項(xiàng)菜單不在了或者拖到窗體上的控件直接報(bào)錯(cuò)。我遇到過(guò)不下十次原因基本可以歸納成三類。第一類BPL版本和IDE版本不匹配。你安裝了針對(duì)Delphi 11的DevExpress包然后在Delphi 12.3里打開組件面板注冊(cè)表里登記的BPL還是舊版本IDE加載時(shí)要么忽略要么直接崩潰。解決辦法是重裝對(duì)應(yīng)版本的安裝包不要手動(dòng)拷貝BPL。第二類運(yùn)行時(shí)包依賴缺失。DevExpress控件運(yùn)行依賴若干個(gè)基礎(chǔ)運(yùn)行時(shí)包比如cxLibrary.bpl、dxCore.bpl如果這些包缺失或版本舊IDE啟動(dòng)時(shí)也會(huì)把整個(gè)DevExpress選項(xiàng)卡拿掉。檢查方式是看看Component Install Packages頁(yè)面里有沒(méi)有條目顯示為“未安裝”或“加載失敗”。第三類路徑配置被清理。新裝了其他第三方控件后某些安裝程序會(huì)重寫Library路徑把DevExpress的搜索路徑給擠掉了。處理方式很簡(jiǎn)單回第2.3節(jié)重新補(bǔ)上即可。4.2 編譯報(bào)錯(cuò)和路徑?jīng)_突常見報(bào)錯(cuò)有很多種這里挑三個(gè)出現(xiàn)頻率最高的。一是“File not found: cxClasses.dcu”。這是Library路徑?jīng)]配上或者路徑里指向了舊版本源碼目錄。檢查當(dāng)前平臺(tái)Win32/Win64的Library路徑是否正確。二是“F2046: File not found: dxBar.dcu”。這個(gè)一般是在工程里引用了某個(gè)DevExpress單元但該單元對(duì)應(yīng)的源碼目錄不在搜索路徑里。解決辦法是把DevExpress源碼根目錄和Output目錄都加進(jìn)Library路徑或者把缺失的具體目錄補(bǔ)上。三是“E2201: This implementation file cannot be compiled with the current compiler”。這個(gè)在手動(dòng)編譯源碼包時(shí)偶爾出現(xiàn)多半是版本對(duì)應(yīng)關(guān)系不對(duì)比如用編譯Delphi 12的.dpk文件時(shí)IDE里卻切換到Delphi 11的編譯器。熱詞里“delphi 控件版本問(wèn)題導(dǎo)致每次進(jìn)入ide都丟失控件需要重新放置”這個(gè)場(chǎng)景本質(zhì)上是設(shè)計(jì)時(shí)包注冊(cè)失敗或運(yùn)行時(shí)包加載失敗和上面第一類原因高度重合。我建議把IDE面板里的包檢查一遍確保所有DevExpress相關(guān)包都是勾選狀態(tài)然后重啟IDE。如果還不行就直接卸載重裝DevExpress比手動(dòng)修復(fù)注冊(cè)表快得多。4.3 升級(jí)和卸載注意事項(xiàng)DevExpress Full Source的升級(jí)路徑比較特殊。從23.2.5升到23.2.6最穩(wěn)妥的方式是卸載舊版本清理干凈再安裝新版本。不要想著在原目錄上覆蓋解壓因?yàn)樵创a文件的增減、工程結(jié)構(gòu)的調(diào)整都可能導(dǎo)致一個(gè)以前編譯過(guò)的.dcu文件殘留繼續(xù)污染新版本的編譯。卸載時(shí)要做的三件事第一在控制面板卸載DevExpress相關(guān)程序第二刪除IDE的Library路徑里舊版本的源碼和輸出目錄引用第三檢查Delphi根目錄下的BPL、DCP目錄把名字帶DevExpress或dx開頭的舊文件清掉前提是確認(rèn)沒(méi)有其他工程還在引用舊包。這幾個(gè)步驟不能省。我見過(guò)有人只是簡(jiǎn)單卸載后裝了新版本結(jié)果IDE啟動(dòng)時(shí)同時(shí)加載了舊版dxBar.bpl和新版cxGrid.dcu編譯期碰運(yùn)氣運(yùn)行期直接崩。根源就是卸載不徹底殘留的舊BPL和新版本設(shè)計(jì)時(shí)包沖突。4.4 調(diào)試與斷點(diǎn)進(jìn)入源碼的技巧如果你裝的是Full Source不利用源碼調(diào)試能力就太虧了。在Delphi 12.3里進(jìn)入DevExpress源碼調(diào)試需要兩個(gè)前提條件。第一個(gè)Library路徑里必須包含DevExpress源碼目錄這樣編譯器拿到的是源碼路徑而不是純.dcu地址否則調(diào)試器按F7會(huì)直接跳出說(shuō)你沒(méi)有這個(gè)單元的源碼。第二個(gè)禁用對(duì)應(yīng)的運(yùn)行時(shí)包調(diào)試優(yōu)化。在Project Options Runtime Packages里如果你把控件打包為BPL運(yùn)行時(shí)是不會(huì)進(jìn)入源碼的。臨時(shí)調(diào)試可以取消勾選對(duì)應(yīng)包的Build with runtime packages或者干脆把整個(gè)工程改為靜態(tài)鏈接模式源碼調(diào)試會(huì)更流暢。注意靜態(tài)鏈接模式下編譯出的exe會(huì)變大幾十MB正式發(fā)布時(shí)一般建議回到運(yùn)行時(shí)包模式減小體積。調(diào)試和發(fā)布分開處理這個(gè)習(xí)慣很重要。5. 我的一些使用體會(huì)說(shuō)實(shí)話DevExpress VCL這套控件庫(kù)的功能量級(jí)很大文檔也厚得嚇人。我最初接觸的時(shí)候也走過(guò)彎路一上來(lái)就想把每個(gè)控件都摸清楚結(jié)果花了很多時(shí)間卻什么都沒(méi)吃透。后來(lái)形成的做法是先掌握cxGrid、cxLookupComboBox、cxButton、dxLayoutControl這幾個(gè)主力控件拿它們把常見的業(yè)務(wù)界面搭出來(lái)然后再根據(jù)項(xiàng)目需要逐個(gè)突破其他高級(jí)能力比如圖表、報(bào)表、皮膚切換。另外一個(gè)很實(shí)際的經(jīng)驗(yàn)是Full Source版本在調(diào)試階段價(jià)值巨大但不要輕易去改源碼目錄里的內(nèi)容。你改掉某個(gè).pas文件后重新Build雖然能通過(guò)但這個(gè)改動(dòng)是局部的一旦以后升級(jí)版本這個(gè)修改就被覆蓋掉了而且你很可能已經(jīng)忘了自己改過(guò)什么。如果確實(shí)需要自定義最好繼承一個(gè)子類或者在項(xiàng)目代碼里通過(guò)事件和屬性級(jí)別去實(shí)現(xiàn)把改動(dòng)范圍控制在業(yè)務(wù)層。當(dāng)前這個(gè)版本我在一個(gè)中型進(jìn)銷存項(xiàng)目里跑了幾個(gè)月編譯出的32位程序、64位程序都穩(wěn)定運(yùn)行界面加載速度、數(shù)據(jù)量上萬(wàn)行的網(wǎng)格操作流暢度都在可接受范圍內(nèi)。內(nèi)存泄漏、異常崩潰這類問(wèn)題沒(méi)有出現(xiàn)過(guò)。對(duì)于希望穩(wěn)定、可控、界面又想要現(xiàn)代感的桌面應(yīng)用開發(fā)場(chǎng)景Delphi 12.3加DevExpress VCL 23.2.6 Full Source這套組合值得認(rèn)真考慮。本文還有配套的精品資源點(diǎn)擊獲取