戰(zhàn):TDBGridEh表格增強(qiáng)與避坑指南)
簡介面向 Delphi 12.3 開發(fā)者的 Ehlib 控件資源包內(nèi)容覆蓋常用網(wǎng)格、編輯框、按鈕等增強(qiáng)型界面組件能幫助桌面應(yīng)用開發(fā)者快速集成高級表格與數(shù)據(jù)處理功能適合中高級 Delphi 程序員在項(xiàng)目研發(fā)或控件學(xué)習(xí)時使用。壓縮包共含 2000 個文件其中 470 個 dfm 窗體文件負(fù)責(zé)界面布局469 個 pas 單元源碼提供核心邏輯245 個 res 資源文件保存圖標(biāo)與配置另有 189 個 dproj 和 170 個 dpk 工程/包文件支持在 RAD Studio 中直接打開編譯同時包含 chm 幫助文檔、示例工程及少量數(shù)據(jù)庫文件覆蓋從設(shè)計到發(fā)布的完整鏈路。整體僅 32.7MB體積小巧但結(jié)構(gòu)清晰便于移植和快速集成。當(dāng)前已有 60 人學(xué)習(xí)下載。資源內(nèi)含 Ehlib 組件源碼、窗體定義、可編譯工程、官方 chm 幫助及配套示例預(yù)覽中還能看到教程素材與圖標(biāo)資源對照幫助與示例代碼可快速掌握屬性配置、事件處理與界面擴(kuò)展方法減少自行摸索時間對需要提升 Delphi 開發(fā)效率的用戶尤為實(shí)用。1. 一個RAR包解決Delphi 12.3數(shù)據(jù)庫表格的最后一公里拿到“Delphi 12.3控件之Ehlib 111015.rar”這個包先說結(jié)論這是一套為Delphi 12.3準(zhǔn)備的第三方VCL控件庫核心價值是接管數(shù)據(jù)表格的展示、編輯、統(tǒng)計、打印導(dǎo)出。用Delphi原生TDBGrid做數(shù)據(jù)管理界面免不了被列寬凍結(jié)、單元格合并、底部統(tǒng)計行、導(dǎo)出Excel、打印預(yù)覽這些需求反復(fù)折騰而Ehlib就是用來接手這些工作的。適合的人很明確正在用Delphi 12.3開發(fā)或維護(hù)桌面數(shù)據(jù)庫應(yīng)用、又被表格交互細(xì)節(jié)逼瘋的開發(fā)者。這篇文章從解壓講到驗(yàn)證把安裝步驟、必調(diào)參數(shù)和踩坑記錄全部按可復(fù)現(xiàn)的方式寫出來新手能照做熟手能直接查排錯。2. 先搞清楚Ehlib 111015這套控件能帶來什么2.1 原生TDBGrid的四個短板正好是Ehlib的強(qiáng)項(xiàng)第一個短板是單元格合并。原生TDBGrid只支持列向重復(fù)值顯示不支持真正的跨行合并。做部門匯總報表、按月份分組的統(tǒng)計列表時需要把相同值的行合并成一個單元格。TDBGridEh通過OptionsEh里的dghMergeAdjacentCellsEh選項(xiàng)結(jié)合列屬性里的MergeCells配置可以在數(shù)據(jù)呈現(xiàn)層做動態(tài)合并。需要注意的是它合并的是“顯示”不是數(shù)據(jù)源里的真實(shí)行排序和統(tǒng)計仍按原始行進(jìn)行。如果兩個相鄰行值恰好相同但你想強(qiáng)制它們不合并需要在列的OnGetMergeParams事件里攔截并返回不合并標(biāo)志這個事件是Ehlib列合并功能里最容易被人忽略的入口。第二個短板是底部統(tǒng)計行。原生TDBGrid沒有匯總行要顯示合計和平均值只能在數(shù)據(jù)集SQL里寫匯總子查詢數(shù)據(jù)變化了還要重新查詢。Ehlib提供了一個TDBSumList組件單獨(dú)監(jiān)聽數(shù)據(jù)集增量維護(hù)統(tǒng)計值然后把統(tǒng)計結(jié)果顯示到網(wǎng)格FooterRowCount設(shè)置的Footer行上。這樣統(tǒng)計不隨SQL重查大數(shù)據(jù)集下性能比每次執(zhí)行SUM聚合好得多。實(shí)際業(yè)務(wù)里訂單列表要同時顯示金額合計、數(shù)量合計、記錄條數(shù)TDBSumList一個組件就能同時維護(hù)三個統(tǒng)計值不用為每個字段寫一條匯總SQL。第三個短板是導(dǎo)出與打印。用戶一句“把這個表導(dǎo)出來”在原生方案里得自己接第三方Excel庫或者離線報表組件去拼數(shù)據(jù)。Ehlib給網(wǎng)格直接提供了SaveToXLS、SaveToRTF、SaveToHTML、SaveToTXT四類導(dǎo)出方法還內(nèi)置了PrintPreview打印預(yù)覽界面底層通過TDBPrinter渲染。它不依賴客戶機(jī)安裝Office導(dǎo)出的是Excel能打開的HTML/XML格式。優(yōu)點(diǎn)是部署簡單缺點(diǎn)是格式控制力度有限一旦客戶要求“每列寬度、頁眉頁腳、合并單元格都要和界面完全一致”光靠Ehlib默認(rèn)導(dǎo)出滿足不了還得配合自定義樣式或二次處理。第四個短板是顯示格式。金額千分位、日期顯示格式、超長文本截斷加省略號、單元格里畫進(jìn)度條、下拉日歷、下拉選擇框這些在原生TDBGrid里要么寫OnGetText事件手工處理要么另外放控件疊加。Ehlib把這部分做成了列級屬性直接在列編輯器里配置不用寫事件代碼。以金額字段為例設(shè)置列的DisplayFormat為“#,##0.00”即可實(shí)現(xiàn)千分位放在原生TDBGrid里得寫一整個事件去格式化維護(hù)成本不在一個數(shù)量級。這四個短板覆蓋了數(shù)據(jù)管理界面里八成以上的列表增強(qiáng)需求。如果只是簡單展示幾條只讀數(shù)據(jù)原生TDBGrid本來也夠用Ehlib的價值在于讓開發(fā)者不用反復(fù)造輪子。換句話說你手上有真實(shí)業(yè)務(wù)系統(tǒng)列表不是“展示”而是“操作臺”才需要裝它。2.2 版本號為什么必須對齊Delphi 12.3和Ehlib 111015的關(guān)系RAR包名字里“Delphi 12.3”和“Ehlib 111015”兩個信息缺一不可它們分別約束了環(huán)境版本和控件版本。先說環(huán)境版本。VCL控件最終要以DCU、BPL形式進(jìn)入IDE。Delphi每個大版本編譯器生成的DCU文件格式不互通你在某個舊版Delphi下編譯出來的Ehlib DCU拿到Delphi 12.3工程里引用編譯時會報“Unit not compiled with this version of Delphi”一類的錯。RAR包命名為Delphi 12.3專用就是為了避免這種錯配。安裝時務(wù)必確認(rèn)打開編譯的DPK工程是對應(yīng)版本包內(nèi)如果帶預(yù)編譯BPL也要按版本目錄區(qū)分不要混著用。再說控件版本。Ehlib 111015表示這套控件源碼發(fā)布時的一個版本號或構(gòu)建編號。Ehlib版本演進(jìn)不以IDE版本為單位而是獨(dú)立發(fā)版所以會出現(xiàn)“Ehlib 111015支持Delphi 12.3”這種組合。這個版本號里具體有哪些功能變化以包內(nèi)自帶的歷史說明文檔為準(zhǔn)。我見過不止一次有人在網(wǎng)上找Ehlib下載后不讀說明直接裝結(jié)果把舊版的DCU覆蓋到新版目錄最后報表功能全部亂套這種低級翻車完全可以靠讀說明文檔避免。安裝前最好建一個干凈的獨(dú)立目錄把Ehlib解壓后單獨(dú)放著不要把DCU和BPL散落到IDE默認(rèn)目錄里去方便后續(xù)切換控件版本時管理。這也是我給所有用第三方控件的人的第一條忠告所有VCL控件最好都獨(dú)立管理目錄不要一股腦丟進(jìn)Delphi的Library默認(rèn)路徑里。2.3 安裝開銷和選型判斷到底要不要裝Ehlib的授權(quán)方式以包內(nèi)說明文檔為準(zhǔn)安裝使用前一定要確認(rèn)拿到的是合規(guī)授權(quán)這一點(diǎn)不要含糊。從工程開銷上看裝Ehlib要注意三點(diǎn)。第一IDE的組件面板會多一組控件圖標(biāo)包加載時間略微增加。第二發(fā)布程序時要帶上對應(yīng)的運(yùn)行時BPL。第三編譯時間和項(xiàng)目產(chǎn)出體積增加。如果項(xiàng)目只是CRUD界面列表不帶統(tǒng)計、不導(dǎo)出、不合并那原生TDBGrid配少量代碼完全夠用沒必要引入第三方依賴反過來你的系統(tǒng)里存在報表型列表、明細(xì)賬、訂單明細(xì)這類界面Ehlib的投入產(chǎn)出比就非常高。我的判斷方法很簡單在紙上列三項(xiàng)——是否需要單元格合并、是否需要底部統(tǒng)計或合計、是否需要一鍵導(dǎo)出Excel或打印預(yù)覽。命中兩項(xiàng)以上就裝。只命中一項(xiàng)可以臨時用原生網(wǎng)格加事件代碼兜底減少一個外部依賴。這樣能避免裝完又卸載的反復(fù)折騰也在團(tuán)隊(duì)協(xié)作時減少“為什么我這個環(huán)境跑不起來”的溝通成本。3. 在Delphi 12.3里裝好Ehlib 111015從解壓到出圖標(biāo)3.1 解壓前的三件事退出IDE、整理目錄、讀說明安裝任何VCL包之前第一條血淚經(jīng)驗(yàn)先退出Delphi 12.3。不是關(guān)掉工程就算完而是把IDE進(jìn)程完全退出。因?yàn)镮DE運(yùn)行時鎖定了正在使用的BPL文件直接安裝很可能報“文件被占用”。這一步省事的做法是任務(wù)管理器里確認(rèn)沒有殘余的IDE進(jìn)程再繼續(xù)操作。注意不要在IDE運(yùn)行狀態(tài)下直接覆蓋或刪除舊的BPL文件這會導(dǎo)致安裝進(jìn)度走到一半時IDE失去響應(yīng)。第二件事把RAR包解壓到純英文無空格目錄。我通常放在類似D:\Components\Ehlib111015\的位置。不要解壓到桌面也不要放中文路徑Ehlib源碼編譯時對路徑里的中文支持不算好一旦報“無法定位文件”這類錯誤排查起來非常消耗時間。保證整個目錄結(jié)構(gòu)干凈后續(xù)編譯遇到問題更容易定位是路徑問題還是源碼問題。第三件事解壓后先讀包內(nèi)的說明文檔確認(rèn)兩個信息一是這個包是否明確支持Delphi 12.3二是包里有沒有預(yù)編譯的BPL、DCP文件還是只有源碼。如果說明文檔缺失直接打開包內(nèi)目錄看是否存在類似EhlibD12.dpk、EhlibD10.dpk這類帶版本后綴的DPK文件。有對應(yīng)版本后綴的DPK說明這個包確實(shí)適配了該IDE版本只有通用名稱沒有版本后綴就要按源碼編譯并注意路徑匹配。這一步可以提前過濾掉把舊Ehlib改名冒充新包的情況避免無效安裝。3.2 在IDE里編譯運(yùn)行包并安裝設(shè)計包詳細(xì)操作與命令Ehlib常規(guī)安裝分兩步先編譯運(yùn)行時包再安裝設(shè)計時包。運(yùn)行時包是核心代碼發(fā)布時也要分發(fā)設(shè)計時包只存在于IDE環(huán)境作用是讓控件出現(xiàn)在面板上。包類型文件后綴職責(zé)發(fā)布程序時運(yùn)行時包.bpl /.dcp提供核心單元實(shí)現(xiàn)程序運(yùn)行依賴需要隨exe一起分發(fā)設(shè)計時包.bpl在IDE中注冊組件面板不需要分發(fā)到客戶機(jī)第一步啟動Delphi 12.3用File Open打開包內(nèi)對應(yīng)版本的DPK工程文件例如EhlibD12.dpk。操作說明如下// 步驟1在Project Manager中右鍵EhlibD12工程節(jié)點(diǎn) // 先選擇Build等編譯日志輸出成功信息 // 步驟2Build成功后再次右鍵同一個節(jié)點(diǎn)選擇Install // 步驟3如果IDE提示Package xxx already installed // 先在Component Install Packages里找到舊包并Remove // 再重新執(zhí)行Install邏輯說明Build負(fù)責(zé)把源碼編譯成DCU和BPLInstall負(fù)責(zé)把BPL注冊到IDE包列表注冊之后組件面板才出現(xiàn)Ehlib分類。二者缺一不可只Build不Install代碼能編譯但面板無控件只Install不BuildIDE會提示包文件不存在。步驟3是給升級場景用的舊包不先移除會出現(xiàn)同名包重復(fù)注冊輕則面板控件重復(fù)重則IDE啟動失敗。參數(shù)說明Project Manager里還有Release和Debug兩種配置建議使用Release配置編譯保證發(fā)布時加載的是同一套編譯產(chǎn)物。編譯過程中如果IDE報找不到某些單元文件打開Tools Options IDE Library在庫搜索路徑里添加Ehlib源碼目錄及其Common子目錄然后重新Build。備用命令行方式編譯msbuild EhlibD12.dproj /t:Build /p:ConfigRelease /p:PlatformWin32 /maxcpucount:4邏輯說明msbuild是編譯Delphi工程文件的標(biāo)準(zhǔn)命令/t:Build指定構(gòu)建目標(biāo)/p:ConfigRelease指定使用Release配置/p:PlatformWin32指定目標(biāo)平臺為32位/maxcpucount:4是并行編譯參數(shù)多核機(jī)器上能明顯提速。如果你的發(fā)布目標(biāo)是64位還需要再執(zhí)行一次PlatformWin64兩次編譯會生成不同架構(gòu)的BPL。設(shè)計期IDE加載32位BPL運(yùn)行發(fā)布按客戶機(jī)架構(gòu)選擇對應(yīng)的BPL分發(fā)。編譯完成后Component Install Packages里應(yīng)該能看到Ehlib相關(guān)條目。組件面板會出現(xiàn)Ehlib分類里面至少包含TDBGridEh、TDBEditEh、TDBComboBoxEh、TDBCheckBoxEh、TDBMemoEh、TDBDateTimePickerEh、TDBNumberEditEh、TDBSumList、TDBPrinter等控件。這里有一個值得注意的邊界如果包內(nèi)的DPK項(xiàng)目還帶了可選組件比如MemTableEh等安裝時注意不要一次性全裝上避免不需要的包拖慢IDE啟動速度。3.3 安裝完的路徑登記與IDE重啟驗(yàn)證安裝完成只是第一步還要確保下次啟動IDE時Ehlib能正常加載。打開Component Install Packages對話框確認(rèn)對話框里該條目處于勾選狀態(tài)。然后把Ehlib編譯輸出BPL所在目錄加入系統(tǒng)PATH同時將該目錄加入IDE的庫搜索路徑。這樣做的原因是IDE啟動時會按注冊的包路徑和BPL搜索路徑查找文件路徑不在查找范圍包就加載不上表現(xiàn)為“控件面板消失”。完成上述步驟后建議直接重啟一次IDE再新建一個VCL工程確認(rèn)面板上Ehlib分類存在。我習(xí)慣順手拖一個TDBGridEh到窗體上如果能正常放下來說明設(shè)計時包也已生效。這一步花不了兩分鐘但能把很多后續(xù)問題前置擋掉比等到項(xiàng)目構(gòu)建時才暴露要劃算得多。4. 裝完怎么用Ehlib 111015高頻組件的最小配置4.1 TDBGridEh最小可用配置TDBGridEh是Ehlib里使用頻率最高的組件配置從拖到窗體上開始按這四步走連接DataSource在列編輯器里配置字段列設(shè)置列寬和標(biāo)題按需求打開OptionsEh。不要把網(wǎng)格的DataSource長期懸空否則很多屬性設(shè)置無效果界面設(shè)計期也看不出差異。// 最小配置網(wǎng)格已拖放到Form數(shù)據(jù)源組件為DataSource1 DBGridEh1.DataSource : DataSource1; // 允許自動調(diào)整行高以便完整顯示多行文本 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoFitRowHeight]; // 雙擊列頭自動優(yōu)化列寬 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghDblClickOptimizeColWidth]; // 單元格合并開關(guān)相鄰行同列值相同時自動合并顯示 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghMergeAdjacentCellsEh]; // 行指示器顯示當(dāng)前行圖標(biāo) DBGridEh1.IndicatorOptions : [gioShowRowIndicatorEh];邏輯說明OptionsEh是集合屬性用“[選項(xiàng)]”往集合里追加不要整體賦值成只含一個選項(xiàng)否則會丟失默認(rèn)行為。dghMergeAdjacentCellsEh啟用的是顯示層合并數(shù)據(jù)源中的行數(shù)不變排序和統(tǒng)計依然按原行處理。參數(shù)說明dghAutoFitRowHeight控制行高自適應(yīng)內(nèi)容適合備注、地址這類長文本字段如果列表里沒有長文本這個選項(xiàng)可以不加省去繪制開銷。dghDblClickOptimizeColWidth會在用戶雙擊列頭時按內(nèi)容最大寬度自動調(diào)整列寬體驗(yàn)上接近Excel列寬自適應(yīng)。IndicatorOptions里gioShowRowIndicatorEh會顯示當(dāng)前行左側(cè)的指示圖標(biāo)編輯、插入、刪除狀態(tài)都有不同圖形多行編輯界面更好用。OptionsEh選項(xiàng)作用適用場景dghAutoFitRowHeight行高自適應(yīng)內(nèi)容自動換行顯示備注、長文本字段dghMergeAdjacentCellsEh相鄰行同值單元格自動合并報表、分組統(tǒng)計列表dghDblClickOptimizeColWidth雙擊列頭自動最適配列寬常規(guī)管理類列表4.2 用TDBSumList做底部統(tǒng)計行統(tǒng)計行是進(jìn)銷存界面里最常用的一類功能。配置分為三步放一個TDBSumList把TDBSumList的DataSource指向與網(wǎng)格相同的DataSource在網(wǎng)格的FooterRowCount設(shè)為1并在列編輯器的Footer屬性里指定統(tǒng)計類型和字段。DBGridEh1.FooterRowCount : 1; SumListEh1.DataSource : DataSource1; SumListEh1.VirtualMode : False; // 在列編輯器中設(shè)置Footer屬性 // 選中某列Footer.ValueType : fvtSum; // Footer.FieldName : TotalAmount; // 數(shù)據(jù)改變后刷新統(tǒng)計 SumListEh1.Refresh;邏輯說明TDBSumList不是重新查詢數(shù)據(jù)集它動態(tài)監(jiān)聽數(shù)據(jù)集的記錄變化在滾動、編輯、增刪行時增量更新統(tǒng)計值所以當(dāng)數(shù)據(jù)有變化時網(wǎng)格能即時反映。VirtualMode設(shè)為False時由SumList自動統(tǒng)計指定字段設(shè)為True時則需要自己處理OnSumListRefresh事件按需填充每列數(shù)值適合統(tǒng)計口徑復(fù)雜的界面。參數(shù)說明fvtSum是合計fvtAvg是平均值fvtCount是計數(shù)fvtMax和fvtMin分別是最大值和最小值。每種類型都要求Footer.FieldName指向有效的數(shù)值字段或可比較字段否則統(tǒng)計行顯示為空或0。數(shù)據(jù)集處于過濾狀態(tài)或使用了分組時務(wù)必在數(shù)據(jù)集事件里調(diào)用一次SumListEh1.Refresh否則統(tǒng)計數(shù)據(jù)會和界面顯示不一致這個坑很容易被誤判成“統(tǒng)計組件壞了”。4.3 一鍵導(dǎo)出Excel和打印預(yù)覽客戶要求“把列表導(dǎo)成Excel”適合用Ehlib自帶的導(dǎo)出方法好處是不依賴客戶機(jī)安裝Office在終端機(jī)上只需有可執(zhí)行程序即可。最小調(diào)用代碼// 導(dǎo)出到xls格式文件 DBGridEh1.SaveToXLS(D:\Report\order_list.xls); // 保留列寬信息的導(dǎo)出 DBGridEh1.SaveToXLS(D:\Report\order_list_width.xls, True); // 調(diào)起內(nèi)置打印預(yù)覽 DBGridEh1.PrintPreview;邏輯說明SaveToXLS的底層是生成Excel可打開的HTML文件因此文件后綴和編碼要注意。第一行代碼用默認(rèn)參數(shù)導(dǎo)出文件體積小但單元格列寬按內(nèi)容默認(rèn)分配第二行傳入True后導(dǎo)出會盡量按網(wǎng)格列寬信息生成表格更接近界面效果。PrintPreview調(diào)用Ehlib自己的預(yù)覽窗體用戶可以縮放比例、調(diào)整邊距、跳頁后再走打印機(jī)輸出。參數(shù)說明SaveToXLS的第二個參數(shù)是布爾類型表示是否按列寬格式化輸出。PrintPreview沒有必填參數(shù)但預(yù)覽窗體的行為受全局打印設(shè)置影響例如打印機(jī)名稱、紙張方向需要提前通過Printer組件設(shè)置。如果客戶需要導(dǎo)出后數(shù)據(jù)還能繼續(xù)編輯建議用SaveToXLS導(dǎo)出而不是另存為CSVCSV對類型和列寬保留更差中文編碼也容易出問題。導(dǎo)出格式調(diào)用方法特點(diǎn)XLSSaveToXLSExcel可直接打開支持列寬保留RTFSaveToRTF適合Word進(jìn)一步排版HTMLSaveToHTML適合網(wǎng)頁展示和跨平臺查看TXTSaveToTXT純文本帶分隔符兼容性最強(qiáng)5. Ehlib 111015安裝與使用避坑記錄現(xiàn)象、原因、解決5.1 重啟IDE后控件面板消失現(xiàn)象安裝時IDE提示包安裝成功組件面板也看到了Ehlib分類但重啟IDE后分類消失新建窗體時找不到TDBGridEh等控件。原因最常見是BPL文件所在目錄沒有被IDE持久記錄IDE重啟后按注冊信息掃描不到該目錄下的BPL。殺毒軟件在IDE退出后隔離BPL文件也不算少見。另一個常見原因是解壓后的Ehlib目錄被移動了注冊表里記錄的舊路徑已經(jīng)失效。解決先打開Component Install Packages檢查包是否還在列表中。如果包在但面板沒有控件把BPL所在目錄加入系統(tǒng)PATH并加入IDE的庫搜索路徑然后重啟IDE。如果包不在列表中重新打開DPK再Build并Install一次并把BPL輸出目錄固定到一個穩(wěn)定位置避免之后再移動目錄。5.2 編譯工程時報找不到Unit或版本不匹配現(xiàn)象編譯工程時報“Unit xxx not found”或者提示DCU版本與當(dāng)前編譯器不一致。原因IDE庫搜索路徑中殘留舊版Ehlib目錄編譯器優(yōu)先匹配了舊DCU或者包本身不是為當(dāng)前IDE版本編譯的。很多情況下機(jī)器上裝過多個Delphi版本或者裝過不同來源的Ehlib包庫搜索路徑里同時存在多個Ehlib版本目錄。解決打開Tools Options IDE Library在庫搜索路徑中刪除所有舊Ehlib目錄只保留當(dāng)前111015對應(yīng)的源碼目錄并清理工程目錄下的DCU緩存文件。然后在Project Manager里對目標(biāo)工程執(zhí)行一次Clean再重新Build。這一步Clean經(jīng)常被忽略但舊DCU不清除編譯結(jié)果受庫路徑改動影響很小問題會反復(fù)出現(xiàn)。提示工程級Clean一定要做只改庫搜索路徑不清理DCU編譯器可能直接命中舊緩存文件排錯白費(fèi)力氣。5.3 導(dǎo)出Excel或打印預(yù)覽時中文亂碼現(xiàn)象網(wǎng)格內(nèi)顯示完全正常導(dǎo)出XLS后用Excel打開中文變問號打印預(yù)覽時中文變成方框。原因?qū)С鯴LS時默認(rèn)按本地代碼頁生成如果客戶機(jī)的系統(tǒng)區(qū)域設(shè)置不同或者代碼頁不匹配就會亂碼。打印預(yù)覽亂碼則常與字體映射有關(guān)Ehlib預(yù)覽界面默認(rèn)調(diào)用的字體缺少對應(yīng)中文字形時字符繪制成方框。解決先確認(rèn)客戶機(jī)系統(tǒng)區(qū)域設(shè)置簡體中文環(huán)境下保持ANSI或GBK即可如果需要跨語言分發(fā)導(dǎo)出后對文件做編碼轉(zhuǎn)換把文本內(nèi)容轉(zhuǎn)成UTF-8新版Excel也能識別。打印亂碼的處理是把網(wǎng)格和預(yù)覽窗體的默認(rèn)字體統(tǒng)一設(shè)置成中文字體比如宋體或微軟雅黑然后在Ehlib打印設(shè)置里指定該字體一般即可解決。5.4 安裝包過程IDE崩潰或無響應(yīng)現(xiàn)象在IDE里打開DPK執(zhí)行Build時IDE直接退出或長時間無響應(yīng)。原因常見原因包括Ehlib源碼目錄處于只讀狀態(tài)編譯輸出文件無法寫入殺毒軟件實(shí)時掃描IDE編譯過程也有極端情況下是內(nèi)存不足多核并行編譯占滿資源導(dǎo)致IDE失去響應(yīng)。解決先把Ehlib整個目錄去掉只讀屬性再以管理員身份運(yùn)行IDE暫時關(guān)閉殺毒軟件對該目錄和IDE臨時目錄的實(shí)時掃描。如果IDE內(nèi)操作繼續(xù)崩潰退到命令行方式編譯用msbuild完成后再回到IDE安裝BPL。命令行編譯隔離了IDE交互崩潰面更小也更容易定位錯誤日志。5.5 高DPI顯示器下網(wǎng)格文字模糊現(xiàn)象在4K屏或150%縮放下Ehlib網(wǎng)格文字顯示發(fā)虛單元格和列頭邊緣不清晰。原因Ehlib部分繪制邏輯未遵循新版IDE的高DPI縮放機(jī)制系統(tǒng)對窗體做了位圖拉伸拉伸后再顯示導(dǎo)致文字邊緣模糊。解決在工程文件里開啟高DPI支持并在窗體創(chuàng)建后做一次網(wǎng)格刷新。推薦在DPR工程文件開頭設(shè)置Application.HighDPIAware : True;再用以下代碼在窗體顯示后刷新網(wǎng)格procedure TForm1.FormShow(Sender: TObject); begin DBGridEh1.Refresh; end;邏輯說明開啟HighDPIAware后系統(tǒng)不再對窗體做整體位圖拉伸文字按實(shí)際DPI重新布局邊緣會清晰很多。刷新網(wǎng)格是為了讓列寬重新計算。參數(shù)說明如果項(xiàng)目同時啟用PerMonitorV2模式不同顯示器DPI不一致時需要在窗口移動跨屏?xí)r額外處理最好在窗體的ScalingChanged事件里再次調(diào)用網(wǎng)格Refresh避免跨屏后文字變形。6. 用十個檢查點(diǎn)驗(yàn)證Ehlib 111015安裝結(jié)果主動收尾安裝完成后先別急著進(jìn)入業(yè)務(wù)代碼花十分鐘跑一個最小驗(yàn)證工程比后面出了問題再回頭排查省時間得多。新建一個VCL工程擺一個TDBGridEh、一個TDBSumList、一個TButton、一個TDataSource連上測試數(shù)據(jù)集按下面的檢查點(diǎn)逐一過檢查點(diǎn)操作預(yù)期結(jié)果1查看組件面板Ehlib分類圖標(biāo)完整無紅色嘆號2網(wǎng)格連接數(shù)據(jù)源并顯示數(shù)據(jù)正常顯示列可拖寬3點(diǎn)擊列標(biāo)題排序排序箭頭變化排序生效4右鍵網(wǎng)格排序、過濾、導(dǎo)出菜單可用5設(shè)置FooterRowCount1并綁定SumList統(tǒng)計行顯示正確數(shù)字6調(diào)用SaveToXLS導(dǎo)出文件生成Excel打開中文正常7調(diào)用PrintPreview預(yù)覽窗體打開翻頁縮放正常8高DPI縮放窗體文字不模糊、列寬對齊9Release模式編譯整個工程編譯無警告10復(fù)制EXE和BPL到無IDE機(jī)器運(yùn)行正常功能完整這十個檢查點(diǎn)里第5、6、7是Ehlib區(qū)別于原生網(wǎng)格的核心價值點(diǎn)只要有一個不過說明安裝或環(huán)境配置有問題回到第5章找對應(yīng)條目不要靠重裝碰運(yùn)氣。我個人的教訓(xùn)是換Delphi大版本或換電腦后一定要把這張檢查單從頭跑一遍。以前我從舊版本環(huán)境切到Delphi 12.3時因?yàn)橥祽袥]有重新編譯Ehlib包統(tǒng)計行在某種數(shù)據(jù)分布下算出明顯錯誤數(shù)字查了一下午才定位到是舊DCU混用。那次之后每次裝完控件我都按這套檢查單驗(yàn)證包括BPL文件是否完整、導(dǎo)出文件在客戶環(huán)境下能否打開、高DPI下是否正常。一個好的控件方案不是裝上就行而是要確認(rèn)它在你的目標(biāo)環(huán)境里真正可用。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取