TeeChart Pro 2023.38源码版实战:VCL/FMX编译集成与跨平台部署指南
2026/9/8 2:33:38 网站建设 项目流程

简介:TeeChart 是 Steema 公司出品的专业图表组件库,这款 2023.38 版本源码包面向使用 Delphi、C++Builder 的 VCL 与 FireMonkey 开发者,可用于构建 Windows 及跨平台数据可视化应用。包内共包含 2000 个文件,以 Pascal 源码(492 个 pas)、Delphi 包工程(378 个 dpk)、FMX 界面文件(212 个 fmx)和资源文件(425 个 res)为主,另有大量位图、DFM 表单及若干 C++ 工程文件,整体压缩后约 21.02MB。已有 277 人学习/下载该资源。这份源代码不仅提供完整的图表绘制能力,如折线图、柱状图、饼图、3D 地图等,还允许开发者深入阅读源码、针对业务场景自定义组件行为,并可借助 VCL/FMX 双框架实现跨平台复用。更难得的是,源码内含多种编程模型的 API 接口与事件驱动支持,方便与数据库、Web 服务等系统对接;包含按 IDE 版本划分的包工程组织,便于快速定位与集成,是图表类应用开发与二次集成的实用参考资料。 这套TeeChart Pro VCL/FMX 2023.38源码版,我陆陆续续用了小半年,期间从Delphi 11迁移到Delphi 12,再从纯VCL项目扩展到FMX跨平台项目,踩的坑和摸出来的门道都凑齐了。这篇就把我实际编译、集成、部署这套源码版的过程完整写出来,重点放在“源码版和安装版到底差在哪”“VCL和FMX两套分支该怎么对待”“编译集成时哪些环节最容易翻车”这三件事上,给正准备入手的同行一个参考。

1. 为什么我盯上2023.38这个源码版

先说背景。我维护的是一款工业数据采集与监控的桌面客户端,Windows端偏多,但这两年陆续有客户要macOS和iPad端的演示版。图表是产品里最核心的展示模块,历史曲线、实时趋势、频谱分布、仪表盘都离不开。早期用的是TeeChart标准安装版,功能完全够用,问题出在几个特殊需求上。

第一个需求是自定义序列类型。项目里有一种特殊的“质量标记条”,需要在时间轴曲线上叠加不同颜色、不同透明度的区块,用来标注数据有效区间。标准版里没有现成的序列类型,文档里也没有对应扩展点。安装版是编译好的bpl,想改内部行为基本没门。第二个需求是跨平台统一交互。Windows上用右键框选缩放,客户希望iPad上能用双指手势做出同样效果,这需要在FMX的Touch事件链里对Chart底层做定制。没有源码,很多事就只能停留在“看文档猜实现”的阶段。

第三个原因比较实际:团队里不止一个IDE版本。有人还在Delphi 10.4,有人已经升到RAD Studio 11,还有人刚装了12 Athens的预览版。安装版每次要等官方出对应IDE版本重新编译的安装包,版本一多就成了灾难。源码版自己拿过来编译一套,所有人在各自IDE里直接引用,省掉大量等待时间。

所以我的建议是:如果你只是做常规业务报表、仪表盘,安装版完全够用,没必要买源码版;但如果你需要改控件行为、要跨IDE版本维护、要深入FMX渲染细节,源码版的价值是实打实的。2023.38这个版本号意味着它是2023年的第38个build,对应的IDE支持已经覆盖了RAD Studio 11.3和12.0,正好站在Delphi 12普及的前夜,属于比较稳定的一个版本节点。

2. 版本号背后:2023.38在VCL和FMX两侧的真实改动

拿到手第一件事,翻Release Notes。Steema的版本号规律很简单:年份+当年build序号,2023.38就是2023年第38次构建。这不同于传统的TeeChart X.0命名方式,但本质一样。Release Notes里关于FMX侧的改动比VCL多,这是这两年的明显趋势——Steema明显把火力集中在了跨平台这边。

FMX侧几个主要变化值得单独说。

渲染管线对HiDPI的适配比以前好得多。VCL里chart在不同DPI显示器之间拖动,字体和线宽偶尔会发虚,这个问题根源是VCL的GDI/GDI+在Per-Monitor DPI下的固有毛病,控件层能做的有限。FMX是矢量渲染体系,TChart在Windows和macOS的高分屏上清晰度表现都很稳,2023.38又修了几个在Linux下Canvas字体平滑的细节。

新增和增强的序列类型。FMX侧对TBoxPlot、TVolumeSeries这类偏金融分析的序列做了渲染优化,同时把TChart的Legend交互增强同步到了FMX分支。VCL侧则重点在TChartListBox、TChartGrid这类附属控件的运行时行为校正。具体到我自己项目里,最直观的感受是TColorGrid在FMX下大量数据点时的重绘速度比之前快了。

Axis和Tool框架的同步补丁。好几个修的是Axis标签自动旋转的角度计算、TAnnotationTool在FMX下点击命中区域不准的问题。FMX的命中测试和VCL的Windows消息机制不同,很多Tool在VCL下正常、一跑到FMX就偏,2023.38在这里修了一大批类似的差异。

VCL侧改动相对少,主要集中在两类:一类是编辑器(TeeChart Editor)界面在高DPI下的显示,另一类是对Delphi 11.3和12.0新版编译器的兼容性修正。RAD Studio 12对String的处理有底层变化,部分控件源码在此前版本下会编译警告,2023.38把这些都清理干净了。

我的判断是:2023.38真正有价值的更新在FMX侧,VCL侧维护性质更多。所以如果你的主力平台是Windows VCL,从旧版本升级过来体感不会太剧烈;如果做FMX跨平台,这个版本确实值得投入。

3. 拿到源码先别急着编译:目录结构和包依赖

源码版解压后不像安装版那样自动注册控件到IDE,它是一堆源文件和工程文件。有人第一次打开源码包看到十几个dpk文件直接懵了,其实结构很清晰。

核心目录大致是这样:

  • Sources\VCL:VCL分支的源码和运行时包
  • Sources\FMX:FMX分支的源码和运行时包
  • Sources\Editor:图表编辑器的源码
  • Packages\:各个版本的dpk/dproj文件
  • Demo\:官方示例工程

编译顺序有讲究。TeTree、TeeChart的运行时包(Runtime Package)必须先编译,然后才是设计时包(Design-Time Package)。设计时包是负责让控件出现在IDE工具箱里的那一层,它依赖运行时包。有人上来直接打开设计时包编译,报一堆找不到单位的错误,就是因为运行时包还没编。

推荐顺序是:先编译TeeChartPro_VCL_Run.dpk(运行时),再编译TeeChartPro_VCL_Design.dpk(设计时)。FMX侧同理,把VCL换成FMX关键词即可。编译过程中不允许出现错误,如果编译失败,绝大多数情况是因为已有的Delphi环境里装了老版本的TeeChart,路径搜索顺序冲突。

具体编译流程我整理一下:

  1. 打开RAD Studio,Tools -> Options -> Environment Options -> Delphi Options -> Library。
  2. 把源码里的Sources\VCLSources\FMXSources\Editor三个路径加到Library Path中。
  3. 打开Packages目录下对应的dproj文件。Delphi 11环境下选TeeChartPro_VCL_Run.dproj右键编译。
  4. 运行包编译成功后,编译设计时包。
  5. IDE提示是否安装设计时包,选Install,工具箱里就能找到TChart组件。
  6. FMX分支完全重复一遍,两个分支可以共存,不存在互相覆盖的问题。

这里说一个我踩过的坑。如果你同时装了Delphi 11和Delphi 12,在Delphi 12里编译的包默认放在C:\Users\xxx\Documents\Embarcadero\Studio\23.0这个用户目录下,Delphi 12是23.0,Delphi 11是22.0,两个版本各自独立。但Library Path如果沿用旧的,很可能把11的编译产物指给12用,结果就是IDE能识别控件但启动时反复弹“Package xxx is not found”或者版本不匹配的错误。所以每个IDE版本都要单独配Library Path,指向它自己编译出来的bpl目录。

4. VCL和FMX的图表差异:不是换个壳那么简单

很多人以为TeeChart VCL和FMX只是API一致、底层换个渲染引擎而已。实际操作下来发现,两套分支的差距比想象中大。API层面确实照顾得很好,大部分代码可以直接复制,但交互层、性能层、事件触发的时机都藏着自己的脾气。

渲染底层的差异是根本。VCL的TChart默认走GDI渲染,在Windows上确实稳定,但是位图缩放、Alpha混合这些和现代UI的需求有明显代差。FMX侧把所有绘图操作都建立在FireMonkey的Canvas抽象上,因此在Windows、macOS、iOS、Android上的渲染结果高度一致。也就是说,同样的Chart在Windows上设置的颜色、字体,到macOS上视觉还原度比VCL高得多。

交互事件链完全不是一回事。VCL的鼠标事件是基于Windows消息的:OnMouseDown、OnMouseMove、OnMouseUp,TChart自己的Zoom和Scroll工具也建立在Mouse事件之上。但FMX里没有Windows消息,触摸和鼠标统一走Gesture和Mouse事件,而且事件是冒泡式的,从最上层控件往父级传递。TChart在FMX里的Zoom/Scroll工具如果不显式配置,在Windows开发机上用鼠标灵活得很,一交叉编译到iPad上就完全没反应。

FMX里的交互要换成TeeChart的Touch工具,代码大概是这个样子:

uses TeeTouchTools; var TouchZoom: TTeeTouchZoom; TouchScroll: TTeeTouchScroll; begin TouchZoom := TTeeTouchZoom.Create(nil); TouchZoom.Panel := Chart1; Chart1.Tools.Add(TouchZoom); TouchScroll := TTeeTouchScroll.Create(nil); TouchScroll.Panel := Chart1; Chart1.Tools.Add(TouchScroll); end;

加上这两个Touch工具,iPad上用双指缩放和平移就顺了。类似的差异还体现在序列的点选高亮(VCL用OnMouseMove判断序列邻近值,FMX要用TTeeHitTest工具)和Tooltip的弹出位置上。

性能层面的差异集中在数据量大时。VCL因为是GDI,刷新大数据量曲线时CPU占用偏高,FMX的Canvas在Windows上走Direct2D的路径,大点数场景下明显更省CPU。但Android和Linux上各有自己的软件渲染实现,又没有Windows那么高效。所以搞跨平台要从一开始就把数据点做降采样,不能指望控件层万能。

一个容易被忽略的细节是Font和DPI。VCL的Font单位是像素,在96DPI下设计好的Chart标题,换到150DPI的电竞屏上就变得很小。FMX的Font用的是point尺寸,靠Canvas的Scale自动适配,所以在不同DPI显示器之间切换时视觉比例更稳定。2023.38源码里对FMX侧TextShape的字体测量做了修正,小字号中文标题的模糊问题有明显改善。如果你在VCL里被多分辨率显示适配折腾过,FMX这套方案会让你省心不少。

5. 编译和集成中的实战排坑记录

这几条都是我真实踩过的,按影响程度排个序。

坑一:工具箱里找不到控件,但编译不报错。这是典型的设计时包没装或者装错了版本。很多人只编译了Runtime包就往IDE里用,结果代码能跑,因为运行时引用没问题,但工具箱里始终不显示。解决方式是检查Project Manager里Design-Time包是否标记为Runtime only,要在Options里把Usage改成Design-Time。

坑二:Delphi 12下编译Design包时提示“Unit xxx was compiled with a different version of xxx.Types”。这个问题环境清理就能解决。原因是IDE搜索路径里混入了Delphi 11编译生成的dcu,12去加载时发现类型版本不一致。把用户BPL目录、DCP目录、DCU目录全部清理干净,重新编译一遍就正常。

坑三:FMX分支的TChart在Android真机上初始化崩溃。崩溃停在TChart.Create,原因多半是FMX的Canvas在Android平台上需要一个TForm作为上下文,而你在Form的构造事件里过早创建了Chart,此时Canvas还没准备好。解决办法是把Chart创建从FormCreate挪到FormActivate,等FMX的Platform完全初始化之后再建。

坑四:和TMS、DevExpress等第三方控件的bpl冲突。这是因为各种控件都自带一套bpl,版本链各不相同,加载顺序不对就冲突。解决办法是把TeeChart的运行时包在项目选项里改成“Runtime Packages”中默认不打包(Build with runtime packages取消勾选),让依赖静态链接进去,避免和第三方运行包掐架。代价是体积变大,但稳定性换来的是值得。如果是纯FMX项目,根本不用勾选运行时包,因为FMX默认就是全部静态编译。

坑五:VCL项目升级到Delphi 12后,个别Chart页面在程序退出时偶发Access Violation。这个大概率是析构顺序问题。2023.38源码里TChart的析构会释放Tools和Series,如果Chart和某个Tool的拥有者(Owner)有父子关系,释放顺序不对就崩。稳妥做法是创建Tool和Series时指定Owner为Chart自身,而不是Form,确保它们随Chart一起释放。

这些坑让我养成一个习惯:每次切换IDE版本或升级第三方控件,都花半小时重建一个干净的测试项目,只放一个Chart和一个Button,跑一遍创建、赋值、保存图片、释放的完整流程。看起来原始,但比在一个庞大的项目里排查问题高效太多了。

6. 部署经验:授权检查、跨平台打包和序列数据刷新的实测

部署这块有几个点值得单独说,都是实际项目里容易卡壳的地方。

授权检查机制。TeeChart Pro源码版编译出来的程序,首次启动时会查找Steema License。开发机上装了IDE注册表里有授权信息,跑起来没问题;但部署到客户机器上,第一次运行会进入未授权模式,功能受限,必须调用序列号注册代码。

uses TeeLicensing; begin TeeSetLicense('YOUR_REGISTRATION_CODE'); end;

这段代码要放在程序启动的最早阶段,最好在Application.Initialize之后、MainForm创建之前。很多人放在FormCreate里,在极少数机器上会因为加载顺序问题导致注册失败。注册成功后会生成一个本地校验文件,之后不再重复检查。

FMX跨平台打包额外注意。iOS上如果用了TChart的PNG导出功能,要确保链接了FMX的图像编码库;Android上如果图表里用了外部字体,字体文件必须打进Assets目录,并在Chart的Font设置里用TFontFile.Create加载。否则中文标注在Android上会是方块。

大数据量实时刷新。项目里要做实时曲线,每秒进来500到1000个数据点,一开始用Series.AddXY逐点添加,界面肉眼可见地卡顿。后面改成批量数组赋值,性能差别巨大:

var XArray, YArray: TDoubleDynArray; begin // 预先填充XArray、YArray Series1.BeginUpdate; try Series1.SetXValues(XArray); Series1.SetYValues(YArray); finally Series1.EndUpdate; end; end;

BeginUpdateEndUpdate在VCL和FMX分支里都适用,但要记住:BeginUpdate后一定要在Finally里成对EndUpdate,否则图表会停留在冻结状态。另外,实时曲线建议配上TTeeZoomBand这类范围缩放工具,把可视窗口控制在一段时间内,不然序列无限增长,内存迟早吃满。

多序列同步显示时的优化。如果一条轴上叠了十几条曲线,鼠标移动时Legend要高亮对应序列,默认实现是遍历所有序列的所有点判断命中,序列一多就掉帧。这里可以直接开启Source的UseExtendedCoordinate或者自行在MouseMove里只对可见序列做距离判定,配合Series1.Marks.Visible := False关掉不需要的标注,交互流畅度会明显提升。

这套源码版我目前同时跑在Delphi 11.3和12.0两个IDE里,VCL分支负责Windows正式版,FMX分支维护macOS和iPad演示版。前面提到的坑大多集中在首次编译的头两周,摸清包依赖和API差异后,日常开发体感和普通控件库没区别。尤其到了Delphi 12,FMX在高分屏和渲染性能上的提升是实打实的,值得把老项目逐步迁过去。如果你也是从安装版切到源码版,建议拿出一两天时间专门编译、跑通示例项目再动业务代码,这笔时间花得值。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询