1

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

我相信这需要复制 TTabSheet 管理代码来引用 TMyTabSheet 而不是 TTabSheet,因为它需要调用 TMyTabSheet.create。当新版本的 Delphi 更新 TPageControl 并且我忘记更新 TMyPageControl 时,这感觉就像我会后悔的事情。

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

有人对如何最好地实现这一点有建议吗?

谢谢!

4

1 回答 1

3

Type Helpers 只是编译时的糖,它们不会对已经编译的代码产生任何影响,即股票 VCL 与TPageControland一起TForm。那是一个死胡同。

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

只需在如何有效地让“ParentFont = False”子控件使用与父控件相同的字体名称?-在为实际选项卡或其他元素选择特定类时,这将向您展示它与所有者的距离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);call 添加到单元底部的非常initialization部分,因此当表单从 DFM 构建自身时,它将能够通过姓名。如果您要更改声明(至少其中一项),那么您的表单将RegisterClass在流出 DFM 之前自动调用所有需要的内容。选择您喜欢的任何选项。
  • 或者以后,扩展您的设计时包以查找并劫持 IDE 表单编辑器的右键单击菜单,TPageControl并在那里添加“新建我的子类选项卡”命令。只是为了避免手动事后 DFM 编辑。如果你经常这样做

这感觉就像当新版本的 Delphi 更新 TPageControl 时我会后悔的事情

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

于 2016-04-20T14:52:16.343 回答