如何正确定义 TCustomFrame 的子 class?

How to properly define a TCustomFrame's child class?

我正在尝试定义 TCustomFrame 的子 class,但我在 TabOrder 属性 上遇到错误。

这些是我遵循的步骤:

  1. 向窗体添加新的 TFrame 后代(右键单击项目,添加新的、其他的、框架)。
  2. 将父 class 从 TFrame 切换到 TCustomFrame。

    TMyFrame = class(TCustomFrame)

  3. 检查 TFrame 定义并发布完全相同的属性(这样做,TMyFrame 应该与 TFrame 相同,对吧?)。

  4. 保存并关闭。
  5. 打开其中定义了 TMyFrame 的单元。

它得到一个错误,指出 TabOrder 属性 不存在。

有人可以阐明我所做的错误以及如何正确创建 TCustomFrame 的子项 class 吗?

你似乎把这件事复杂化了一点,我不确定你为什么认为你需要第 2 步。

以下对我来说很好用:

  1. 从不打开任何项目开始,创建一个新框架,在上面粘贴一两个组件(我只是使用了一个 TListBox),将其重命名为 MyFrame 并保存。

  2. 右键单击框架,select "Add to palette" 从上下文菜单中,完成随后的对话框以指定它应该出现在哪个调色板页面上并再次保存。默认情况下,它会将其称为 "MyFrameTemplate".

  3. 做一个 "Close All" 然后开始一个新项目。导航到您在第 2 步中指定的调色板页面,并像添加任何其他组件一样将 TMyFrame 的实例添加到表单。系统将提示您将框架的单位添加到您的项目中。这就是您需要做的全部。 Fin.

以上至少在 D7 和西雅图有效。

如果您重命名框架的 DFM 文件,然后尝试重新打开使用它的项目,IDE 会抱怨它无法打开 DFM,然后无法找到class TMyFrame 并询问是否应将其从您的表单中删除。因此,框架的使用取决于其 DFM 的存在,并且由于框架上组件的属性已经流式传输到其 DFM 中,因此很难看出如何防止它们以使用框架的形式被更改,因为您需要击败通常的蒸汽机制。也许有人知道一个巧妙的方法来做到这一点,但在我看来,如果那是你想要做的,TFrame 是最好的起点。

顺便说一句,如果你想防止你的评论中提到的事情被改变,我个人会把它作为一个新的复合组件来做,使用 GExpert 的 "components to code" 为其构造函数生成代码。

重要的是已发布的 属性 存在于组件所在的设计时包中,以便 IDE 能够流式传输它。

当您向项目添加框架时,相应的 'dfm' 文件包含在 TFrame class 中发布的属性。这包括 TabOrder 和其他人。当您关闭并重新打开项目时,它无法在 TCustomFrame 中找到 TabOrder,因此出现错误。

为了能够用更常见的组件进行解释,请将表单添加到您的项目中。将已发布的 属性 添加到您的表单。保存项目,关闭并重新打开。您不会在对象检查器中看到已发布的 属性。如果 IDE 尝试流式传输您的 属性,则会报错。

为了正确操作,您需要做的是在工具选项板中注册您的组件。为此,您需要将其编译到一个包中,因为您将无法在 TCustomFrame 上使用 "add to palette" 快捷方式。有关如何实现该目标的详细信息,请参阅 documentation。为方便起见,您可以从包含 TFrame 后代的单元开始,但不要忘记在保存单元之前手动删除 (Alt+F12) 更改后代后取消发布的属性。