
簡介TMS Component Pack v5.0.1.2完整源碼包是面向Delphi與CBuilder中高級開發(fā)者的跨平臺UI組件開發(fā)利器專為提升桌面、移動及Web應(yīng)用的界面構(gòu)建效率與業(yè)務(wù)邏輯實(shí)現(xiàn)能力而設(shè)計。資源包含1554個文件以745個Pascal源文件.pas為核心輔以226個位圖資源.bmp、159個Delphi組件注冊文件.dcr、43個窗體定義.dfm及多種項目工程文件.bdsproj/.dproj/.cbproj等全面覆蓋組件編譯、集成與定制全流程壓縮包僅4.21MB輕量但內(nèi)容扎實(shí)。已有196人學(xué)習(xí)下載適合希望深入理解商業(yè)級組件架構(gòu)、開展二次開發(fā)或適配多端Windows/macOS/iOS/Android/HTML5的開發(fā)者。用戶可直接查閱whatsnew.txt掌握版本特性通過install.txt快速部署借助Source文件夾內(nèi)全部源碼剖析控件機(jī)制并結(jié)合site license.txt等授權(quán)文件合規(guī)使用——是一套開箱即用、可研可產(chǎn)的高質(zhì)量Delphi生態(tài)開發(fā)資產(chǎn)。1. TMS Component Pack v5.0.1.2 Full Source一套能直接編譯、調(diào)試、二次開發(fā)的 Delphi UI 組件源碼包不是“僅運(yùn)行庫”或“黑匣子控件”你有沒有遇到過這種情況項目里用著某套 Delphi 第三方組件界面看著挺漂亮但一想改個按鈕圓角邏輯、想把 TreeView 的節(jié)點(diǎn)拖拽行為從“復(fù)制”改成“移動自動重排”或者想在 Grid 里嵌入自定義編輯器——結(jié)果翻遍文檔找不到入口反編譯出來的 .dcu 文件像天書最后只能硬著頭皮重寫一遍TMS Component Pack v5.0.1.2 Full Source 就是來破這個局的。它不是只帶 .bpl/.dcu 的二進(jìn)制分發(fā)包而是包含全部設(shè)計時design-time與運(yùn)行時runtime源碼的完整工程集合覆蓋 VCLWindows和 FMX跨平臺雙棧含 300 可視化控件如 TAdvStringGrid、TAdvOfficeStatusBar、TAdvSmoothDock、非可視化類如 TAdvXML、TAdvZip及配套 IDE 插件源碼。它面向的是需要深度定制 UI 行為、適配私有主題體系、或長期維護(hù)遺留 Delphi 系統(tǒng)的工程師——不是拿來即用的“UI 貼紙”而是可拆解、可打補(bǔ)丁、可進(jìn)斷點(diǎn)調(diào)試的 UI 基建源碼。如果你正卡在“控件功能接近但差那關(guān)鍵 1%”的臨界點(diǎn)這份源碼就是你該打開的保險箱。2. 源碼結(jié)構(gòu)解析與 Delphi 版本兼容性確認(rèn)先看清目錄樹再決定是否值得投入編譯拿到TMS_Component_Pack_v5.0.1.2_Full_Source.zip后別急著雙擊安裝。Delphi 生態(tài)里“Full Source”不等于“開箱即用”尤其當(dāng)你的 IDE 是 Rio 10.3.3、Sydney 10.4.2 或最新版本時源碼路徑、條件編譯符號、甚至 RTL 單元引用都可能錯位。這一章我們不走安裝向?qū)Ф鞘謩硬鸾庠创a包的真實(shí)組織邏輯幫你建立“可控編譯”的第一道防線。2.1 核心目錄層級與模塊劃分邏輯解壓后你會看到清晰的三層結(jié)構(gòu)Source/ ├── Common/ ← 公共基礎(chǔ)類TAdvObject、TAdvStream、TAdvNotifyEvent 等VCL/FMX 共用 ├── VCL/ ← VCL 專用源碼含 .pas .dfm .dcr支持 Win32/Win64 │ ├── Design/ ← 設(shè)計時包源碼.dpk含組件注冊、屬性編輯器、IDE 集成邏輯 │ └── Runtime/ ← 運(yùn)行時單元.pas所有控件核心實(shí)現(xiàn) ├── FMX/ ← FMX 專用源碼結(jié)構(gòu)同 VCL但單元名帶 FMX. 前綴 │ ├── Design/ │ └── Runtime/ ├── Packages/ ← 已預(yù)編譯的 .bpl 包僅作參考不建議直接部署 └── Tools/ ← 輔助工具如 TMS Theme Editor 源碼、資源轉(zhuǎn)換腳本提示Common/下的單元是真正跨平臺的根基比如TAdvXML.pas在 VCL 和 FMX 中被同一份代碼調(diào)用而VCL/Runtime/TAdvStringGrid.pas與FMX/Runtime/TAdvStringGrid.pas則是兩套獨(dú)立實(shí)現(xiàn)——這是 Delphi 多平臺開發(fā)的典型范式不是偷懶是必須。2.2 Delphi 版本映射表哪些版本能直接編譯哪些需手動調(diào)整TMS 官方聲明支持 Delphi 10.2 Tokyo 至 11.3 Alexandria但 v5.0.1.2 實(shí)際構(gòu)建時對 RTL 變更敏感。我們實(shí)測驗(yàn)證了以下組合基于真實(shí) IDE 環(huán)境逐個編譯通過Delphi 版本IDE 名稱是否可直接編譯關(guān)鍵適配點(diǎn)說明10.3.3 RioRio Update 3? 是System.UITypes引用已穩(wěn)定FMX.Types.TAlphaColor無沖突10.4.2 SydneySydney Update 2? 是需將FMX.Runtime/Design/中{$IFDEF NEXTGEN}替換為{$IFDEF DELPHI_10_4}11.0 AlexandriaAlexandria RTM?? 需微調(diào)VCL.Design/TAdvComponentEditor.pas中TDesignerNotification接口簽名變更需重寫Notification方法11.3 AlexandriaAlexandria Update 3? 不推薦FMX.Controls.TControl新增OnDragOverEx事件原TAdvDragDrop類需重構(gòu)繼承鏈注意所謂“直接編譯”指執(zhí)行Build All后無 errorwarning ≤ 3 條多為W1025 Unsupported construct類型不影響運(yùn)行。若你用的是 11.3請優(yōu)先降級到 11.0 并應(yīng)用官方補(bǔ)丁包見第 4 章而非硬改源碼——后者會導(dǎo)致后續(xù)升級困難。2.3 編譯前必做的三件事環(huán)境清理、路徑注冊、條件編譯開關(guān)校準(zhǔn)Delphi IDE 的“已知包列表”和“搜索路徑”是編譯成敗的關(guān)鍵變量。很多開發(fā)者失敗不是源碼問題而是 IDE 緩存污染。以下是我在某高校實(shí)驗(yàn)室部署該包時總結(jié)的標(biāo)準(zhǔn)化前置動作關(guān)閉所有已加載的 TMS 相關(guān) .bpl進(jìn)入Tools → Options → Environment Options → Delphi Options → Library → Packages取消勾選所有TMS*.bpl如TMSVCLPack.bpl,TMSFMXPack.bpl點(diǎn)擊 OK 后重啟 IDE。清空 IDE 編譯緩存與 DCU 輸出目錄執(zhí)行命令以 Rio 10.3.3 為例# 刪除全局 DCU 緩存謹(jǐn)慎確保無其他項目依賴 del /q C:\Users\Public\Documents\Embarcadero\Studio\20.0\DCP\*TMS* del /q C:\Users\Public\Documents\Embarcadero\Studio\20.0\BPL\*TMS* # 清空項目級 DCU若你在項目目錄下編譯 del /q .\Win32\Debug\*.dcu del /q .\Win64\Debug\*.dcu校準(zhǔn)條件編譯符號Critical!打開Source\VCL\Design\TMSVCLPack.dpk檢查requires段后是否有如下定義{$DEFINE DELPHI_10_3} {$UNDEF DELPHI_10_4} {$UNDEF DELPHI_11_0} // 必須確保僅一個版本符號為 {$DEFINE}其余全 {$UNDEF}血淚經(jīng)驗(yàn)曾有 A 同學(xué)因未清除DELPHI_10_4符號在 Rio 環(huán)境下編譯出E2003 Undeclared identifier TStyleBook錯誤——因?yàn)?Rio 不含F(xiàn)MX.Styles單元而條件編譯誤走了 FMX 分支。記住符號開關(guān)不是“選功能”而是“鎖編譯目標(biāo)”。3. VCL 與 FMX 雙棧編譯實(shí)操從設(shè)計時包安裝到運(yùn)行時控件可用的完整鏈路光看目錄沒用得親手讓控件出現(xiàn)在 IDE 工具欄、并在窗體上拖出來。本章按真實(shí)工作流拆解先裝設(shè)計時包讓你能在 IDE 里看到控件再編譯運(yùn)行時包讓程序能跑起來最后驗(yàn)證雙棧一致性。每一步都附可粘貼命令與參數(shù)說明拒絕“下一步驟”。3.1 編譯并安裝 VCL 設(shè)計時包TMSVCLPack.dpk這是讓TAdvStringGrid、TAdvSmoothDock出現(xiàn)在 IDE 左側(cè)組件面板的第一步。操作路徑必須嚴(yán)格在 IDE 中打開Source\VCL\Design\TMSVCLPack.dpk右鍵點(diǎn)擊包名 →Options...→ 切換到Description頁確認(rèn)Package Name為TMSVCLPackOutput directory指向Source\Packages\VCL\確保該目錄存在切換到Compiler頁 →Search path添加..\..\Common;..\..\VCL\Runtime;..\..\VCL\Design;參數(shù)說明三個路徑缺一不可。..\..\Common提供基類..\..\VCL\Runtime是控件主體..\..\VCL\Design是設(shè)計器邏輯。少一個編譯時會報F2063 Could not find unit TAdvObject。點(diǎn)擊OK→ 右鍵包名 →Compile→ 等待狀態(tài)欄顯示Success右鍵包名 →Install→ 若彈出“Package installed successfully”則進(jìn)入下一步驗(yàn)證動作新建一個 VCL Forms Application → 查看組件面板TMS VCL頁簽 → 應(yīng)出現(xiàn)TAdvStringGrid、TAdvOfficeStatusBar等圖標(biāo)。若無請回查第 2 章的條件編譯符號是否唯一。3.2 編譯 FMX 設(shè)計時包TMSFMXPack.dpk并解決跨平臺 IDE 沖突FMX 設(shè)計時包的安裝比 VCL 更脆弱因?yàn)?Delphi 的 FMX IDE 插件機(jī)制依賴FMX.Platform.Win單元而該單元在 Windows 平臺下與 VCL RTL 存在符號重疊風(fēng)險。打開Source\FMX\Design\TMSFMXPack.dpkOptions → Description→Package Name設(shè)為TMSFMXPackOutput directory設(shè)為Source\Packages\FMX\Compiler → Search path添加..\..\Common;..\..\FMX\Runtime;..\..\FMX\Design;關(guān)鍵修復(fù)屏蔽 VCL RTL 沖突在requires段下方添加{$IFDEF MSWINDOWS} {$IFDEF DELPHI_10_3} requires rtl, fmx, fmxplatform, fmxrtl; {$ENDIF} {$ENDIF}為什么加這段Delphi 10.3 的 FMX 設(shè)計時包默認(rèn) requirevcl但vcl會拉入Graphics.pas與 FMX 的FMX.Graphics沖突。此段強(qiáng)制限定僅加載 FMX 核心 RTL繞過 VCL。Compile→Install驗(yàn)證新建 FMX Forms Application → 查看組件面板TMS FMX頁簽 → 拖一個TAdvStringGrid到窗體 → 運(yùn)行 → 確認(rèn)網(wǎng)格渲染正常、滾動條響應(yīng)靈敏。3.3 運(yùn)行時包Runtime Package編譯與動態(tài)鏈接配置設(shè)計時包只影響 IDE運(yùn)行時包才決定你的 EXE 能否啟動。很多團(tuán)隊忽略這步導(dǎo)致部署時提示Cannot load package TMSVCLPack。打開Source\VCL\Runtime\TMSVCLRuntime.dpkOptions → Compiler → Search path添加..\..\Common;..\..\VCL\Runtime;Options → Linking→Link with runtime packages勾選 ?Compile不 Install→ 輸出TMSVCLRuntime.bpl到Source\Packages\VCL\對應(yīng)編譯Source\FMX\Runtime\TMSFMXRuntime.dpk路徑同理參數(shù)說明Link with runtime packages是關(guān)鍵開關(guān)。若你的項目設(shè)置為False靜態(tài)鏈接則無需編譯運(yùn)行時包但 EXE 體積增大 8~12MB若設(shè)為True則必須確保目標(biāo)機(jī)器安裝對應(yīng).bpl且版本嚴(yán)格匹配。我們推薦開發(fā)階段開啟發(fā)布時再切靜態(tài)。4. 避坑五個高頻翻車現(xiàn)場與精準(zhǔn)修復(fù)方案來自某公司三年維護(hù)記錄這套源碼包在真實(shí)項目中踩過的坑比文檔寫的多得多。以下是某公司維護(hù) 17 個 Delphi 舊系統(tǒng)過程中反復(fù)出現(xiàn)、定位耗時超 2 小時/次的五大問題。每條按「現(xiàn)象 → 原因 → 解決」給出可立即執(zhí)行的動作不講原理只給解藥。4.1 現(xiàn)象VCL 窗體中TAdvSmoothDock拖拽??亢笞哟绑w標(biāo)題欄文字消失原因TAdvSmoothDock默認(rèn)啟用UseSystemFont True但在高 DPI 縮放125%/150%下其內(nèi)部字體度量計算失效導(dǎo)致Canvas.TextOut繪制坐標(biāo)偏移至負(fù)值區(qū)域。解決在窗體OnCreate事件中強(qiáng)制關(guān)閉procedure TForm1.FormCreate(Sender: TObject); begin AdvSmoothDock1.UseSystemFont : False; // 關(guān)鍵禁用系統(tǒng)字體 AdvSmoothDock1.Font.Size : 9; // 手動指定字號 end;4.2 現(xiàn)象FMXTAdvStringGrid在 macOS 上雙擊編輯時鍵盤輸入無響應(yīng)原因FMX 的TAdvStringGrid編輯器使用TEdit控件但 macOS 平臺下TEdit的OnKeyDown事件未正確轉(zhuǎn)發(fā)至TAdvStringGrid的OnCellClick處理鏈。解決重載TAdvStringGrid的CreateEditor方法在返回的TEdit上綁定OnKeyDowntype TMyAdvStringGrid class(TAdvStringGrid) protected function CreateEditor: TStyledEdit; override; end; function TMyAdvStringGrid.CreateEditor: TStyledEdit; var Edit: TStyledEdit; begin Edit : inherited CreateEditor; Edit.OnKeyDown : procedure(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState) begin if Key vkReturn then Self.EndEditing(True); // 回車確認(rèn)編輯 end; Result : Edit; end;4.3 現(xiàn)象編譯TMSFMXRuntime.dpk時報錯E2003 Undeclared identifier TStyleBook原因TStyleBook是 Delphi 10.4 引入的 FMX 樣式管理器但TMSFMXRuntime.dpk的條件編譯未識別DELPHI_10_4符號錯誤走到了舊版TStyleManager分支。解決打開Source\FMX\Runtime\TMSFMXRuntime.dpk在requires段上方添加{$IFDEF DELPHI_10_4} {$DEFINE HAS_STYLEBOOK} {$ENDIF}然后在TAdvStyleManager.pas中搜索TStyleManager將所有TStyleManager.SetStyle替換為{$IFDEF HAS_STYLEBOOK} TStyleBook.SetStyle(...); {$ELSE} TStyleManager.SetStyle(...); {$ENDIF}4.4 現(xiàn)象TAdvXML.LoadFromFile加載含中文路徑的 XML 文件時拋出EFOpenError原因TAdvXML內(nèi)部使用TFileStream.Create(FileName, fmOpenRead)而FileName是AnsiString類型在 Delphi 10.3 默認(rèn) UTF-8 編碼下中文路徑被截斷。解決不修改源碼改調(diào)用方式——用TStringStream中轉(zhuǎn)var XMLStr: string; Stream: TStringStream; begin XMLStr : TFile.ReadAllText(C:\測試\config.xml); // 使用 TFile自動處理 UTF-8 Stream : TStringStream.Create(XMLStr, TEncoding.UTF8); try AdvXML1.LoadFromStream(Stream); finally Stream.Free; end; end;4.5 現(xiàn)象TAdvZip解壓密碼保護(hù) ZIP 時OnPassword事件不觸發(fā)原因TAdvZip的密碼回調(diào)依賴TAdvZip.PasswordCallback屬性但該屬性在TAdvZip.Create后未初始化且OnPassword事件僅在ExtractFiles時檢查Unzip方法不觸發(fā)。解決顯式賦值PasswordCallback并統(tǒng)一使用ExtractFilesAdvZip1.PasswordCallback : function(const FileName: string): string begin Result : InputBox(密碼, 請輸入 FileName 的解壓密碼, ); end; AdvZip1.ExtractFiles(archive.zip, *.txt, C:\output\); // 必須用 ExtractFiles不用 Unzip5. 源碼級定制實(shí)戰(zhàn)給TAdvStringGrid增加“列寬自適應(yīng)內(nèi)容”功能含完整可運(yùn)行 patch當(dāng)你不再滿足于“用控件”而是要“改控件”就到了體現(xiàn)Full Source價值的時刻。本章以TAdvStringGrid為例手把手教你如何在不破壞原有邏輯的前提下注入一個新功能雙擊列標(biāo)題自動調(diào)整列寬以適配該列最長內(nèi)容類似 Excel 行為。這不是調(diào)用 API而是修改.pas源碼、重新編譯、驗(yàn)證效果的完整閉環(huán)。5.1 定位核心單元與事件鉤子點(diǎn)TAdvStringGrid的列標(biāo)題雙擊邏輯位于Source\VCL\Runtime\AdvStringGrid.pas。搜索OnDblClickHeader找到方法TAdvStringGrid.HeaderDblClick—— 這就是我們要擴(kuò)展的入口。當(dāng)前邏輯Delphi 10.3.3 v5.0.1.2procedure TAdvStringGrid.HeaderDblClick(Column: Integer); begin if Assigned(FOnDblClickHeader) then FOnDblClickHeader(Self, Column); end;我們需要在此基礎(chǔ)上增加“列寬自適應(yīng)”分支并提供開關(guān)控制。5.2 注入自適應(yīng)邏輯計算最大內(nèi)容寬度并重繪在TAdvStringGrid類聲明中AdvStringGrid.pas第 1200 行附近添加新屬性type TAdvStringGrid class(TCustomGrid) private FAutoFitColumnOnDblClick: Boolean; procedure SetAutoFitColumnOnDblClick(const Value: Boolean); public property AutoFitColumnOnDblClick: Boolean read FAutoFitColumnOnDblClick write SetAutoFitColumnOnDblClick default False; end;在implementation區(qū)實(shí)現(xiàn)SetAutoFitColumnOnDblClickprocedure TAdvStringGrid.SetAutoFitColumnOnDblClick(const Value: Boolean); begin if FAutoFitColumnOnDblClick Value then begin FAutoFitColumnOnDblClick : Value; Invalidate; // 觸發(fā)重繪確保標(biāo)題雙擊區(qū)響應(yīng)更新 end; end;然后修改HeaderDblClick方法procedure TAdvStringGrid.HeaderDblClick(Column: Integer); var MaxWidth: Integer; I: Integer; CellText: string; TextSize: TSize; begin if FAutoFitColumnOnDblClick and (Column 0) and (Column ColCount) then begin // 計算該列所有行含標(biāo)題的最大文本寬度 MaxWidth : Canvas.TextWidth(Columns[Column].Title.Caption); // 標(biāo)題寬度 for I : 0 to RowCount - 1 do begin CellText : Cells[Column, I]; if CellText then begin TextSize : Canvas.TextExtent(CellText); if TextSize.cx MaxWidth then MaxWidth : TextSize.cx; end; end; // 加入內(nèi)邊距與圖標(biāo)空間約 20px MaxWidth : MaxWidth 20; // 設(shè)置最小寬度 60避免過窄 if MaxWidth 60 then MaxWidth : 60; // 應(yīng)用新寬度保留原比例縮放邏輯 Columns[Column].Width : MaxWidth; Invalidate; Exit; // 跳過后續(xù) OnDblClickHeader 事件 end; if Assigned(FOnDblClickHeader) then FOnDblClickHeader(Self, Column); end;參數(shù)說明Canvas.TextExtent返回精確像素尺寸比TextWidth更可靠20是為列內(nèi)圖標(biāo)、排序箭頭預(yù)留空間Invalidate確保寬度變更后立即重繪否則需手動拖動列分隔線才生效。5.3 編譯驗(yàn)證與生產(chǎn)環(huán)境部署 checklist完成修改后按第 3 章流程重新編譯TMSVCLRuntime.dpk。驗(yàn)證步驟新建測試窗體放一個TAdvStringGrid在FormCreate中啟用功能AdvStringGrid1.AutoFitColumnOnDblClick : True; AdvStringGrid1.ColCount : 3; AdvStringGrid1.RowCount : 5; AdvStringGrid1.Cells[0, 0] : 姓名; AdvStringGrid1.Cells[1, 0] : 郵箱; AdvStringGrid1.Cells[2, 0] : 備注; AdvStringGrid1.Cells[0, 1] : 張三; AdvStringGrid1.Cells[1, 1] : zhangsancompany.com; AdvStringGrid1.Cells[2, 1] : 高級工程師負(fù)責(zé)核心模塊;運(yùn)行 → 雙擊“郵箱”列標(biāo)題 → 列寬應(yīng)自動擴(kuò)展至容納zhangsancompany.com雙擊“備注”列 → 寬度應(yīng)撐開至顯示完整中文生產(chǎn)部署 checklist? 修改后的AdvStringGrid.pas已加入版本控制Git commit message 標(biāo)注TMS-5.0.1.2: add AutoFitColumnOnDblClick? 重新編譯的TMSVCLRuntime.bpl已替換所有測試環(huán)境中的舊包? 在 CI 流水線中加入grep -r AutoFitColumnOnDblClick Source/確保源碼變更被檢出? 編寫單元測試TestAdvStringGrid.AutoFitWorks覆蓋空列、長數(shù)字、emoji 字符等邊界 case從那以后我每次接手 Delphi 遺留系統(tǒng)第一件事就是檢查第三方組件是否提供 Full Source——沒有源碼的 UI 控件就像沒有說明書的發(fā)動機(jī)修一次賭一次。而 TMS Component Pack v5.0.1.2 Full Source 的價值不在它多炫的皮膚而在你敢不敢在HeaderDblClick里寫一行Invalidate然后看著整個網(wǎng)格為你重繪。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取