12

我一直在从事 Delphi 7 中的一个项目,我想让表单从其他表单继承组件。我能够得到这个工作,但遇到了以下问题(我将发布解决方案,希望将来能帮助其他人):

  1. 在表单的 .pas 文件中,我会将表单更改为从其他表单继承,但它不会从祖先表单中获取组件。
  2. 对于某些后代表单,我在设计时打开表单时会收到以下错误消息:“创建表单时出错:找不到'TAncestorForm'的祖先。” 我必须先手动打开祖先表单,然后才能打开后代表单。
4

2 回答 2

27

首先,对于那些不知道如何直观地继承表单的人,您可以像往常一样创建祖先表单。然后转到文件>新建>其他。选择带有当前项目名称的选项卡,然后选择要继承的表单。如果要从不属于当前项目的表单继承,请打开该表单,右键单击它,然后选择 Add to Repository。然后您将能够转到文件 > 新建 > 其他并从相应的选项卡中选择该表单。

鉴于此,我遇到了一些问题,因为已经创建了一些后代表单,所以我无法遵循上述过程。此外,我对 Delphi 创建的标准代码中的表单进行了一些更改。我能够使用以下准则解决视觉表单继承的所有问题:

  • 后代表单的 .pas 文件必须让表单的类继承自正确的祖先类,例如:
    type TMyForm = class(TAncestorForm)
  • 后代形式的 .dfm 中的第一行必须包含单词inherited而不是object,例如:
    inherited MyForm: TMyForm
  • 编辑:仔细检查后,不需要以下内容: 祖先形式的 .pas 文件必须具有 Delphi 创建的标准全局变量,例如:
    var AncestorForm: TAncestorForm;
  • 项目的 .dpr 文件的uses部分必须具有与单元文件名后的注释相同的全局变量,例如:
    unAncestor in 'unAncestor.pas' {AncestorForm}

注释/提示:

  • 如果需要,允许非自动创建祖先表单和后代表单(在项目 > 选项 > 表单 > 自动创建表单中设置)。
  • 要将后代表单上的属性恢复为祖先表单的值,请右键单击对象检查器中的属性,然后选择恢复为继承。
  • 要将组件的所有属性值恢复为祖先的值,请右键单击该组件并选择恢复为继承。
于 2008-10-10T08:21:26.003 回答
1

DPR 似乎比这更棘手。在我的例子中,我创建了一个从 TFrame 派生的祖先。然后我从 TAncestorFrame 派生了多个帧。我的 DPR 的 uses 子句看起来像:

uses
  Forms,
  ancestorFrame in 'ancestorFrame.pas' {AncestorFrame : TFrame},
  frame1Unit in 'frame1Unit.pas' {frame1:TFrame},
  frame2Unit in 'frame2Unit .pas' {frame2:TFrame},

DPROJ 文件应如下所示:

<DCCReference include="frame1Unit.pas">
  <Form>frame1</Form>
  <DesignClass>TFrame</DesignClass>
</DCCReference>

派生帧应如下所示:

TFrame1 = class(TAncestorFrame)

派生帧 .DFM 文件应该说:

inherited Frame1:TFrame1
于 2009-10-23T17:48:30.743 回答