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

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

我也在研究“班级帮助者”作为另一种选择。

有没有人建议如何最好地做到这一点?

谢谢!

最佳答案

类型帮助器只是编译时的糖,它们不会对已经编译的代码产生任何影响,即库存VCL与TPageControlTForm一起使用。那是死胡同。

但是,您对TPageControl... internally creates... the TTabSheets有一个误解。确实,当您通过TPageControl本身创建工作表时,就像右键单击它并选择“新建选项卡”一样,会发生什么情况。但是,当您从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 Form Editor引入新的子类化选项卡。
在表格中放入股票TPageControl并按常规方式创建所有需要的标签
在IDE窗体编辑器中,右键单击窗体的可用空间,然后在菜单中执行“查看为文本Alt-F12”命令-您将看到窗体的DFM文件的文本内容
在这些DFM来源中找到您的标签页并将其库存TTabSheet类更改为您的派生子类
右键单击文本编辑器,然后选择“查看为表单Alt-F12”命令
如果一切正确,那么Delphi将立即使用您的新类工作表重新创建表单。在对象检查器中找到新属性并进行更改。
现在,切换到表单的.Pas源,找到这些选项卡的声明并更改其类型。仅在必须从Delphi源中访问新属性时才需要。如果不是,您可以在pas文件中将它们的声明保留为TTabSheet,因为您的类是它的直接后代。您可以保留这些声明的原样-但随后您必须在单元底部的RegisterClass(TMyTabSheet);部分中添加initialization调用,因此,当表单将其自身构造为DFM时,它将能够通过名称查找类实现。如果您要更改声明(至少其中之一),那么您的表单会在从DFM流出之前自动调用所有需要的RegisterClass。选择您喜欢的任何选项。
(可选)以及以后,扩展您的设计时软件包,以找到并劫持IDE表单编辑器的TPageControl右键单击菜单,然后在其中添加“新建我的子类化标签”命令。只是为了避免手动进行事后DFM编辑。如果你经常这样做



当新版本的Delphi更新TPageControl时,我感到后悔


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

关于delphi - 如何将属性添加到TTabSheet,以便可以在设计时与TPageControl一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36747029/

10-10 17:03