【问题标题】:How to properly define a TCustomFrame's child class?如何正确定义 TCustomFrame 的子类?
【发布时间】:2017-03-25 11:28:47
【问题描述】:

我正在尝试定义 TCustomFrame 的子类,但 TabOrder 属性出现错误。

这些是我遵循的步骤:

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

    TMyFrame = 类(TCustomFrame)

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

  4. 保存并关闭。
  5. 定义 TMyFrame 的开放单元。

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

有人可以澄清我所做的事情有什么问题以及如何正确创建 TCustomFrame 的子类吗?

【问题讨论】:

标签: delphi delphi-2007


【解决方案1】:

你似乎有点过于复杂了,我不确定你为什么认为你需要你的第 2 步。

以下对我来说很好用:

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

  2. 右键单击框架,从上下文菜单中选择“添加到调色板”,完成随后的对话框以指定它应该出现在哪个调色板页面上并再次保存。默认情况下,它会将其命名为“MyFrameTemplate”。

  3. 执行“全部关闭”,然后开始一个新项目。导航到您在步骤 2 中指定的调色板页面,并将 TMyFrame 的实例添加到表单中,就像添加任何其他组件一样。系统将提示您将框架的单元添加到您的项目中。这就是你需要做的所有事情。鳍。

上述方法至少可以追溯到 D7 和西雅图。

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

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

【讨论】:

  • 我正在尝试定义一个 TCustomFrame 后代,因为我想避免发布某些属性(在问题中,我发布了所有属性只是为了使测试更简单),此外我想要避免使用鼠标意外移动组件。
  • 那听起来有点像框架可能不是最好的起点。
  • 您也可以在运行时创建框架。这避免了使用鼠标移动组件,以及视觉继承的一些其他“奇怪”(但很少见)效果。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2018-01-20
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多