TeeChart源码版实战:从编译安装到坐标轴深度定制 简介Steema TeeChart Pro VCL与FMX源代码包是专为使用Delphi或CBuilder的开发者准备的专业图表组件源码覆盖Windows、macOS、iOS和Android等主流的桌面与移动平台。它解决的是跨平台应用中数据可视化集成难的问题尤其适合需要展示大量业务数据的行业项目。压缩包内共2000个文件约21MB以492个pas单元文件为源码核心配合212个fmx跨平台界面、131个dfm窗体定义、378个dpk工程包以及res资源、bmp位图、tee模板、shp地图数据等辅助模块结构清晰便于作为VCL或FMX工程直接引用、阅读和深度定制。目前已有280人学习下载。通过完整源码开发者可以修改图表的渲染逻辑、坐标轴刻度、图例样式与交互反馈实现符合业务场景的自定义图表还能研究控件在大数据量下的绘制效率优化策略用于金融分析、实时监控、商务报表或工业数据展示等场景。1. TeeChart 源码版为什么我把图表控件从安装包换成了源码包之前做一个数据采集桌面端客户反复要求把 Y 轴标签改成“万”为单位、网格线密度也得按业务规则走我对着 TeeChart 的安装版控件来回调事件越调越像在修黑匣子——事件触发条件看不见内部步长怎么算也猜不透。后来换成 TeeChart Pro 的源码版2023.38直接把断点打进 TeeChart 的内部绘制函数刻度与网格线的生成逻辑才算真正拿到手里。这套源码同时覆盖 VCL 和 FMX 两套框架VCL 做传统 Windows 桌面FMX 做跨平台移动与 macOS 客户端。它解决的是“控件行为需要深度定制”的场景适合在 Delphi / CBuilder 下做图表、报表、实时曲线的开发者——新手可以绕开安装版的盲区入门熟手则能直接改动内部绘制链。2. 认识 TeeChart Pro 2023.38 源码包VCL 与 FMX 的架构差异和包结构2.1 源码版 vs 安装版一次“黑匣子”引发的换源安装版 TeeChart 交付的是编译好的运行时包与设计时包公开 API 暴露了TChart、TChartAxis、TLineSeries等类但刻度计算、标签格式化、坐标轴自动范围的决策逻辑全封装在已编译单元里。你调用Axis.Maximum拿到的是一个结果拿不到“这个结果是怎么算出来的”。多数时候这够用可一旦遇到定制需求就只能靠猜测和试错。源码版把.pas源文件和.dpk工程全部摊开。TeeChart Pro 的源码包按功能拆成多个运行时工程常见命名是Tee9.dpk图表核心、TeeUI9.dpk坐标轴与图例界面逻辑、TeeGDIPlus9.dpkGDI 渲染驱动、TeeDB9.dpk数据集感知组件FMX 侧对应TeeFMX9.dpk这一串。9代表主版本代际2023.38 这个版本号里2023是发布年38是小版本递增号意味着修了不少绘制与数据感知相关的缺陷。我印象最深的一次客户要求把 0 值标签隐藏并显示为“--”。公开事件OnGetNextLabel确实能改文本但调试时发现0.00和0.0两种格式走了不同分支安装版里根本看不见分支判定在哪。换源码版后我在标签格式化函数里下断点跟了一次调用栈五分钟就定位到是数值格式化掩码没有统一问题在FormatValue内部。这一个月事件 API 是调不透的源码一行能说明白。2.2 VCL 与 FMX同一套图表 API两套渲染体系VCL 和 FMX 在 TeeChart 里共用大部分Series逻辑和数据模型但底层渲染完全不同。VCL 版跑在 Windows 原生句柄上底层走 GDI / GDI控件句柄稳定跟 Win32 桌面程序、老项目对接非常顺FMX 版基于场景图渲染控件没有传统句柄绘制由 GPU 或 CPU 统一合成因此能跨 Windows、macOS、iOS、Android。同一个TLineSeries的AddXY数据接口在两边完全一致但坐标轴的字体测量、DPI 缩放、抗锯齿表现各有一套实现。维度VCL 版FMX 版渲染底层GDI / GDIFireMonkey 场景图控件句柄有HWND无目标平台Windows 32/64 位Windows、macOS、iOS、AndroidDPI 适配需手动适配高 DPI系统级自动缩放但需注意屏幕 Scale设计时体验传统 VCL 表单设计器FMX 设计器预览效果更接近运行态选型上我的习惯是纯 Windows 内部系统无脑 VCL性能和兼容性最省心如果产品要出移动端或 macOS 客户端就上 FMX。2023.38 源码包把两套都给了编译时用哪个平台取决于 IDE 当前的活动平台不需要维护两套数据层代码。2.3 从释放目录到一个可编译的包源码释放后第一反应该是“别着急双击.dpk”先把包之间的依赖关系理出来。TeeChart 核心工程Tee9.dpk只依赖基础 RTLTeeUI9.dpk负责坐标轴和图例的交互逻辑依赖Tee9TeeGDIPlus9.dpk是渲染驱动又依赖TeeUI。依赖顺序错了编译第一个包时就会提示找不到某个.dcp。目录里通常有Sources、Compiled、Lib之类的分层。Sources下放.pas源文件不同框架子目录会用VCL、FMX区分Compiled或Lib是编译输出的.dcp/.bpl/.bpi文件存放地。你需要在 IDE 的Tools Options Delphi Library里把Sources根目录和对应框架子目录加进搜索路径否则编译时 IDE 找不到TeeChart单元。3. 编译与安装把源码包变成能拖拽的组件3.1 环境准备IDE 版本、目标平台与路径拿到 2023.38 源码先确认你本机的 Delphi 版本是否在兼容列表内。Rad Studio 11 和 12 对这套源码的支持比较完整老版本会面临部分单元 API 不匹配的问题。然后决定主编译平台纯 Windows 桌面选Win32或Win64要做 macOS / iOS / Android 就切到对应平台再编译 FMX 包。平台选择影响输出目录。我一般会把所有包的输出路径统一到一个地方比如C:\TeeChartPro\Output\Win64统一输出目录是为了避免一个经典问题包 A 编译出来的.dcp放在默认的.\Win64包 B 编译时却去另一个目录找结果提示找不到。下面的脚本是我在 Windows 命令提示符下常用的编译序列# 建议以管理员身份运行。先进入源码根目录再逐个编译。 cd D:\ThirdParty\TeeChartPro2023.38 # 1) 编译核心运行包 msbuild Tee9.dpkproj /p:ConfigRelease /p:PlatformWin64 /target:Build # 2) 编译界面逻辑包依赖上面的 Tee9.dcp msbuild TeeUI9.dpkproj /p:ConfigRelease /p:PlatformWin64 /target:Build # 3) 编译 GDI 渲染驱动 msbuild TeeGDIPlus9.dpkproj /p:ConfigRelease /p:PlatformWin64 /target:Build # 4) 数据感知包用不到数据库就不编 msbuild TeeDB9.dpkproj /p:ConfigRelease /p:PlatformWin64 /target:Build/p:ConfigRelease指定 Release 配置避免调试符号和优化选项影响后续发布/p:PlatformWin64对应 64 位目标/target:Build表示执行完整构建。这一步产出的是.bpl运行包和.dcp编译描述文件后续安装设计时包和引用运行时包都要用到它们。3.2 搜索路径与输出目录的细节Library路径里要加的是“源码目录”而不是“输出目录”这个不能搞反。IDE 编译项目时通过搜索路径找.pas源文件.dcp则是编译器根据Output目录或库路径自动查找。我见过不少开发者在 Library 里加了输出目录、没加源码目录结果 IDE 一直提示找不到TeeChart.pas。路径设置的排列顺序也有讲究。如果机器上装了旧版 TeeChart两个版本共用一个Tee9.pas会出大问题。把 2023.38 的Sources路径放在最前面能保证编译器优先命中新版本单元。Output目录建议在 Tools Options 里按目标平台分别设置如$(TeeRoot)\Output\$(Platform)这样Win32和Win64的编译产物互不覆盖切换平台时不会出现“刚编译好的 64 位包突然被 32 位包覆盖”的诡异情况。3.3 安装设计时包组件面板出现的最后一步编译完成后打开 IDE 菜单Components Install Packages点击Add选择你编译输出的设计时包。设计时包的文件名里会带Design或D后缀这是给 IDE 工具面板用的工程里面注册了组件类和属性编辑器。选包时注意区分运行时包Tee9.bpl、TeeGDIPlus9.bpl编译出来的 VCL 程序运行时需要它们设计时包TeeDesign.bpl或TeeD9.bpl只负责在设计器里显示组件、弹属性编辑器安装后组件面板会出现TChart、TChartGrid、TChartListBox等条目。如果面板里没出现大概率是设计时包和运行时包的平台不一致——比如 IDE 跑在 64 位但装了 32 位设计时包。此时重新在Win64平台编译一次设计时包即可。TChart拖到表单上后默认会自动创建一条空序列。此时双击控件打开 TeeChart Editor里面能直接添加Line、Bar、Area、Pie等系列类型这些编辑器页面本身也是源码包的一部分说明源码包里连设计时编辑器都能改不只是画图逻辑。4. 避坑手记TeeChart 源码版从编译到使用的 5 个翻车点4.1 编译顺序颠倒导致dcp找不到现象编译TeeGDIPlus9.dpkproj时报错F2504 未找到 Tee9.dcp但源码目录里明明有Tee9.pas。原因.dcp是编译器对已编译单元的索引描述文件必须在源单元编译成功后才生成。TeeGDIPlus引用了Tee核心单元中的类型如果先编译上层包编译器在搜索路径里能找到.pas但找不到对应的.dcp于是拒绝继续。解决严格按照依赖顺序Tee9 → TeeUI9 → TeeGDIPlus9 → TeeDB9。如果之前已经编译了一半把Output目录里的残留.dcp全删干净再重来一次。血的教训残留的旧版.dcp会产生类型定义不一致报错信息比不出问题还难查。4.2 64 位编译成功但组件面板空白现象源码全部编译通过安装设计时包后组件面板里没有出现任何 TeeChart 组件。原因IDE 工具面板加载的.bpl必须与 IDE 目标平台一致。Rad Studio 在 64 位模式下安装的是 64 位设计时包但你编译最后一次时切回了Win32装的是 32 位.bpl从而加载失败或静默跳过。解决确认 IDE 右上角目标平台显示为Win64重新打开设计时包工程执行Build然后再去安装。安装完成后看状态栏是否提示“包安装成功”而不是只看面板。4.3 FMX 移动端编译时报找不到 iOS / Android 单元现象编译 FMX 版本时切换到iOS Device或Android平台后提示找不到Macapi.CoreGraphics或Androidapi.JNI.JavaTypes。原因FMX 版 TeeChart 的某些渲染单元依赖平台 SDK 的绑定单元。这些单元由 IDE 的 Platform SDK 提供不在 TeeChart 源码包里。常见原因是 IDE 当前活动平台的 SDK 路径没配好或移动平台附加组件未安装。解决先回到Win64平台确认 FMX 包能正常编译排除 TeeChart 自身问题。再检查Tools Options Language Delphi Library里切换到对应平台确认$(BDS)\PlatformSDK\...搜索路径存在。移动端编译还要确认SDK 管理器里安装了对应版本的 iOS / Android SDK。4.4 发布后图标丢失或中文标签变乱码现象编译运行一切正常打包发布到客户机后图表上的图标变成了空白方块中文标题显示为乱码。原因TeeChart 运行包把若干资源文件图标、内置图片、图像映射存放在.res资源文件里发行时只复制了.bpl没有把资源文件合并或随包分发。中文乱码则是字体设置问题VCL 默认字体在客户机上不一定存在或代码页不一致。解决一种做法是把.res文件通过{$R}指令链接进主程序的可执行文件另一种是在客户机上安装完整运行包。中文乱码在部分特殊环境中可通过在TChart创建后显式设置Chart.Font.Name : Microsoft YaHei规避。这个坑在安装版里几乎不会碰到因为安装程序会带全资源源码版只给源码资源管理就得自己留意。4.5 高 DPI 环境下坐标轴文字模糊现象在 150% 缩放的 Windows 显示设置下图表序列正常但坐标轴刻度文字虚化网格线位置与文字错位。原因VCL 版在默认情况下不感知高 DPI位图缩放由系统拉伸导致模糊。TeeChart 的坐标轴测距基于逻辑像素而窗口实际像素尺寸被系统缩放导致文字渲染拉伸。解决VCL 程序在工程文件 .dpr里添加Application.HighDPIAware : True;放在Application.Initialize之前。FMX 版则要注意设计器里的Width和Height用的是逻辑单位运行时按屏幕Scale自动换算不再额外处理。顺带一提TeeChart 2023.38 对高 DPI 下的坐标轴间距做了优化但前提是宿主程序把 DPI 感知打开。5. 进阶用源码调试坐标轴刻度计算定位“标签消失”玄学定制图表时最常遇到的“玄学”是刻度标签一会儿显示一会儿消失。与其在外围反复设置Axis.LabelsSeparation不如在源码里看清刻度生成的完整链路。TeeChart的坐标轴标签数量由CalcInc和CalcLabelsSeparation两个函数决定。CalcInc计算主刻度步长CalcLabelsSeparation根据像素宽度判断标签是否放得下。源码版的作用在于你可以直接在这两个函数里下断点运行时观察步长和像素宽度的中间值。举一个我做过的调试场景Y 轴范围 0 到 12000默认步长 2000显示 7 个标签客户要求改成 2500 步长直接给Axis.Increment : 2500不生效这是因为范围自动计算时CalcInc重新算了一遍。处理这种问题常规路径是用坐标轴事件在Axis.OnGetNextLabel里改标签文本。这是安装版能做的极限源码版可以更进一步看看步长到底怎么被覆盖。// 坐标轴刻度标签格式化把 12300 显示成 12.30k procedure TForm1.Chart1Axis_GetNextLabel( Sender: TObject; LabelIndex: Integer; var LabelText: string); var LValue: Double; begin // StrToFloatDef 避免解析失败导致空白标签 LValue : StrToFloatDef(LabelText, 0); // 按“千”换算保留两位小数 LabelText : FormatFloat(0.00k, LValue / 1000); end;这段代码挂在TChartAxis.OnGetNextLabel上LabelIndex是当前标签的序号LabelText是带原始数值的字符串。改完LabelText后绘制引擎直接使用新文本。我当时的做法是在TeeChart的TAxis.CalcInc内部入口下断点运行时看CalcInc的返回值是否等于2500——结果发现坐标轴Automatic : True时根本不会走外部设置的Increment源码内部把范围除以期望标签数重新算了步长。这才是标签“不听话”的真正原因。验证技巧也很简单把Increment设置好后把Automatic改为False。之后再在OnGetNextLabel里格式化刻度步长就不会被内部逻辑覆盖。源码让你看见的不是一个神秘的Increment属性而是一条完整的计算链范围 → 步长初值 → 像素宽度校验 → 标签文本生成。从那以后我每次拿到新版本源码包都强制走一遍“先查包顺序、再统一输出路径、最后装设计时包”的三步流程再也没在换版本上浪费过时间。希望帮到你。本文还有配套的精品资源点击获取