ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Delphi 12.3下KonopkaControls 8.0控件集安装、使用与常见问题排查指南

Delphi 12.3下KonopkaControls 8.0控件集安装、使用与常见问题排查指南 简介KonopkaControls 8.0控件库专为Delphi 12.3设计由Marcin Konopka开发维护面向桌面应用开发者用于快速实现按钮、列表、树形视图、日历等丰富UI组件减少重复编码。该压缩包共含2000个文件大小27.55MB文件类型涵盖1127个png图像资源、263个hpp头文件、259个dcu编译单元、108个dfm窗体定义及95个pas源文件等便于按需调用或深入修改控件行为。包内还附有变更日志、chm帮助文档、Demo演示工程与Deploy部署说明可帮助开发者理解控件更新细节、掌握使用方式并顺利发布应用。目前已有120人学习下载适合熟悉Delphi、希望快速构建专业界面并提升开发效率的中高级开发者。1. 别对着系统组件抠界面了KonopkaControls 是 Delphi 老牌控件集的打包版在 Delphi 项目里最耗时的往往不是业务逻辑而是界面基础控件的“美化”。一个圆角 Panel 就够你写几十行自绘代码还得处理刷新闪烁。KonopkaControls 是 Delphi 圈子里流传多年的 VCL 控件集专门补原生组件在视觉和交互上的短板。这一份 8.0 打包是配套 Delphi 12.3 环境的文件名写着 Delphi 13实际安装目标就是 RAD Studio 12.3。它把面板、按钮、列表、树、多页签这些高频控件重新实现了一遍解压后编译注册就能像 TButton 一样拖到窗体上。适合不想反复造轮子、又想保持原生 VCL 性能的开发者也适合初学 Delphi、想直接观察高级控件源码那批人。2. 安装到 Delphi 12.3先理清 zip 里的东西再编译注册第三方控件装起来不复杂但翻车的概率极高。这一章我把整个路径走一遍从解压到冒烟测试按顺序来。2.1 解开压缩包后先看什么文件结构与版本标识我拿到这种第三方包的习惯是先看目录结构而不是直接双击 .dpk。这个 zip 解压后通常分为 Source、Packages、Output 三类目录。Source 里是控件的 .pas 和 .inc 单元这才是核心因为 VCL 控件编译时必须能读到这些源码Packages 里放的是 .dpk、.dpcz 或 .groupproj 工程文件用来生成设计期和运行期的 .bpl 包Output 一般是编译产物比如 .dcp、.bpl、.obj。如果压缩包里已经带编译好的 bpl那是别人机器的产物我一般只拿来参考不会直接装因为编译器版本哪怕差一个小版本二进制都未必兼容。注意文件名里的 290 和 8.0。290 我理解是内部 Build 编号8.0 是控件集版本后面的 For12.3 明确告诉你它对应的 IDE 是 Embarcadero RAD Studio 12.3。这里要特别多说一句Delphi 13 只是发布页面的泛称实际源码和包名里的 12.3 才是你该对照的编译环境。如果你的 IDE 是 11.x 或更老不要抱侥幸心理轻则编译不过重则拖崩整个 IDE 环境。在动手前先去 Start Menu 里确认你的环境版本右键点开 Delphi 的 About 窗口看 23.0 这个版本号如果对不上后面所有步骤都要调整。再补充一点解压路径不要带空格和中文。很多人习惯把控件包放在D:\projects\我的控件\KonopkaControls-8.0这种路径在 msbuild 和 IDE 的 Include 搜索里极容易出诡异问题表现是明明文件存在却报 File Not Found。我一般统一放在D:\ThirdParty\KonopkaControls-8.0全英文、短路径和公司项目目录分开方便以后升级。2.2 手动编译还是用脚本两种安装路径安装这类控件有两条常见路径IDE 里打开 groupproj 手动 Build或者用命令行 msbuild 批量编译。我通常选后者因为第三方控件还会牵扯到后续重装系统、换机器脚本是给自己留的后悔药。下面这段是我给 Delphi 12.3 准备的最小批处理路径按你自己的实际安装位置改echo off set STUDIO_ROOTC:\Program Files (x86)\Embarcadero\Studio\23.0 call %STUDIO_ROOT%\bin\rsvars.bat cd /d %~dp0Packages msbuild KonopkaControls_D12.groupproj /t:Build ^ /p:PlatformWin32 /p:ConfigRelease ^ /p:BaseIntermediateOutputPath..\Build\Win32\ /v:minimal pause逻辑很简单第一步用 rsvars.bat 把编译器、路径、环境变量初始化好第二步进入 Packages 目录第三步用 msbuild 构建整个 groupproj 工程组。注意 Platform 这个参数如果我需要 64 位版本就再跑一次把 Win32 换成 Win64Config 选 Debug 还是 Release 决定了生成的是调试版包还是发布版包。BaseIntermediateOutputPath 是指定中间文件的输出位置不写的话 msbuild 会把临时 obj 散在源码目录里之后清理时很麻烦。如果你的机器上没有安装 msbuild或者不想记参数直接在 IDE 里 File Open Project选中 KonopkaControls_D12.groupproj然后右键工程组选择 Build效果是一样的。不同点只在 IDE 会把当前活动平台作为默认目标所以你需要特别注意右下角平台选择器究竟是 Win32 还是 Win64。另一个值得说的是IDE 里 Build 的过程中如果弹一个对话框提示某个 symbol 重复定义八成是上次编译的残留文件没清干净把 Packages 目录里的.dcu、.dcp 手动删掉再试。2.3 让 IDE 认到控件Library Path 与组件面板刷新编译只是生成了 .bpl 和 .dcp要让设计期能拖拽还得做两步。第一步是 把 Source 目录加进 IDE 的 Library Path。打开 Tools Options Environment Variables在 Delphi 编译器的 Library 路径里追加一行指向你解压后的 Source 目录。这一步的作用是让编译器在编译你的项目时能根据 uses 找到 KButton、KPanel 这些单元文件。注意 Win32 和 Win64 两套平台要分别配置路径是同一个但平台影响后续生成的 obj 位数。配置完以后先点一下右上角的 Save再点 OK 退出不然有时不会立即生效。第二步是注册设计期包。在 Component Install Packages 里点击 Add找到刚才编译出来的 .bpl。这个文件一般位于输出目录中比如..\Build\Win32\Release\。选完之后组件面板刷新你就能看到 KControls 标签页。这里有个细节如果你同时编译了 Win32 和 Win64 的包设计期只需要装 Win32 的那个Win64 的运行时包是给你最终发布的 64 位 exe 用的装进 IDE 反而容易造成包路径混乱。如果你打开 Install Packages 窗口后列表里已经存在一个同名包但前面没勾选那可能是之前残留的旧版本。先把它 Remove 掉再 Add 新编译出来的。包名一样但版本不同IDE 不会自动覆盖日志也不会告诉你这是很多“明明装了却看不到控件”的原因。2.4 装完先做冒烟测试放置一个 TkButton我从来不会直接拿业务工程去验证控件包而是新建一个空 VCL 工程在 FormCreate 里动态创建一个 TkButton编译运行看到按钮出现就算通过。下面是最小验证代码interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, KButton; // 关键 usesKButton 单元 type TForm1 class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var Btn: TKButton; begin Btn : TKButton.Create(Self); Btn.Parent : Self; Btn.Caption : Konopka 控件已启动 ; Btn.Left : 40; Btn.Top : 30; Btn.Width : 160; end; end.这段代码刻意避开了设计期的 DFM 写流直接用代码创建是为了隔离出两个变量KButton 单元能不能被编译器找到以及控件的父类构造函数是否正常。如果编译时报 File Not Found那问题在 Library Path如果运行后按钮不显示那问题在包注册或控件自绘代码。冒烟测试通过后你再回到 IDE 面板上拖 TkButton 到窗体里这时才碰 DFM 的流处理。安装这一步的坑很多但思路其实就一句话先源码后包先编译后注册先用代码验证再用设计器。后面第 5 章我会把编译内存错误、组件面板丢失、运行缺 bpl 这几个高频问题单独展开。现在先继续看控件本身怎么选。3. 这五类控件最值得换掉原生组件选型思路与参数KonopkaControls 一共提供了几十个控件但实际项目里高频使用、值得你从原生组件迁过来的我认为是面板、按钮、列表、树、多页签这五类。下面逐个说选型理由和关键参数。3.1 TkPanel圆角面板怎么调以及版本差异很多搜索“panel控件圆角”的人最终都会落到 KonopkaControls 上因为原生 TPanel 在 Windows 上不做自绘很难有圆角。TkPanel 继承了 TCustomPanel核心优势是重写了绘制逻辑让 Color、边框、圆角可以统一控制。在 8.0 这个打包版本里我一般会先看属性面板里有没有 CornerRadius。如果有设为 10 到 16 看效果太小的圆角在 125% 缩放屏上几乎看不出来太大又显得娘。同时把 BorderStyle 设为 bsNone、ParentBackground 置为 False否则圆角和父窗体背景混色视觉上像长了毛刺。参数上可以参考下表具体枚举和默认值以装完后的属性面板为准属性名常见取值作用CornerRadius0 ~ 20圆角半径0 表示直角ColorclWhite / RGB面板底色ParentBackgroundFalse使用父级背景还是自己颜色BevelOuterbvNone / bvLowered外边框样式TransparentFalse是否透明这里要泼一盆冷水CornerRadius 不是所有 Konopka 子版本都有。装完找不到它是正常的我在第 5 章会专门写一个排查记录。如果你急着用可以先在 TkPanel 的 OnPaint 里用 TGraphicUtilities 画圆角矩形或者干脆放一个 TkButton 当背景层——这在很多老项目里反而是最省事的办法。3.2 TkButton 和 TkBitBtn按钮外观与状态原生 TButton 在 Windows 11 上基本不吃 VCL 的样式TkButton 解决的是这件事。它有几个我从 4.0 用到现在的习惯VisualStyle 属性用来在几套预设风格里切换Win XP 风格、Win7 风格、自定义风格FocusButton 控制焦点虚线框是否绘制RepeatInterval 控制鼠标按住不放时定时触发 Click 的间隔适合做步进按钮。我通常会把 RepeatInterval 设为 200毫秒这样用户按住“下一行”时不至于连发太快。如果你的按钮承担的是“删除”“提交”这类危险操作RepeatInterval 必须保持为 0否则长按就会弹出一串确认框。TkBitBtn 适合在按钮上放图标和文字。它与 TkButton 的区别是多了 Glyph 和 Layout 两个属性Layout 可设为 blGlyphLeft 或 blGlyphTop。注意和 TImageList 配合时图标尺寸不要超过 24x24否则按钮高度会强制撑大和表单整体布局不齐。另一个小坑是TkBitBtn 的 Glyph 默认清空后设计期可能还留着旧图的缓存需要把 ParentFont 和 ParentBackground 都改为 True强制它重新走样。3.3 TkListView多列列表的性能与交互如果你接手过一个用原生 TListView 填充几万条记录的项目你会知道滚动重绘有多难受。TkListView 在底层做了 OwnerDraw 的封装把每一个列项的文字、背景、图标的绘制都放到自己的绘制流程里所以它能在列数多、行数大的场景下保持相对稳定。我喜欢它的点在于排序和拖拽不再是黑匣子SortType 可以按列排序OnCompare 让你自定义比较逻辑拖拽列头时可以通过 OnColumnDragged 拿到列索引。常用属性里ColumnClick 决定列头是否响应点击排序RowSelect 让整行高亮MultiSelect 支持多选SortType 需要配合 SortColumn 指定默认排序列。这里放一段自定义排序的代码方便理解 OnCompare 的用法procedure TMainForm.TkListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var S1, S2: string; begin S1 : Item1.Caption; S2 : Item2.Caption; Compare : AnsiCompareText(S1, S2); end;这段代码是典型的按 Caption 文本排序。AnsiCompareText 区分不了中文拼音你要是做中文云盘排序最好先转成拼音首字母再比比完发现顺序不对说明列头点击事件里要主动设置 SortColumn 为当前列索引不然每次点都用的上一次排序列这也是一个隐蔽的状态残留。从小处讲TkListView 的行高和图标缩略图基本能满足看图软件目录的需求从大处讲它和原生 TListView 的数据接口兼容度很高迁移成本集中在 Columns 的列宽设置其他代码改动很小。3.4 TkTreeView树节点状态的自由控制TkTreeView 最实在的功能是节点状态控制和自绘。原生 TTreeView 默认不显示复选框TkTreeView 可以给每个节点单独设 CheckState 为 csChecked、csUnchecked、csGrayed。做权限配置界面时这个功能省掉了一大堆递归判定的代码。OnDrawNode 事件会在节点需要绘制时触发你可以在这里根据节点 Data 里的业务状态改字体颜色。常见做法是procedure TMainForm.TkTreeView1DrawNode(Sender: TCustomDrawTreeView; ACanvas: TCanvas; ANode: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages: Boolean; var DefaultDraw: Boolean); var Data: PMyNodeData; begin Data : PMyNodeData(ANode.Data); if Assigned(Data) and Data.IsGray then ACanvas.Font.Color : clGrayText; end;逻辑说明每个节点 Data 指向你的业务结构当 IsGray 为 True 时把字体调成灰色视觉上让用户知道这个节点不可操作。注意 Data 生命周期要自己管节点删除时要把指针释放掉否则内存泄漏会随着树的反复 Add/Delete 越积越多。另外如果你只需要简单复选不需要自绘可以在树初始化时一次性给每个节点设置 CheckStateNode : TkTreeView1.Items.AddChild(Parent, 节点文本); Node.CheckState : csChecked;这比在 Check 状态变化事件里判断省事很多尤其适合从数据库读出权限码后直接回填的场景。3.5 其它打包里值得把玩的小控件除了上面四个包里还有 TkPageControl、TkTabSet、TkMemo、TkLabel 这些。TkPageControl 的多页签支持关闭按钮和数据绑定适合做设置中心TkMemo 在 4.3 里我会拿它当日志窗用。如果你是从 FireMonkey 过来研究源码的会发现在单元命名和组织上Konopka 仍然走的是传统 VCL 路线类名和文件名直接对应不存在 FireMonkey 那种大量接口和弱类型的东西。熟悉这套以后反过来看 Lazarus 的 LCL 控件结构会觉得思路非常接近——这也是很多人在比较“lazarus 和 delphi 的差距”时会用 KonopkaControls 作为 VCL 风格控件的参照物。顺带说一下下载这个 zip 的人是奔着“控件”来的但真正值钱的其实是它的源码思路一个自绘控件应该如何安排 HitTest、如何让主题色跟随系统、如何处理高 DPI 下的重绘。把这些源码翻一遍比你自己从零写一套自定义控件要快得多。4. 在实际项目里用起来数据填充、事件编写与发布控件装好了接下来要回答的是“怎么用”。我挑四个真实项目里一定会碰到的场景代码可以直接抄。4.1 用 TkListView 展示数据库查询结果实际项目里TkListView 最常见的用法是把数据集内容装成多列列表。下面这段是我常用的模板直接从 TDataSet 派生对象取数uses KListView, Data.DB; procedure TMainForm.LoadListView(AList: TKListView; AQuery: TDataSet); var Item: TListItem; begin AList.Items.BeginUpdate; try AList.Clear; AQuery.First; while not AQuery.Eof do begin Item : AList.Items.Add; Item.Caption : AQuery.FieldByName(FileName).AsString; Item.SubItems.Add(AQuery.FieldByName(SizeMB).AsString); Item.SubItems.Add(AQuery.FieldByName(WriteTime).AsString); AQuery.Next; end; finally AList.Items.EndUpdate; end; end;逻辑说明很简单BeginUpdate 暂停刷新循环里把数据集的三个字段分别写到 Caption 和 SubItemsEndUpdate 恢复。这里特别强调 BeginUpdate/EndUpdate 配对如果循环里数据量很大不包这两句每 Add 一行都会触发一次重绘滚动条会一直抖。参数上如果你在 Form 上已经把 TkListView 的 Column 定义好了三列这段代码不需要任何改动如果 Column 数量多于 SubItems 数量右边会出现空白列反之列表会异常所以列数要对齐。另一个常见需求是列宽自适应。很多人在 TListView 上手动算各列 Width其实可以在 LoadListView 完成后跑一段循环统计每列最大字符数再乘以一个系数效果比神器 Eye 好看得多。注意如果列头有“大小”这种右对齐数据宽度系数要留足 15 到 20 像素否则最后一个数字会被半截遮住。4.2 给 TkButton 写点击逻辑弹窗确认与状态切换按钮控件的逻辑和原生 TButton 没什么区别但它自绘样式更容易引起双击事件的误判断。我在关键操作上喜欢先弹窗确认再切换按钮禁用防止用户在慢接口场景下连点procedure TMainForm.KButton1Click(Sender: TObject); begin if MessageDlg(确定要执行同步吗, mtConfirmation, mbYesNoCancel, 0) mrYes then Exit; KButton1.Enabled : False; try DoSyncProcess; // 真正的同步实现 finally KButton1.Enabled : True; end; end;这里用 try/finally 保证不管 DoSyncProcess 里有没有抛异常按钮都能恢复可用状态。有人在按钮点击事件里只顾着改 Caption忘记恢复 Enabled导致程序看上去卡死了这是最常见的新手翻车点。另外TkButton 的 RepeatInterval 如果被设成非零Click 事件会在按住时重复触发做“确认”“删除”这类操作时一定要检查这个属性否则用户长按一秒可能已经弹了十个确认框。我在交付检查单里会专门有一项危险按钮的 RepeatInterval 必须为 0MouseDown 事件里也不得触发 Click。4.3 TkMemo 当日志窗口AddLine 与自动滚动日志窗口很多人喜欢用 ListBox 的 AddItem但“delphi listbox additem”用久了会发现两个毛病条目多了重绘慢而且复制不方便。我更愿意用 TkMemo 做只读日志区限制最大行数并自动滚到末尾uses KMemo, Winapi.Messages; type TLogWindow class(TKCustomMemo) public procedure Append(Line: string); end; procedure TLogWindow.Append(Line: string); begin Lines.BeginUpdate; try while Lines.Count 5000 do Lines.Delete(0); Lines.Add(FormatDateTime([hh:nn:ss] , Now) Line); SelStart : Length(Text); Perform(EM_SCROLLCARET, 0, 0); finally Lines.EndUpdate; end; end;这段代码处理了两个边界行数超过 5000 时把最早的行删掉保证内存不涨SelStart 归到末尾后执行 EM_SCROLLCARET让插入符可见。如果你的 Thread 里要写日志记住 TkMemo 继承自 VCL 控件跨线程更新必须用 Synchronize 或者 Queue不要直接在后台线程调 Append。还有一点TkMemo 的 ReadOnly 属性要设为 True 并配合 Enabled 为 True这样用户才能选中文本复制但不会乱改日志内容。如果直接把 Enabled 设为 False文字会变成灰色而且没法复制客户体验很差。4.4 发布时要不要带 BPL两种方案的取舍使用第三方 VCL 控件后发布阶段会出现一个典型问题exe 依赖运行时 bpl。两种常见做法是动态带 bpl 还是静态链接。方式优点缺点动态 BPLexe 小多个 exe 共享控件代码发布目录要带 bpl 文件一换版本就全乱静态编译单文件部署不依赖 bplexe 体积增大升级控件需要重新编译全部 exe我发布给客户的工具一般选静态编译做法是在 Project Options 的 Runtime Packages 里把 Build with runtime packages 勾掉。注意这也会把 Delphi 自带的 VCL 包一起静态编译exe 体积会涨 5 到 10 MB但对交付环境干净的客户来说最省心。如果你坚持动态发布记得把 Konopka 的 bpl 名称和 Delphi 的 rtl bpl 名称一块记在发布清单里。我吃过一次亏只带了 Konopka bpl忘了带 vcl 的运行时包客户机器双击报错。从那以后我发布前会开 Process Monitor 抓一次缺哪些 module而不是靠猜。Konopka 这套控件不负责 Excel 导出之类的业务别指望它帮你收编 OLE 代码。它做的是界面基础设施数据导出还是得单独用其他方案。5. 避坑 / 常见问题排查安装与使用踩过的五个坑这一章我挑了五个真实发生过的坑全部按“现象 → 原因 → 解决”写。5.1 编译时狂报“内存错误”玄学根源与重试策略现象用 IDE 打开 groupproj 编译编译到一半弹出“内存错误”或者“Access Violation”进程退出。原因多数时候不是真内存不足而是 IDE 在编译第三方包时加载了旧版本的 .dcp 或者残留的 .bpl符号表冲突有时候是 Windows 的用户环境变量里 PATH 太长导致 msbuild 子进程无法分配临时空间。解决先关掉 IDE把包目录下的 __history、Build 中间目录全部删掉重新编译一次。如果还报错就把 cmd 里的 set PATH 清成只保留系统必要项再跑 msbuild。如果你用 Win64 但本机内存小于 8G也老老实实先编 Win32。再不行把杀毒软件的文件监控临时关掉它在文件夹写入频繁时会锁文件和编译器抢资源。5.2 组件面板没有出现 KControls 标签页现象bpl 已经 Add 到 Install Packages但组件面板刷新后没有标签。原因最常见是装了 Win64 的 design-time bpl。设计期包必须是 32 位因为 IDE 本身就是 32 位进程装 64 位包毫无意义。解决回到 Component Install Packages 里查看列表包路径如果指向 ..\Win64\ 就要移除重新 Add Win32 输出目录下的同名 bpl。另一个坑是 IDE 缓存删掉 %AppData%\Embarcadero\BDS\23.0\Packages下一次启动会自动重建。注意不要删整个 BDS 文件夹只删 Packages 子目录不然你做过的设计期包设置会全部丢失。5.3 运行时提示找不到 xxx.bpl现象程序在 IDE 里跑得好双击 exe 报“找不到 bpl”。原因IDE 运行时会把包路径注入到 PATHexe 依赖的运行时 bpl 没有和 exe 放一起。解决如果你选择动态 BPL 发布把编译出来的 Konopka 运行期 bpl 复制到 exe 目录更省事的是按 4.4 改成静态链接。提醒一点静态链接需要把全部相关单元的 .dcu 都可用不然会报个别符号缺失。如果真的缺符号回到 Library Path 看是不是 Source 路径被系统环境变量覆盖了这个现象很隐蔽明明单元能编译链接时却找不到。5.4 和其它皮肤控件冲突TkButton 纹丝不动现象用了 VCLSkin 或 AlphaControls 后TkButton 还是默认风格不受皮肤影响。原因Konopka 控件自绘时没有走系统的 Common Controls 接口皮肤包的全局 Hook 拦不到它的绘制。解决在皮肤引擎的排除列表里加入 TkButton、TkPanel 的类名让皮肤不对它们生效或者反过来把皮肤的 Hook 排除整个 KControls 包。两个方案都可行我一般选前者因为皮肤负责窗体和原生控件Konopka 管自己的控件区域。如果你两个都要把 TkButton 的 VisualStyle 设成 vsCustom然后在自定义绘制里主动读取皮肤的颜色变量能做到视觉统一但代价是需要熟悉两边的绘制流程。5.5 想要圆角但属性面板里没有 CornerRadius现象照着网上教程找 CornerRadius属性面板里根本没有。原因8.0 版本里有几个子发布号CornerRadius 是某个子版本之后才加进 TkPanel 的也可能你装的是另一个分支的 Konopka 源码比如从远端仓库拉的 master 分支而非 8.0 标签。解决先看包内 CHANGES 文本确认子版本。没有该属性时最稳的圆角方案是 TkPanel.OnPaint 里画圆角矩形路径再把 Panel 的 StyleElements 里 seClient 关掉避免 VCL 主题覆盖你刚画的内容。代码很短但它能让你在老版本上也能实现同样效果而且不会影响布局。6. 进阶建立“控件验收空工程”一劳永逸地验证第三方包最后这一章要讲一个进阶做法。我装完任何 VCL 控件包都会建一个空工程把包里的控件类按单元名逐一用代码创建一遍然后编译 Release 和 Debug 两个配置。这个空工程不承担业务只承担“验收”。对 KonopkaControls 来说验收工程需要覆盖所有放在组件面板里的控件至少包括 TkPanel、TkButton、TkBitBtn、TkListView、TkTreeView、TkPageControl、TkMemo 这些。你可以在 FormCreate 里这样写uses KPanel, KButton, KBitBtn, KListView, KTreeView, KPageControl, KMemo; procedure TAcceptanceForm.FormCreate(Sender: TObject); var P: TKPanel; B: TKButton; BB: TKBitBtn; LV: TKListView; TV: TKTreeView; PC: TKPageControl; M: TKMemo; begin P : TKPanel.Create(Self); P.Parent : Self; P.Caption : P; B : TKButton.Create(Self); B.Parent : Self; B.Caption : B; BB : TKBitBtn.Create(Self); BB.Parent : Self; BB.Caption : BB; LV : TKListView.Create(Self); LV.Parent : Self; TV : TKTreeView.Create(Self); TV.Parent : Self; PC : TKPageControl.Create(Self); PC.Parent : Self; M : TKMemo.Create(Self); M.Parent : Self; end;编译一次如果能过说明单元引用、运行时包、静态链接都正常运行时不崩说明控件构造函数没有依赖编译期顺序。然后我再打开一个新的空窗体从组件栏拖一个 TkPanel 到设计器改一下 Caption保存 DFM关掉重开——这一步验证 DFM 流化能抓到“设计期可以放、运行期读不出来”的诡异问题。这个验收工程我还会放进 Git 仓库并在 README 里标注控件版本和安装日期。换电脑时只要把同一版本打包的 zip 和验收工程拉下来先跑一遍再干活绝对不会出现“代码一模一样新机器编译不过”的情况。从那以后我每次换机器装 Delphi都强制先把这个验收工程拿出来跑一遍再开始处理业务代码。第三方控件虽然好用版本冲突也最凶空工程相当于后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表