简介:Steema TeeChart Pro VCL与FMX源代码包,是专为使用Delphi或C++Builder的开发者准备的专业图表组件源码,覆盖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 / C++Builder 下做图表、报表、实时曲线的开发者——新手可以绕开安装版的盲区入门,熟手则能直接改动内部绘制链。
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.dpk(GDI+ 渲染驱动)、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 / GDI+ | FireMonkey 场景图 |
| 控件句柄 | 有(HWND) | 无 |
| 目标平台 | Windows 32/64 位 | Windows、macOS、iOS、Android |
| DPI 适配 | 需手动适配高 DPI | 系统级自动缩放,但需注意屏幕 Scale |
| 设计时体验 | 传统 VCL 表单设计器 | FMX 设计器,预览效果更接近运行态 |
选型上我的习惯是:纯 Windows 内部系统无脑 VCL,性能和兼容性最省心;如果产品要出移动端或 macOS 客户端,就上 FMX。2023.38 源码包把两套都给了,编译时用哪个平台取决于 IDE 当前的活动平台,不需要维护两套数据层代码。
2.3 从释放目录到一个可编译的包
源码释放后,第一反应该是“别着急双击.dpk”,先把包之间的依赖关系理出来。TeeChart 核心工程Tee9.dpk只依赖基础 RTL;TeeUI9.dpk负责坐标轴和图例的交互逻辑,依赖Tee9;TeeGDIPlus9.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:Config=Release /p:Platform=Win64 /target:Build # 2) 编译界面逻辑包(依赖上面的 Tee9.dcp) msbuild TeeUI9.dpkproj /p:Config=Release /p:Platform=Win64 /target:Build # 3) 编译 GDI+ 渲染驱动 msbuild TeeGDIPlus9.dpkproj /p:Config=Release /p:Platform=Win64 /target:Build # 4) 数据感知包,用不到数据库就不编 msbuild TeeDB9.dpkproj /p:Config=Release /p:Platform=Win64 /target:Build/p:Config=Release指定 Release 配置,避免调试符号和优化选项影响后续发布;/p:Platform=Win64对应 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属性,而是一条完整的计算链:范围 → 步长初值 → 像素宽度校验 → 标签文本生成。从那以后我每次拿到新版本源码包,都强制走一遍“先查包顺序、再统一输出路径、最后装设计时包”的三步流程,再也没在换版本上浪费过时间。希望帮到你。
本文还有配套的精品资源,点击获取