我想将"MyProperty“添加到TTabSheet中,并在设计时使用它。但是,如果我子类它,我担心我也需要子类TPageControl,因为它在内部创建/管理TTabSheets。
我认为这需要复制TTabSheet管理代码来引用TMyTabSheet而不是TTabSheet,因为它需要调用TMyTabSheet.create。当一个新版本的Delphi更新了TPageControl,而我忘了更新TMyPageControl时,我会后悔的。
我也在研究“班级帮手”作为另一种选择。
有人对如何最好地完成这一任务有建议吗?
谢谢!
发布于 2016-04-20 14:52:16
类型帮助仅仅是编译时的糖,它们不会对已经编译过的代码产生任何影响,即库存VCL与TPageControl和TForm一起使用。那是死胡同。
然而,您在这里有一个轻微的误解,即TPageControl... internally creates... the TTabSheets。实际上,当您通过TPageControl本身创建工作表时,比如右击它并选择"New“,就说明了会发生什么。但是,当您在DFM文件(或已编译的EXE中的DFM资源)之外创建活动表单对象时,即TForm本身,它创建了所有组件,包括页面控件及其制表表。
请看我在 child control to use same font name as parent?上的回答--这将向您展示关于所有者-- TForm,而不是TPageControl或其他父组件--在为实际选项卡或其他元素选择特定类时所做的努力。
因此,您可以自由地追求子类表只。
TMyTabsheet = class(TTabSheet)组件TPageControl并以常规方式创建所有所需的选项卡TTabSheet类更改为派生子类。TTabSheet,因为您的类是它的直接后代。您可以保留这些声明,但随后必须将RegisterClass(TMyTabSheet);调用添加到单元底部的initialization部分中,这样,当表单在DFM之外构造自己时,它将能够通过名称找到类实现。如果要更改声明(至少其中一个),则表单将自动调用所有需要的RegisterClass,然后再从DFM中流出。选择你喜欢的任何选项。TPageControl右键菜单,并在那里添加"New“命令。只是为了避免手工后的DFM编辑。如果你经常这么做当德尔福的新版本更新TPageControl时,我会后悔的。
在您创建并调优表单并将其保存到DFM之后-- TForm将从保存的DFM数据中创建所有组件,并且还包括您的选项卡。除非非常不可能的事件EMBT会杀死整个VCL流(1995年在Delphi 1中制作)并从头开始重新设计它(同时扼杀与现有Delphi源的所有兼容性),否则在DFM中指定类的前向兼容性应该没有问题。这只是VCL设计的标准方式--从DFM获取特定的组件类型。
https://stackoverflow.com/questions/36747029
复制相似问题