如何将 属性 添加到 TTabSheet,以便它可以在设计时与 TPageControl 一起使用

How to add a property to TTabSheet such that it can be used at design time with TPageControl

我想将 "MyProperty" 添加到 TTabSheet 并在设计时使用它。但是,如果我对它进行子类化,我担心我还需要对 TPageControl 进行子类化,因为它在内部 creates/manages TTabSheets。

我认为这需要复制 TTabSheet 管理代码以引用 TMyTabSheet 而不是 TTabSheet,因为它需要调用 TMyTabSheet.create。当 Delphi 的新版本更新 TPageControl 而我忘记更新 TMyPageControl 时,我会感到很遗憾。

我也在研究 "class helpers" 作为另一种选择。

有人对如何最好地完成这项工作有建议吗?

谢谢!

Type Helpers 只是编译时的糖,它们不会对已经编译的代码产生任何影响,库存 VCL 与 TPageControlTForm 一起。那是死胡同。

然而你在这里有一个轻微的误解TPageControl... internally creates... the TTabSheets。事实上,当您通过 TPageControl 本身创建 sheets 时,就像右键单击它并选择 "New Tab" 那样会发生什么。但是,当您从 DFM 文件(或已编译 EXE 中的 DFM 资源)创建活动表单对象时,TForm 本身会创建所有组件,包括页面控件及其选项卡 sheets。

只需在 上查看我的回答 - 这会告诉您 所有者 - TForm 有多远,而不是 TPageControl 或其他 父级 组件,当涉及到为实际选项卡或其他元素选择特定 class 时..

因此,您可以自由选择子class选项卡sheet。

  • 创建 TMyTabsheet = class(TTabSheet) 组件
  • 创建并安装到 IDE 设计时包 ,它将引入新的子classed 选项卡 sheet 到 Delphi 表单编辑器
  • 在您的表单中输入股票 TPageControl 并以常规方式创建所有需要的标签
  • 在 IDE 表单编辑器中右键单击表单 space 并在菜单中执行 "View As Text Alt-F12" 命令 - 您将看到表单的 DFM 文件的文本内容
  • 在那些 DFM 来源中找到您的选项卡 sheets 并更改他们的库存 TTabSheet class 成为您的派生子 class
  • 右键单击文本编辑器并选择 "View As Form Alt-F12" 命令
  • 如果一切都正确,那么 Delphi 现在将使用新的 class sheet 重新创建表单。在 Object Inspector 中找到您的新属性并进行更改。
  • 现在切换到表单的 .Pas 源并找到这些选项卡的声明 sheets 并更改它们的类型。仅当您必须从 Delphi 来源访问新属性时才需要这样做。如果不是,您可以在 pas 文件中将他们的声明保留为 TTabSheet,因为您的 class 是它的直接后代。您可以按原样保留这些声明 - 但随后您必须将 RegisterClass(TMyTabSheet); 调用添加到单元底部的 initialization 部分,因此当表单从 DFM 中构建自身时将能够通过名称找到 class 实现。如果您要更改声明(至少其中一个),那么您的表单将在流出 DFM 之前自动调用所有需要的 RegisterClass。选择您喜欢的任何选项。
  • 可选和以后,扩展您的设计时包以查找和劫持 IDE 表单编辑器 TPageControl 的右键单击菜单,并在那里添加 "New My Subclassed Tab" 命令。只是为了避免手动 post-factum DFM 编辑。如果你经常这样做

This feels like something I will regret when a new version of Delphi updates TPageControl

在您创建并调整表单并将其保存到 DFM 之后 - TForm 会根据保存的 DFM 数据创建所有组件,其中也包括您的选项卡。除非非常不可能的事件 EMBT 会杀死整个 VCL 流(在 1995 年 Delphi 1 中制作)并从头开始重新设计它(立即杀死与现有 Delphi 源的所有兼容性),否则应该没有在 DFM 中指定 class 的向前兼容性问题。这只是 VCL 设计的标准方式 - 从 DFM 中获取特定的组件类型。