如何向TTabSheet添加属性,以便在设计时可以使用TPageControl

时间:2016-04-20 14:30:25

标签: delphi tpagecontrol ttabsheet class-helpers

我想将“MyProperty”添加到TTabSheet并在设计时使用它。但是,如果我将其子类化,我担心我还需要子类化TPageControl,因为它在内部创建/管理TTabSheets。

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

我也在研究“阶级助手”作为另一种选择。

有没有人就如何最好地完成这项工作提出建议?

谢谢!

1 个答案:

答案 0 :(得分:2)

Type Helpers只是编译时的糖,它们对已编译的代码没有任何影响,VCL与TPageControlTForm一起使用。那是一个死胡同。

但是你在TPageControl... internally creates... the TTabSheets有一点误解。实际上,当您通过TPageControl本身创建工作表时,例如右键单击它并选择" New Tab"那会发生什么。但是当您从DFM文件(或编译的EXE中的DFM资源)创建活动表单对象时,TForm本身会创建所有组件,包括页面控件及其选项卡。

只需在How to efficiently let a `ParentFont = False` child control to use same font name as parent?看到我的回答 - 这会显示所有者 - TForm的距离,而不是TPageControl或其他父组件。

所以你可以自由地追求子类化标签页。

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

当新版本的Delphi更新TPageControl

时,我感到遗憾

创建并调整表单并将其保存到DFM后,TForm将创建保存的DFM数据中的所有组件,并且还包括您的选项卡。除非非常不可能的事件EMBT会破坏整个VCL流媒体(1995年在Delphi 1中制作)并从头开始重新设计(同时消除与现有Delphi源的所有兼容性),因此指定课程的前向兼容性应该没有问题在DFM。它只是VCL设计的标准方式 - 从DFM获取特定的组件类型。