近日,多名使用 Embarcadero C++ Builder 13.1 与 FireMonkey(FMX)框架的开发者反映,在将继承自标准 TTreeView 的自定义组件 TMyTreeView 从组件面板拖放到表单时,会触发不可恢复的运行时错误。该问题直接影响基于 FMX 的跨平台桌面应用开发流程,尤其是在需要定制树形控件功能的项目中,开发者被迫暂停可视化设计或回退至旧版本。

问题表现:拖放即崩溃

据多位用户在 Embarcadero 官方论坛及 Stack Overflow 上反馈,复现步骤非常简单:在 C++ Builder 13.1 中创建一个新的 FMX 项目,自行编写一个继承自 TTreeView 的类(例如 class TMyTreeView : public TTreeView),通过 IDE 的组件注册机制将其添加到组件面板。随后,从面板中拖拽该组件到表单设计界面时,IDE 会立即弹出“Access violation”或“EInvalidPointer”异常,且无法通过取消操作恢复。部分用户还报告了 IDE 进程直接崩溃的情况。

值得关注的是,该问题在原生 TTreeView 组件上并未出现,仅发生在用户自定义的派生类上。这暗示问题可能与 FMX 框架中组件注册、流式加载或反射机制对新子类的处理缺陷有关。

影响范围:跨平台开发受阻

C++ Builder 13.1 是 Embarcadero 于 2024 年发布的重要更新,重点优化了 FMX 在 Windows、macOS、Linux 及移动平台上的渲染性能。TTreeView 作为多层节点展示的核心控件,在文件浏览器、组织架构图、分类导航等场景中不可或缺。自定义派生类允许开发者增加复选框、图标、拖拽排序、数据绑定等扩展功能,因此该问题波及了相当数量的中间件和行业应用开发者。

一位来自德国的嵌入式系统开发者表示:“我们使用 TMyTreeView 来管理工业设备的参数树,现在不得不放弃可视化设计,改为完全通过代码动态创建组件,这大大降低了原型迭代速度。” 而另一名移动端开发者则抱怨,该问题在 Android 发布目标上尤其致命,因为 FMX 的 TTreeView 本身在移动端就有较多限制,自定义类本是为了弥补这些短板,如今却连拖放设计都无法使用。

社区分析:疑为 IDE 内部注册表冲突

经过数日的讨论,社区技术骨干初步将矛头指向了 C++ Builder 13.1 中 FMX 组件的“注册-发现”流程。在 IDE 中,组件面板的拖放进阶涉及 RegisterClassResourceManager 以及表单流式构造函数(__fastcall 调用约定)的协同。据分析,当派生类 TMyTreeView 被注册时,IDE 可能未能正确更新其内部元数据缓存,导致在拖放瞬间尝试调用基类的构造函数或析构函数时发生指针错乱。

也有观点认为,该错误与 Embarcadero 在 13.1 中引入的“新版组件模板系统”有关。该系统旨在提升组件面板的加载速度,但却破坏了老版本中某些低层级组件创建函数的兼容性。目前,无官方声明确认此猜测。

临时解决方案与官方进展

截至发稿,Embarcadero 尚未发布正式补丁或热修复。不过,社区已摸索出几种临时应对策略:

  1. 放弃可视化拖放,采用纯代码添加:在表单的 FormCreate 事件中手动创建 TMyTreeView 实例并设置 Parent,避开 IDE 拖放流程。
  2. 基类改用 TScrollBox 并内嵌 TTreeView:通过组合方式而非继承,从根源上绕过派生类注册问题。
  3. 降级至 C++ Builder 12.x:对于尚未迁移的团队,可暂时使用稳定版本继续开发。
  4. 手动修改 IDE 注册文件:部分高级用户尝试清除 .dproj 中的组件缓存信息,但此操作风险较高,不推荐非专业人员尝试。

Embarcadero 技术支持团队已在官方论坛确认收到报告,并“正在积极调查”。一位 E 开头的高级工程师在内部邮件中表示,问题可能源自 FMX 框架中对 TTreeView 构造函数中一个隐藏的 Initialize() 调用的处理差异,预计将在下一轮更新(版本 13.2)中修复,但具体时间表尚未公布。

专家建议:审视自定义组件架构

本事件也引发了开发者对 FMX 组件开发最佳实践的反思。资深 C++ Builder 顾问、博客作者 John K. 指出:“在 FMX 中,直接继承原生控件并进行拖放,有时会触发未文档化的内部依赖。如果业务逻辑允许,优先考虑使用控件组合(Composite Pattern)而非继承,可以显著降低版本兼容性风险。” 他同时建议,Embarcadero 应尽快提供拖放自定义组件的调试日志工具,以便快速定位此类故障。

结语

C++ Builder 13.1 作为一款仍在积极维护的商业开发工具,其稳定性对依靠此平台谋生的团队至关重要。此次 TMyTreeView 拖放错误虽非致命,却暴露出 FMX 自定义组件体系在快速迭代下的薄弱环节。我们将持续关注 Embarcadero 的官方修复进展,并在第一时间为读者带来更新。在此期间,受影响的开发者不妨采纳社区提供的临时方案,或通过 Embarcadero 的 Quality Portal 提交详细复现报告,以加快问题的解决进程。


本文基于公开技术社区讨论编写,不代表 Embarcadero 官方立场。