如何在Delphi中使用或解决可视化表单继承的问题?

时间:2008-10-10 08:20:56

标签: delphi inheritance

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

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

2 个答案:

答案 0 :(得分:27)

首先,对于那些不知道如何以可视方式继承表单的人,可以像往常一样创建祖先表单。然后转到文件>新>其他。选择包含当前项目名称的选项卡,然后选择要从中继承的表单。如果要从不属于当前项目的表单继承,请打开该表单,右键单击它,然后选择“添加到存储库”。然后你就可以去File>新>其他,并从相应的标签中选择该表格。

鉴于此,我遇到了问题,因为已经创建了一些后代表单,所以我无法按照上面的过程进行操作。此外,我根据Delphi创建的标准代码对表单进行了一些更改。我能够使用以下指南解决视觉形式继承的所有问题:

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

手册/ Tips:

  • 如果需要,允许非自动创建祖先表单和后代表单(在项目>选项>表单>自动创建表单中设置)。
  • 要将后代表单上的属性还原为祖先表单的值,请右键单击“对象检查器”中的属性,然后选择“还原为继承”。
  • 要将组件的所有属性值还原为祖先的值,请右键单击该组件,然后选择“还原为继承”。

答案 1 :(得分:1)

DPR似乎有点棘手。在我的例子中,我创建了一个源自TFrame的祖先。然后我从TAncestorFrame中导出了多个帧。我的DPR的使用条款看起来像:

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