简介:数据可视化是现代应用程序开发中的关键环节,尤其对于桌面和跨平台应用,图表控件直接影响用户体验与开发效率。在Delphi生态中,TeeChart Pro作为老牌商业图表解决方案,凭借丰富的图表类型和灵活的定制能力,长期被用于金融分析、项目管理等复杂业务场景。它同时支持VCL与FMX两大框架,允许开发者以几乎一致的API在Windows、macOS、Android等平台构建图形界面,大大降低了跨平台迁移的维护成本。然而,在Delphi 12 Athens版本升级后,内置的TeeChart Lite版往往无法满足高级功能需求,完整商业版TeeChart Pro的编译安装便成为许多工程师面临的现实问题。内容涵盖环境准备、源码包结构、编译安装流程与常见错误排查,完整呈现了在Delphi 12.3上部署TeeChart Pro VCL & FMX Full Source的实操过程,助力开发者快速构建可用的图表开发环境。 在Delphi圈子里,TeeChart几乎是和Delphi绑定最深的第三方图表控件了。从早期的Delphi 5开始,它就作为标配出现在安装光盘里,一直到今天,IDE里依然内置着TeeChart的标准版。但到了Delphi 12 Athens这一代,如果你接手的是老项目,或者需要在VCL和FMX两个框架同时出图,就会发现内置的TeeChart Lite版本经常不够用,这时候就得请出Steema的完整商业版——TeeChart Pro。
我这次在Delphi 12.3上安装的,就是Steema TeeChart Pro VCL & FMX v2023.38,带Full Source(完整源码)的版本。这篇文章把整个流程和期间踩过的坑记录下来,给同样在Delphi 12 Athens上折腾图表的同学做个参考。
1. 项目概述:拆解这份TeeChart Pro源码包
1.1 Delphi 12 Athens版本升级时的“控件魔咒”
做Delphi开发的老哥们应该都有体会,每一个大版本迭代,最让人头疼的不是语言本身的变化,而是项目里那一堆第三方控件的兼容性。Delphi 12 Athens这代IDE发布之后,我周围不少朋友升级工程时都遇到过同一个问题:打开老项目,提示某个包找不到、某个组件无法创建实例、或者编译时直接报“Unit xxx was compiled with a different version of xxx”。这些问题的根源,基本都是第三方控件没有跟上新IDE的版本。
TeeChart在这里还算是情况比较好的。因为Embarcadero官方一直和Steema有合作,IDE本身会带一套基础版的TeeChart(Lite版),很多老项目直接用它做图形展示也没啥大问题。但真到业务复杂的时候,Lite版就不够看了,比如金融K线、甘特图、股市图、3D表面图、多层轴、多序列叠加这些功能,Lite版本要么没有,要么做出来性能很难看。这时候,靠的就是TeeChart Pro这种完整商业版。而它在新IDE上能不能顺利编译安装,就是升级路上的第一道坎。
1.2 v2023.38源码包里的真实内容
这份压缩包名字里包含的几个关键词,每个都值得拿出来说一下:
- Delphi 12.3 / Delphi 12 Athens:说明这个版本是明确匹配Delphi 12系列的。虽然TeeChart的代码相对稳定,但 IDE 每次更新,组件面板、RTL 的接口、编译器版本号都会变,源码包必须重新编译才能被新 IDE 正确加载。
- VCL & FMX:VCL是Windows原生控件库,FMX是FireMonkey跨平台框架。这个包里两套框架的源码都有,也就是说它既能服务传统的Windows桌面项目,也能用在Android、iOS、macOS、Linux的FMX项目里。
- Full Source:不是只给bin、不给源码的试用版,而是拿到手就是一整套可以修改、重新编译的源码。对Delphi开发者来说,Full Source意味着你可以自己调试控件内部逻辑,也可以按需裁剪,不依赖官方编译器的版本。
- v2023.38:Steema的版本号一直按年份递增,这个版本对应的是2023年的第38个发布迭代。版本号本身不是越高越好,重要的是和你的IDE版本匹配。
所以这份包的实际价值,不是“装完就行”,而是“装好之后,它能成为你自己的控件库的一部分”,后面做定制开发时,底子是完整的。
2. 选型解析:为什么非TeeChart Pro不可
2.1 在VCL和FMX之间来回横跳
很多老Delphi程序员是从VCL一路用过来的,Windows上做桌面管理系统,VCL确实高效稳定。但最近几年,移动端和跨平台桌面需求越来越多,FMX就成了绕不开的选择。
问题在于,很多图表控件只做了一套VCL,你要在FMX里用,就只能换工具。但业务端画图表的逻辑是现成的,换控件等于重写一遍数据绑定和画面布局,这成本谁都受不了。
TeeChart Pro让我最满意的一点,就是它的API设计在VCL和FMX两套框架下保持了高度一致。同一个套路,在VCL里是Chart1.Series[0].Add(X, Y, '', clRed),在FMX里也差不多的写法。虽然底层绘制机制完全不同(VCL走GDI/GDI+,FMX走GPU加速的Canvas),但我的业务代码基本不用动,只是改一下控件引用和窗体类型。这就是选型时最值钱的地方——跨平台的迁移成本被压得非常低。
2.2 Full Source版本的真实取舍
带Full Source的控件,在业内评价两极分化。喜欢的人觉得“源码在手,天下我有”,不喜欢的人觉得“源码包编译配置太麻烦,不如装个编译好的bin”。
我的观点是,Delphi生态里做图形类控件,有源码绝对是加分项。因为图表的定制场景太多了,官方给的默认配色、字体渲染、鼠标交互模式,到你手里的真实业务里往往都要微调。没有源码的时候,你想改一个坐标轴标签的渲染逻辑,只能靠控件提供的官方事件硬凑;有了源码,你可以直接看着TeeChart的绘制源码,找到DrawAxisLabel这类函数,改完重新编译就能看到效果。这在图表类控件里,属于“我就是要抄它底层逻辑”级别的便利。
当然,风险也有。源码包编译过程对新手不算友好,如果路径设置不对、缺依赖、IDE库路径混乱,就会编译失败。但这些问题都有规律,后面我会把整个过程捋一遍,按步骤来基本不会出岔子。
2.3 商业授权边界提醒
这里必须提醒一句:TeeChart Pro是商业软件,不是免费开源的。网上很多地方流传的“Full Source”资源,在商业项目里使用前一定要确认授权方式。个人学习、评估阶段用没问题,但如果你在公司项目里要分发、要商用,建议去Steema官网搞清楚Licensing条款,别因为一时图方便,后面被追授权费。开源的LCU(Libraries for Compiler Utilities)类库也不是万能挡箭牌,商业合规这块,自己心里要有数。
3. 环境准备与安装全流程实录
3.1 安装前的三项必要检查
不管是什么控件,安装前我习惯先做三件事,磨刀不误砍柴工:
检查IDE版本:打开Delphi 12.3,点“Help → About”,确认主版本号。TeeChart源码包一般会区分Delphi 12和Delphi 11对应的分支,装错了编译会直接报版本不匹配。
规划解压路径:解压路径里必须纯英文,不能有空格,也不能有中文。Delphi的老毛病,安装路径带中文或空格,经常让一些组件在设计期加载时出诡异问题。我一般放在D:\Libs\TeeChartPro202338这类干净的路径。
确认第三方依赖:TeeChart Pro本身不依赖太多第三方库,但它的demo和demos需要额外的一些包,这个不影响正式使用。在动手编译之前,最好把IDE的Library路径设置好,因为后面编译生成的*.bpl文件要能被IDE找到。
3.2 编译安装的完整步骤
下面是我在Delphi 12.3上按照完整流程操作下来的记录,基本上一遍过。
第一步:解压源码包
用7-Zip解压TeeChart Pro v2023.38 Full Source.7z到指定目录。解压后你会看到很明显的目录结构,类似:
Sources VCL Compiler Delphi12 TeeChartProVCL.dpk DclTeeChartProVCL.dpk FMX Compiler Delphi12 TeeChartProFMX.dpk DclTeeChartProFMX.dpk ...里面通常还包含Compiled文件夹、Demo文件夹和Help文件夹。Compiled里一般会有预先编译好的BPL文件,但强烈建议自己重新编译,因为IDE的Build版本可能不同,直接用预编译的BPL很容易出现“不能加载,包版本不符”的错误。
第二步:编译并安装运行时包(Runtime Packages)
打开Delphi 12.3,通过File → Open Project打开TeeChartProVCL.dpk。在工程管理器里右键这个项目,选Compile。编译生成的是运行时包(不带Dcl前缀,也就是设计期不需要的那个包)。如果编译过程没有报错,就直接Install,安装成功之后,组件面板里会出现TeeChart相关的组件页。
这里需要注意一个细节:先编译运行时包,再编译设计时包。DclTeeChartProVCL.dpk是设计期包,它在IDE里负责往组件面板注册组件、弹出属性编辑器。如果你只装设计时包不装运行时包,编译运行时会找不到运行库,项目根本编译不过去。两者是配套关系,缺一不可。
第三步:编译并安装设计时包
同样流程,打开DclTeeChartProVCL.dpk,先Compile,再Install。安装时IDE会有短暂假死状态,多等几秒就好。
安装完成后,打开组件面板,在TeeChart 9或类似页签下,应该能看到TChart、TChartEdit、TChartPreviewer等一堆组件。如果名字带TeeChart Pro字样,说明这安装的确实是Pro版,而不是Lite版。
第四步:配置搜索路径
在Tools → Options → Delphi Options → Library里,把TeeChart的Sources路径加进去。我一般会加:
D:\Libs\TeeChartPro202338\Sources\VCLD:\Libs\TeeChartPro202338\Sources\FMX- 还有它内部可能存在的
Compiled\Delphi12路径
这个路径配置很重要。如果你不把Sources加到搜索路径里,后续新建工程引用TeeChart相关单元时,IDE找不到VCLTee.TeeProcs等单元,就会编译报错。我在很多新手机器上都见过这个问题,明明包安装成功了,但一用就报“File not found: VCLTee.TeeProcs”,原因就在这里。
第五步:重新编译老项目
以上都完成后,再打开之前报错的老项目,等IDE重新编译一遍。如果项目代码里用的是标准TeeChart组件,理论上这时候已经完全能正常运行了。如果还有残留的报错,大概率是工程里引用了不同版本的路径(比如旧的BPL路径还在项目搜索路径里),去Project Options里把旧的搜索路径清理掉就行。
3.3 编译过程中的常见报错与处理
我在安装时遇到过几个比较典型的编译错误,整理了排查方法,放在后面常见问题章节里一起说,这里先提一个最容易踩的:
注意:64位系统下,Delphi安装的是32位IDE,默认的BPL路径是C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl(23.0对应Delphi 12)。有些第三方安装脚本会往这个目录放BPL,但有时也会放错到Windows系统目录里去。如果编译时提示“无法找到包xxx”,先检查一下BPL文件有没有存在于正确路径。
4. 在Delphi 12工程中使用TeeChart
4.1 5分钟画出第一张折线图
安装完成后最重要的事,是验证一下控件真的能用。我先拿一个最简单的DEMO来说。
新建一个VCL Application,在窗体上放一个TChart组件,再放一个TButton。双击Button的OnClick,写下面的代码:
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin // 先清空所有序列 Chart1.SeriesList.Clear; // 创建一个折线序列 with Chart1.AddSeries(TLineSeries) do begin Title := '销售趋势'; for I := 0 to 20 do Add(I, Random * 100, '', clBlue); end; end;在Delphi 12.3里,这一步只要代码编辑器和窗体设计器正常联动,运行后点击按钮,就能看到一条随机波动的蓝线。这期间没有任何编译错误,说明控件安装完美。
如果要换FMX项目,流程几乎一样:新建Multi-Device Application,放TChart组件,在OnClick事件里写几乎相同的代码。FMX下的TChart会有一些平台差异,但API层面的体验是一致的,这也是我选择它的核心理由。
4.2 常用图表类型与业务场景对照
我用TeeChart这几年,真正高频使用的图表类型不是很多,但每一个都有自己适合的场景。简单列个表:
| 图表类型 | 典型应用场景 | 关键参数 |
|---|---|---|
| TLineSeries | 趋势分析、指标波动 | X轴可为数值或日期,LinePen控制线宽颜色 |
| TAreaSeries | 面积堆叠、占比变化 | AreaChart属性控制堆叠模式 |
| TBarSeries | 分类对比、月度统计 | BarWidthPercent、MultiBar控制柱宽与分组 |
| TPieSeries | 占比、收入构成 | RotationAngle控制扇区起始角度 |
| TFastLineSeries | 大数据量实时曲线 | 不保留点位,DrawAllPoints控制性能 |
| TGanttSeries | 项目排期、任务甘特图 | 用AddGantt添加起止时间 |
| TCandleSeries | 股票K线、金融分析 | CandleStyle控制阳线阴线颜色 |
实际项目里,我用得最多的除了折线、柱状,就是TGanttSeries。项目管理软件里,每个任务的起始时间和结束时间用甘特图展示最直观,而TeeChart这一套实现,比自己在Canvas上硬画省太多了。
4.3 坐标轴、图例与数据交互的配置细节
画图不难,难的是把图做得让业务方满意。这里有几个我总结的经验:
坐标轴标题和格式:
with Chart1.Axes.Left do begin Title.Caption := '销售额(万元)'; LabelsFormat.Format := '#,##0'; end; with Chart1.Axes.Bottom do begin Title.Caption := '月份'; LabelsFormat.Format := 'yyyy-MM'; end;图例配置:TeeChart9以上版本,可以在IDE里通过TChartEdit直接拖拽图例位置,也可以代码设置:
Chart1.Legend.Alignment := laBottom; Chart1.Legend.Visible := True;鼠标悬停提示:默认的鼠标悬停提示不够友好,建议用OnMouseMove事件或OnClickSeries事件手动弹提示。比如:
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var LIndex: Integer; LValue: Double; begin if Chart1.Series[0].Clicked(X, Y, LIndex) then begin LValue := Chart1.Series[0].YValue[LIndex]; Chart1.Hint := Format('当前值:%.2f', [LValue]); end else Chart1.Hint := ''; end;这些细节虽然不复杂,但真正能把图表做“活”、做“顺手”,都是靠这些交互配置堆起来的。
5. 常见问题与排查技巧实录
5.1 每次进入IDE都丢失控件,放置后保存再打开又没了
这个问题的出现频率在Delphi第三方控件里排名第一。原因基本就两个:
一是设计时包没有正确安装。如果某个控件只有运行时包进了项目,没往IDE的组件面板里注册,那工程里引用的控件类名是能认识,但窗体文件里的对象在IDE设计器里无法实例化,于是显示成“丢失”的状态。解决办法就是回到第3步,确保DclTeeChartProVCL.dpk安装成功。
二是设计时包和运行时包版本不匹配。比如你机器上同时装了TeeChart的Lite版和Pro版,或者装了两个不同年份的TeeChart版本,IDE就会出现包冲突,加载窗体时随机丢失某个包里的控件。排查办法是打开Component → Install Packages,关闭掉多余的TeeChart相关包,只保留对应版本的。
我遇到过一次诡异情况,就是打开项目管理器时IDE少识别了一个运行时包,但窗体还能显示,一保存再打开就全部变成灰框。最后发现是BPL文件被注册到了Windows\System32下,而IDE的Library路径里引的是公共文档下的BPL,两边同名冲突。清理掉System32下的旧BPL后彻底解决。
5.2 FMX中图表字体和缩放问题
FMX版的TeeChart在Windows桌面调试时一切正常,到Android或Linux上就出幺蛾子,最常见的两个问题:
字体丢失:FMX的跨平台字体处理依赖各平台字体栈,默认图表标题字体在某些Linux桌面环境或Android设备上会显示成“方块”。解决办法是把图表中用到字体(Title、AxisLabels、Legend)统一设置为平台通用字体。在Android上我一般用TeeFont.Name := 'Roboto',在Linux上会用'Sans'。
高分屏缩放错位:FMX在Windows上默认支持高DPI缩放,但TeeChart的坐标轴标签和marker在缩放比例不是100%时,容易出现位置偏移。这个问题在v2023.38版本里已经比老版本好很多了,但还是建议在TChart的OnBeforeDrawChart事件里手动刷新一下布局:
procedure TForm1.Chart1BeforeDrawChart(Sender: TObject); begin Chart1.AutoRepaint := False; Chart1.LeftAxis.Automatic := True; Chart1.BottomAxis.Automatic := True; Chart1.AutoRepaint := True; end;5.3 大数据量图表卡顿与内存优化
TeeChart画几千个点很轻松,但到百万级数据点时,就需要做优化了。我的实践经验是:
- 优先用TFastLineSeries:FastLine不做点位存储和命中检测,只做线的绘制,性能远超普通TLineSeries。
- 设置DownSampling:TeeChart自带降采样功能,
Chart1.Series[0].DownSamplingMethod可以设置为dsMinMax,这个模式下,数据点过多时,TeeChart会按区间取MinMax值来画线,在保留波形特征的同时大幅减少绘制开销。 - 减少实时刷新频率:实时滚动曲线不需要每次来数据都重绘整条曲线。可以设置
Chart1.AutoRepaint := False,把数据追加后手动调用Draw方法,控制刷新节奏。
代码如下:
Chart1.AutoRepaint := False; try with Chart1.Series[0] as TFastLineSeries do begin Add(Time, Value, '', clRed); if Count > 10000 then Delete(0); // 窗口滑动,只保留最近一万个点 end; finally Chart1.AutoRepaint := True; Chart1.Draw; end;这样处理下来,实时监控画面的CPU占用可以从20%以上降到5%以内,效果非常明显。
5.4 编译时提示“Fatal: File not found”的快速定位思路
这个报错在源码包安装后第一次使用新工程时经常遇到。我的排查顺序是:
- 先看报错缺的是哪个
.pas文件名,比如VCLTee.TeeProcs。 - 在源码目录里用
Everything或Windows资源管理器搜一下这个文件是否存在。如果存在,说明当前工程搜索路径没包含这个目录。 - 打开
Project → Options → Delphi Compiler → Search path,把TeeChart的Sources\VCL路径加进去。 - 如果加了路径还报错,看文件是否被其他路径下的同名文件拦截。用
Ctrl+鼠标左键跳转到该单元定义,确认跳转的目标是否在TeeChart解压目录里。
大部分情况的根源就是路径配置混乱,梳理清楚就好了。
6. 关于这套源码的后续扩展
TeeChart Pro装好之后,不只是能用现成组件。因为带源码,你可以直接修改TeeChart自带的设计器,甚至扩展序列类型。我见过有人基于TeeChart源码做了一套内部专用的业绩看板控件,给序列加了自己的鼠标拖拽逻辑,效果非常好。如果你想在控件层面做定制,这条路的成本比换控件低得多。
另外,TeeChart的Demo工程非常多,几乎覆盖了所有图表类型,我强烈建议把Demo目录里的各个示例跑一遍。新手学图表参数的设置,与其看文档,不如看看这些Demo的运行时效果,再对照代码里改了几个关键属性,理解效率完全不同。
还有一个小技巧,v2023.38的TeeChart在保存窗体时,会把图表配置序列化成二进制或文本格式(视设置而定)。如果多人协作开发,建议在属性面板里把TChart的about信息统一记录好,这样版本管理时,窗体文件的冲突概率会小一点。
根据我个人这段时间的使用体验,TeeChart Pro在Delphi 12 Athens上几乎是一站式图表方案,VCL和FMX两套框架同时可用,真的省掉了很多来回切换控件的麻烦。最直观的收益就是,老项目升级时不用担心图表控件挂掉,新项目做跨平台移动端时,也不需要另学一套图表API。如果你正在折腾Delphi 12.3的控件环境,这份TeeChart Pro源码包值得花一点时间装好它。
本文还有配套的精品资源,点击获取