如何将 属性 添加到 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 与 TPageControl
和 TForm
一起。那是死胡同。
然而你在这里有一个轻微的误解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 中获取特定的组件类型。
我想将 "MyProperty" 添加到 TTabSheet 并在设计时使用它。但是,如果我对它进行子类化,我担心我还需要对 TPageControl 进行子类化,因为它在内部 creates/manages TTabSheets。
我认为这需要复制 TTabSheet 管理代码以引用 TMyTabSheet 而不是 TTabSheet,因为它需要调用 TMyTabSheet.create。当 Delphi 的新版本更新 TPageControl 而我忘记更新 TMyPageControl 时,我会感到很遗憾。
我也在研究 "class helpers" 作为另一种选择。
有人对如何最好地完成这项工作有建议吗?
谢谢!
Type Helpers 只是编译时的糖,它们不会对已经编译的代码产生任何影响,库存 VCL 与 TPageControl
和 TForm
一起。那是死胡同。
然而你在这里有一个轻微的误解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 中获取特定的组件类型。