gpt4 book ai didi

delphi - 如何向 TTabSheet 添加属性,以便在设计时与 TPageControl 一起使用

转载 作者:行者123 更新时间:2023-12-02 20:31:56 28 4
gpt4 key购买 nike

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

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

我还在研究“类助手”作为另一种选择。

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

谢谢!

最佳答案

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

但是,您在这里有一个轻微的误解,即TPageControl...在内部创建...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) 组件
  • 创 build 计时包并将其安装到 IDE 中,该包将向 Delphi 表单编辑器引入新的子类化选项卡表
  • 在您的表单中放入库存TPageControl并以常规方式创建所有需要的选项卡
  • 在 IDE 表单编辑器中,右键单击表单可用空间,然后在菜单中执行“View As Text Alt-F12”命令 - 您将看到表单 DFM 文件的文本内容
  • 在这些 DFM 源中找到您的选项卡表并将其库存 TTabSheet 类更改为您的派生子类
  • 右键单击文本编辑器并选择“查看为表单 Alt-F12”命令
  • 如果一切都正确完成,那么 Delphi 现在将使用您的新类工作表重新创建表单。在对象检查器中找到新属性并进行更改。
  • 现在切换到表单的 .Pas 源并找到这些选项卡的声明并更改其类型。仅当您必须从 Delphi 源访问新属性时才需要这样做。如果没有,您可以将它们的声明保留为 pas-file 中的 TTabSheet,因为您的类是它的直接后代。您可以将这些声明保留原样 - 但随后您必须将 RegisterClass(TMyTabSheet); 调用添加到单元底部的 initialization 部分,因此当该表单将从 DFM 中构造自身,它能够通过名称找到类实现。如果您要更改声明(至少其中之一),那么您的表单将在从 DFM 流出之前自动调用所有需要的 RegisterClass。选择您喜欢的任何选项。
  • (可选)以及稍后,扩展您的设计时包以查找并劫持 IDE 表单编辑器的 TPageControl 右键菜单,并在其中添加“新建我的子类选项卡”命令。只是为了避免手动事后 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 中。这只是 VCL 设计的标准方式 - 从 DFM 获取特定的组件类型。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com