尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Delphi 12.3 第三方控件包 KonopkaControls 安装与实战应用指南

Delphi 12.3 第三方控件包 KonopkaControls 安装与实战应用指南 简介本资源是专为Delphi 12.3开发者适配的KonopkaControls专业UI控件库v8.0完整安装包面向中高级Delphi桌面应用开发人员解决原生VCL组件在现代界面设计、交互体验与开发效率上的局限性。压缩包共2000个文件涵盖259个编译单元dcu、1127张界面图标png、95个Delphi源码单元pas、108个窗体描述文件dfm及帮助文档chm、示例工程demo、部署配置与设计时支持库bpl/bpi/dcp总大小27.55MB。已有112人下载学习适用于快速构建高颜值、高响应性的企业级Windows应用。用户可直接导入IDE使用预编译组件查阅Source源码进行深度定制参考Help文档与Demo项目掌握高级用法并借助Change-Log精准迁移升级完整覆盖开发、调试、部署全链路需求。1. 项目概述一份来自社区的“宝藏”控件包如果你是一个Delphi的老兵或者正在用Delphi 12.3进行开发那么看到“KonopkaControls-290-8.0-For12.3-01.zip”这个文件名大概率会心头一热。这不仅仅是一个压缩包它背后代表的是一个在Delphi社区里流传了十多年、历经多个版本迭代的第三方控件集合——Konopka Signature VCL Controls。这个包对于许多从Delphi 7、XE时代走过来的开发者而言几乎是界面增强的“标配”工具之一。它的核心价值在于用一组设计精良、功能丰富的可视化组件极大地弥补了原生VCL控件在现代化UI表现力上的不足。简单来说这个控件包能做什么它能让你的Delphi应用程序摆脱那种略显“古板”的经典Windows外观轻松实现类似Office、Visual Studio风格的界面元素比如带分组和复选框的树形视图TVirtualStringTree的增强、功能强大的列表视图、现代化的按钮、面板、状态栏等等。文件名中的“290-8.0-For12.3-01”清晰地指明了它的身份这是针对Delphi 12.3雅典娜版本编译的KonopkaControls第8.0版构建版本号290。对于正在使用Delphi 12.3的开发者来说找到一份能完美安装、稳定运行的第三方控件包本身就是一件省时省力的大事。这份资源通常由热心的社区成员在官方版本基础上进行适配、修复和打包解决了在新版IDE中直接安装老版本源码可能遇到的兼容性问题属于“开箱即用”的宝贵资产。2. 核心组件解析与选型考量为什么在Delphi原生控件已经非常丰富的情况下我们还需要KonopkaControls这样的第三方包这需要从实际开发中的痛点说起。Delphi的VCL框架虽然强大且稳定但其视觉控件库的更新速度尤其是对现代化UI风格如扁平化、高DPI支持、更丰富的交互反馈的跟进相对缓慢。当我们需要开发一个需要媲美现代商业软件质感的应用时原生的TButton、TPanel、TTreeView等控件在默认状态下往往显得力不从心。2.1 核心组件功能矩阵KonopkaControls包并非一个大杂烩它主要聚焦于提升数据展示、导航和容器控件的视觉体验与功能性。以下是其几个核心组件的解析VirtualTreeView (TVirtualStringTree及其衍生)这是该包的灵魂组件甚至可以说很多人用KonopkaControls就是冲着它来的。它并非一个简单的树形控件而是一个高度虚拟化、可定制的数据展示引擎。你可以用它来实现树列表、网格、报告视图、大纲视图等。其“虚拟化”特性意味着它并不直接存储显示数据而是按需向应用程序请求这使得它在处理成千上万行数据时依然能保持流畅滚动性能远超传统的TTreeView和TListView。在KonopkaControls的版本中通常对其进行了功能增强比如更便捷的复选框管理、节点拖拽、自定义绘制支持等。PowerButton (TPowerButton等)这类按钮控件提供了远超TButton的视觉效果。支持多种颜色主题如Office Blue, Silver, Black、平滑的渐变填充、悬停和按下状态的颜色变化、可自定义的圆角以及图标与文本的灵活布局。使用它你可以用几行代码就做出具有专业感的按钮而无需自己从头处理GDI绘图。Panel系列 (TAdvPanel, TCategoryButtons等)这些面板控件提供了带渐变背景、可折叠分组、标题栏按钮如关闭、最大化等高级特性的容器。TCategoryButtons尤其适合用来创建类似Outlook或Windows资源管理器左侧的导航栏每个按钮可以关联一个图标和文本并且支持分组折叠展开交互体验很好。StatusBar (TAdvStatusBar)增强的状态栏控件允许你创建多个面板每个面板可以设置不同的样式如文本、进度条、指示器、对齐方式和外观比原生的TStatusBar美观和灵活得多。选择KonopkaControls而不是其他大型商业控件套件如DevExpress VCL, TMS Component Pack或轻量级皮肤库通常基于以下几点考量首先是成本KonopkaControls在历史上多以免费或捐赠形式传播对于个人开发者或预算有限的团队非常友好。其次是轻量级与聚焦它只解决VCL在特定领域界面增强的短板不会引入大量你用不上的复杂组件保持项目的简洁。最后是社区与传承其核心组件VirtualTreeView的设计理念先进在社区有大量应用案例和讨论遇到问题更容易找到解决方案。注意KonopkaControls的版本迭代与Embarcadero官方IDE的更新并非总是同步。因此像“For12.3”这样的特定版本包尤为珍贵。直接使用为旧版IDE设计的包在新版IDE上安装可能会遇到DCUDelphi编译单元不兼容、设计期包无法注册等问题而这个预编译包则规避了这些麻烦。3. 安装部署与IDE集成实操拿到“KonopkaControls-290-8.0-For12.3-01.zip”后我们的目标是将它安全、稳定地集成到Delphi 12.3的IDE中并能在项目中使用。下面是一个经过验证的详细步骤。3.1 环境准备与文件解压首先关闭所有正在运行的Delphi 12.3 IDE实例。这是为了避免在安装过程中文件被占用导致失败。然后找一个合适的目录来存放控件库的源码和编译文件。不建议放在IDE安装目录或系统盘根目录。我个人的习惯是在D:\Dev\Components下为每个第三方控件库创建独立的文件夹。例如为此包创建D:\Dev\Components\KonopkaControls_8.0_For12.3。将ZIP包中的所有文件解压到这个新建的目录中。解压后你通常会看到类似以下的文件结构\Bin\存放编译好的设计期包.bpl和运行时包.bpl的目录。这是预编译包的核心For12.3意味着这里的.dcu和.bpl文件都是使用Delphi 12.3编译器生成的。\Source\存放所有Pascal源代码.pas文件。即使有预编译的DCU保留源码对于调试和深度定制至关重要。\Demos\示例程序这是学习控件用法的最佳资料。\Help\可能包含帮助文件.chm。一些.txt或.md的说明文档如Readme.txt,Install.txt。3.2 Delphi IDE配置与安装Delphi安装第三方控件主要有两种方式安装设计期包和添加源码路径。对于这个预编译包我们推荐结合两者。步骤一添加源码搜索路径打开Delphi 12.3 IDE。点击菜单Tools - Options。在选项对话框中左侧树形视图找到Language - Delphi Options - Library。在右侧的Library path区域点击末尾的...按钮。在弹出的路径编辑框中添加你的KonopkaControls源码路径例如D:\Dev\Components\KonopkaControls_8.0_For12.3\Source。如果有多个子目录如Core,Components需要将主要的源码目录都添加进去。确保点击OK保存。这个操作的目的是让Delphi编译器在编译你的项目时能够找到这些控件的源代码或.dcu文件。即使我们安装的是设计期包项目编译时也需要这些文件。步骤二安装设计期包在IDE中点击菜单Component - Install Packages...。在弹出的“Project Options for Packages”对话框中点击右下角的Add...按钮。浏览到你解压目录下的\Bin文件夹选择对应的设计期包文件。对于KonopkaControls设计期包的名字通常类似于kcDesignXXX.bpl或KSDesignXXX.bpl其中XXX是版本号。在这个For12.3的包里你可能会找到名为KSDesignD12_3.bpl的文件。选中它点击打开。该包会出现在设计包列表中并且默认已被勾选。点击OK关闭对话框。IDE会提示需要重新构建Rebuild才能生效确认即可。安装成功后你会在Delphi的组件面板Tool Palette上看到新的标签页通常是“Konopka Controls”、“KSVC”或类似的名称。点开它就能看到所有已安装的增强控件你可以像拖放标准控件一样使用它们。3.3 项目中的使用与配置在新建或现有的项目中要使用这些控件还需要确保项目的搜索路径和运行时包配置正确。项目搜索路径右键点击项目选择Options。在Delphi Compiler - Search path中同样添加上面的源码路径。这确保了当前项目能明确找到这些控件单元。运行时包在项目选项的Packages页面你可以选择是动态链接还是静态编译。如果希望最终exe文件独立不依赖外部的.bpl文件则不要勾选Build with runtime packages这样控件的代码会被静态编译进你的exe。如果你希望多个应用共享这些控件库以减少体积则可以勾选并在下方的列表中找到对应的运行时包如KSRuntimeD12_3.bpl并勾选。对于初次使用建议先采用静态编译以减少部署依赖的麻烦。实操心得安装后强烈建议先浏览一遍\Demos\目录下的示例程序。运行这些Demo你能最直观地看到每个控件的功能、属性和事件是如何工作的。这是比查阅文档更高效的学习方式。另外在安装设计期包后如果组件面板没有立即出现新标签可以尝试重启IDE或者检查一下组件面板是否被不小心关闭了可以通过Component - Configure Palette...查看和恢复。4. 核心控件应用场景与代码实战安装配置好之后我们来深入看看如何在实际项目中运用这些控件解决具体问题。这里以最常用的TVirtualStringTree和TPowerButton为例。4.1 使用TVirtualStringTree构建高性能数据网格假设我们需要一个显示产品列表的网格支持多选、行高亮和复选框选择。使用原生TStringGrid或TListView在处理大量数据时会卡顿而TVirtualStringTree则是绝佳选择。首先在窗体上放置一个TVirtualStringTree控件命名为VSTProducts。初始化与列定义procedure TFormMain.FormCreate(Sender: TObject); begin // 1. 设置基本属性 VSTProducts.TreeOptions.PaintOptions : VSTProducts.TreeOptions.PaintOptions - [toShowRoot, toShowTreeLines] // 不显示根节点和树线更像网格 [toShowHorzGridLines, toShowVertGridLines, toFullVertGridLines]; // 显示网格线 VSTProducts.TreeOptions.SelectionOptions : VSTProducts.TreeOptions.SelectionOptions [toFullRowSelect, toMultiSelect]; // 整行选择允许多选 VSTProducts.TreeOptions.MiscOptions : VSTProducts.TreeOptions.MiscOptions [toCheckSupport]; // 启用复选框支持 VSTProducts.Header.Options : VSTProducts.Header.Options [hoVisible, hoColumnResize, hoDrag]; // 显示可调整、可拖拽的列头 // 2. 定义列 VSTProducts.Header.Columns.Clear; with VSTProducts.Header.Columns.Add do begin Text : ID; Width : 60; end; with VSTProducts.Header.Columns.Add do begin Text : 产品名称; Width : 200; end; with VSTProducts.Header.Columns.Add do begin Text : 库存数量; Width : 80; Alignment : taRightJustify; // 右对齐 end; with VSTProducts.Header.Columns.Add do begin Text : 价格; Width : 80; Alignment : taRightJustify; end; // 3. 关联数据获取事件 VSTProducts.OnGetText : VSTProductsGetText; VSTProducts.OnGetNodeDataSize : VSTProductsGetNodeDataSize; VSTProducts.OnInitNode : VSTProductsInitNode; // 4. 加载数据示例 LoadProductData; end;关键事件处理虚拟树的核心思想是“按需提供数据”。我们需要在事件中告诉控件如何显示每个节点的数据。// 首先定义一个记录类型来存储每行数据 type PProductData ^TProductData; TProductData record ID: Integer; Name: string; Stock: Integer; Price: Currency; end; procedure TFormMain.VSTProductsGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize : SizeOf(TProductData); // 告诉树每个节点需要多大的数据空间 end; procedure TFormMain.VSTProductsInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Data: PProductData; begin Data : Sender.GetNodeData(Node); // 获取为该节点分配的数据内存 if Assigned(Data) then Initialize(Data^); // 初始化记录重要 end; procedure TSTProductsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var Data: PProductData; begin Data : Sender.GetNodeData(Node); if not Assigned(Data) then Exit; case Column of 0: CellText : IntToStr(Data^.ID); 1: CellText : Data^.Name; 2: CellText : FormatFloat(0, Data^.Stock); // 格式化数字 3: CellText : Format(%.2f, [Data^.Price]); end; end; // 加载数据的示例过程 procedure TFormMain.LoadProductData; var Node: PVirtualNode; Data: PProductData; i: Integer; begin VSTProducts.BeginUpdate; // 开始批量更新避免频繁重绘 try VSTProducts.Clear; for i : 1 to 10000 do // 模拟1万条数据 begin Node : VSTProducts.AddChild(nil); // 添加根节点 Data : VSTProducts.GetNodeData(Node); Data^.ID : i; Data^.Name : 产品 IntToStr(i); Data^.Stock : Random(1000); Data^.Price : 10 Random(1000) / 100; end; finally VSTProducts.EndUpdate; // 结束批量更新一次性重绘 end; end;通过这种方式即使有上万条数据TVirtualStringTree也能流畅滚动因为它在任何时刻只渲染可视区域内的少数节点。4.2 使用TPowerButton提升界面质感一个普通的“保存”按钮用TPowerButton可以瞬间提升质感。在窗体上放一个TPowerButton命名为btnSave。在Object Inspector中设置属性Appearance选择一种预设主题如Office 2019 Blue。Style设置为bsCommand命令按钮或bsSplitButton带下拉菜单的拆分按钮。设置Caption为“保存”并选择一个合适的ImageIndex如果你关联了一个图片列表。调整BorderOpacity,Roundness等属性微调外观。在代码中你还可以动态改变其状态例如在保存操作期间禁用按钮并显示忙碌状态procedure TFormMain.btnSaveClick(Sender: TObject); begin btnSave.Enabled : False; btnSave.Caption : 保存中...; try // 执行实际的保存操作... Sleep(2000); // 模拟耗时操作 finally btnSave.Enabled : True; btnSave.Caption : 保存; end; end;TPowerButton在禁用、鼠标悬停、按下时都有自带的平滑视觉状态过渡这比原生TButton需要自己处理绘制要方便和美观得多。5. 深度定制、问题排查与性能优化当基础应用满足后我们往往会遇到更复杂的需求和潜在的问题。KonopkaControls的强大之处在于其可定制性但这也意味着需要更深入的理解。5.1 自定义绘制与Owner DrawTVirtualStringTree的OnBeforeCellPaint和OnAfterCellPaint事件允许你完全控制每个单元格的绘制。例如实现根据库存数量改变行背景色procedure TFormMain.VSTProductsBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); var Data: PProductData; begin if Column 2 then // 只对“库存数量”列应用 begin Data : Sender.GetNodeData(Node); if Assigned(Data) and (Data^.Stock 10) then // 库存低于10 begin TargetCanvas.Brush.Color : clRed; TargetCanvas.Font.Color : clWhite; TargetCanvas.FillRect(CellRect); // 填充红色背景 end; end; end;在OnAfterCellPaint中你还可以在标准文本绘制完成后再叠加绘制图标或其他图形。5.2 常见问题排查速查表在使用过程中你可能会遇到以下典型问题问题现象可能原因解决方案设计期控件显示为“灰色框”或无法拖放设计期包.bpl未正确安装或注册。1. 检查Component - Install Packages中对应包是否已勾选。2. 尝试在包列表中找到它Remove后再Add重新安装。3. 以管理员身份运行Delphi IDE后重试。编译时提示“单元xxx未找到”项目的库路径Library Path或搜索路径Search Path未包含控件源码目录。1. 确认在Tools - Options - Library和项目选项的Search Path中都添加了正确的源码路径。2. 路径中不要包含中文字符或特殊符号。运行时错误“Class Txxx not found”运行时包.bpl未正确部署。如果项目使用运行时包但目标机器缺少对应的.bpl文件。1. 如果静态编译确保项目未勾选Build with runtime packages。2. 如果动态链接需将Bin目录下的运行时包如KSRuntimeD12_3.bpl随exe一起发布并确保路径正确。TVirtualStringTree滚动或展开/折叠时闪烁默认的双缓冲可能未开启或绘制操作过于频繁。1. 设置VST.DoubleBuffered : True;。2. 在批量添加/删除节点时务必使用BeginUpdate和EndUpdate包裹。3. 检查自定义绘制事件中的代码是否高效。高DPI显示器上控件显示模糊或错位控件包对高DPIPer-Monitor V2支持不完整。1. 在项目主窗体的OnCreate事件中尝试调用VST.ScaleForPPI(Screen.PixelsPerInch);如果控件支持。2. 考虑在应用程序清单中设置DPI感知模式但需全面测试。3. 这是很多老牌VCL控件的通病有时需要接受一定程度的瑕疵或寻找替代方案。复选框状态更新不及时或逻辑混乱OnChecked等事件处理逻辑有误或未正确处理节点的初始化状态。1. 确保在OnInitNode中正确初始化节点数据包括复选框的初始状态。2. 使用VST.CheckState[Node]来获取和设置状态而不是直接操作底层数据。3. 理解toAutoTristateTracking等选项的含义。5.3 性能优化要点善用BeginUpdate/EndUpdate任何会导致树结构大量变化的操作如清空、批量添加节点都必须放在这对语句之间这将禁止中间过程的屏幕重绘极大提升性能。精简OnGetText事件OnGetText是性能关键路径。确保其中的代码执行速度极快避免进行复杂的计算、数据库查询或字符串处理。如果需要显示计算后的值尽量在数据加载阶段就计算好存储在节点数据中。谨慎使用自定义绘制OnBeforeCellPaint和OnAfterCellPaint会对每个可见单元格调用。确保其中的绘制代码高效避免创建和释放GDI对象如TBrush,TPen。最佳实践是在窗体创建时创建这些对象并复用。节点数据尺寸最小化在OnGetNodeDataSize中返回的数据结构大小应尽可能小。只存储显示和交互所必需的数据。庞大的记录会显著增加内存开销和初始化时间。虚拟模式与分页加载对于海量数据如超过10万条即使TVirtualStringTree也会有力不从心的时候主要体现在初始加载和全选等操作的内存占用上。此时应考虑虚拟模式OnInitChildren等更高级的事件或后台分页加载数据只将当前需要显示的部分数据节点添加到树中。6. 项目迁移与版本兼容性实践在实际开发中我们经常需要将使用旧版本KonopkaControls的项目升级到新版本例如从D7版本迁移到D12.3版本或者在不同的Delphi版本间迁移项目。这个过程可能充满挑战。6.1 从旧项目迁移到“For12.3”版本假设你有一个用Delphi XE8开发的项目里面使用了老版本的KonopkaControls现在你想用Delphi 12.3打开并升级它。备份备份备份这是第一步也是最重要的一步。复制整个项目目录。清理旧的引用在Delphi 12.3中打开项目首先在项目选项的Search Path和Packages中移除所有指向旧版本KonopkaControls的路径和包引用。安装新包按照第3章的方法安装“KonopkaControls-290-8.0-For12.3-01.zip”包。打开并修复窗体文件尝试打开主窗体.dfm文件。IDE可能会提示找不到某些控件的类如TVirtualStringTree变成了TksVirtualStringTree具体类名可能因版本而异。这时需要手动或借助工具来更新.dfm文件中的类名。一个比较原始但有效的方法是用文本编辑器如Notepad打开.dfm文件搜索并替换旧的类名。注意不同版本间类名可能变化你需要对照新包中的控件类名进行修改。重新编译与调试替换类名后在IDE中重新打开项目并编译。你可能会遇到一些API变更导致的编译错误。例如某些属性、方法或事件签名可能发生了变化。这时需要根据编译错误信息查阅新版本的Demo源码或帮助文档逐一调整代码。功能回归测试编译通过后必须对涉及这些控件的所有功能进行详细测试特别是自定义绘制、拖拽、复选框等复杂交互逻辑因为底层实现可能已有变化。踩坑记录我曾将一个使用KonopkaControls 5.x版本的项目迁移到7.x版本最大的变化是复选框相关的属性枚举值发生了重命名例如csCheckedNormal变成了cbChecked。这导致所有与复选框状态判断相关的代码都编译失败。解决办法是仔细对比新旧版本控件的单元文件.pas中的类型定义进行全局替换。因此在迁移前花时间对比新旧版本的源码差异是值得的。6.2 跨Delphi版本的控件包管理策略对于团队开发或需要维护多个Delphi版本的项目管理好第三方控件包是一门学问。版本隔离为每个Delphi版本如11.3, 12.3维护独立的控件库目录。例如D:\Dev\Components\KonopkaControls_For11.3和D:\Dev\Components\KonopkaControls_For12.3。绝对不要混用。源码统一尽量使用同一份源码但为每个IDE版本编译出不同的.dcu和.bpl文件。KonopkaControls的源码通常具有良好的条件编译支持。你可以在一个公共的源码目录下用不同版本的Delphi命令行编译器dcc32.exe或dcc64.exe分别编译到不同的输出目录如\DCU\Win32\Release_11_3,\DCU\Win64\Release_12_3。使用环境变量在IDE的库路径和项目搜索路径中可以使用环境变量来引用控件目录例如$(KONOPKA_PATH)\Source。这样你只需要在系统或IDE中配置一次KONOPKA_PATH环境变量指向对应版本的目录所有相关路径设置都会自动生效切换版本时只需修改这个环境变量的值。项目配置模板创建一个“基础”项目或项目组.groupproj其中已经设置好了正确的搜索路径和运行时包依赖。当启动新项目时可以复制这个模板确保开发环境的一致性。7. 进阶应用构建现代化应用程序界面掌握了单个控件的用法后我们可以将它们组合起来构建一个具有现代感的应用程序界面。这里以一个简单的数据管理程序主界面为例融合多个KonopkaControls组件。界面布局构思顶部使用TAdvToolBar如果包内包含或TPanel配合多个TPowerButton作为功能区。左侧使用TCategoryButtons作为导航栏分组显示“产品管理”、“订单管理”、“报表”等模块。中心区域主工作区根据导航选择动态显示不同的内容。例如当点击“产品管理”时显示一个包含TVirtualStringTree产品列表和底部操作按钮的面板。底部使用TAdvStatusBar作为状态栏显示就绪信息、进度或公司Logo。关键实现技巧导航与内容联动procedure TFormMain.CategoryButtons1Categories0Items0Click(Sender: TObject); begin // 点击“产品管理”导航项 HideAllFrames; // 隐藏所有可能显示的内容帧TFrame if not Assigned(FrameProducts) then FrameProducts : TFrameProducts.Create(Self); // 动态创建产品管理帧 FrameProducts.Parent : PanelWorkArea; FrameProducts.Align : alClient; FrameProducts.Visible : True; AdvStatusBar1.Panels[0].Text : 就绪 - 产品管理模块; end;使用TFrame来封装每个功能模块的界面和逻辑通过动态创建和设置Parent来实现切换比使用TPageControl更灵活内存管理也更清晰不需要时释放。统一视觉风格通过TAdvAppStyler如果包内提供或手动设置统一所有KonopkaControls组件的主色调、渐变方案和字体。确保TPowerButton、TCategoryButtons、TAdvPanel等使用同一套颜色主题如Office 2019 Blue使界面整体协调。响应式考虑虽然VCL对高DPI支持有限但我们可以通过代码做一些基本适配。在窗体的OnResize事件中调整TCategoryButtons的按钮宽度或根据工作区大小动态调整TVirtualStringTree的列宽比例。procedure TFormMain.FormResize(Sender: TObject); begin // 当窗体宽度变化时等比例调整树状图的列宽示例第1列占40%第2列占60%剩余空间 if Assigned(VSTProducts) and (VSTProducts.Header.Columns.Count 2) then begin VSTProducts.Header.Columns[0].Width : Trunc(PanelWorkArea.Width * 0.4); // 第二列宽度会自动填充剩余空间因为设置了合适的选项 end; end;通过这样的组合应用即使使用“古老”的Delphi VCL也能开发出视觉上不落伍、交互流畅的桌面应用程序。KonopkaControls这套控件包正是弥补了原生VCL在“颜值”和部分高级功能上的短板让开发者能更专注于业务逻辑的实现。本文还有配套的精品资源点击获取
返回列表