注册自定义表单,以便我可以从多个项目继承它,而无需将表单复制到Object Repository文件夹

Cos*_*und 8 forms delphi repository delphi-2010

我有一个我需要在多个项目中继承的自定义框架.这个框架包含一些代码和一些组件,它位于磁盘上的某个位置,位于它自己的项目目录中.我不想将它复制到Object Repository文件夹,这对我来说似乎不对:我最终有两个表单副本,一个在我的Mercurial支持的存储库中,一个在Delphi的Object Repository中.绝对不是个好主意.

我想要的是让我的框架在一个包中,并让包执行使IDE知道框架所需的所有内容,并允许IDE创建给定框架的新兄弟,而无需实际将框架添加到每个项目.

到目前为止我做了什么,我遇到的问题,我试过的解决方案:

  1. 我将我的框架包,使用这两种注册我的框架RegisterClassRegisterNoIcon. 问题:当我进入一些其他的项目,并尝试打开得出的帧编辑它说,它无法找到我原来的框架.
  2. 为了解决问题"1",我想我必须将我的框架注册为自定义模块.所以我打电话给RegisterCustomModule(TMyFrameName, TCustomModule).问题:在"其他"项目中,我打开派生框架,IDE不会在原始框架上创建组件,并且IDE抱怨其中一个"继承"组件缺失.
  3. 要修复"2",我以为我会通过调用给IDE一个帮助InitInheritedComponent(Self, TFrame).这有助于,当我尝试在"其他"项目中打开框架时,所有内容都重新创建,我能够按照我的预期看到框架.问题:当我保存框架时,它会忘记所有有关继承组件的内容,将每个组件视为添加到此特定框架的新组件.如果我查看保存的DFM,一切都以"对象"开头,没有任何东西以"继承"开头,正如我所料.

不幸的是我遇到了问题"3".我尝试深入研究Classes.pas,ToolsAPI,DesignIntf​​和DesignEditors,但没有找到任何有用的东西.显然我希望在DFM中看到的"继承"属性是由TWriter在流式传输TComponent之前分配"TWriter.Ancestor"属性时生成的,但是我无法设置它,IDE需要设置它起来.我不能说服IDE为我做这件事.

以下是累积的相关代码部分:

TTestFrame = class(TFrame)
public
  constructor Create(Owner:TComponent);override;
end;

constructor TTestFrame.Create(Owner: TComponent);
begin
  inherited;
  if csDesignInstance in ComponentState then InitInheritedComponent(Self, TFrame);
end;

procedure Register;
begin
  RegisterClass(TTestFrame);
  RegisterNoIcon([TTestFrame]);
  RegisterCustomModule(TTestFrame, TCustomModule);
end;
Run Code Online (Sandbox Code Playgroud)

任何想法,除了"放弃并将你的东西放入对象存储库"?谢谢!


编辑

为什么我需要这样做以及为什么依赖于实际路径名称的解决方案被写入我的项目文件中的原因不起作用:我想支持分支:当一个分支时,合理地期望同一个项目的多个版本"活着"同一台机器上的不同目录.推论,我不能在同一个地方同时拥有同一个项目的多个版本.

为了确保这项工作,我决定让我的项目不依赖于生活的地方,为了实施这一点,我的团队克隆(Mercurial术语)或Check Out(SVN术语)的每个人都在不同的目录中.我系统上的硬编码路径在我的同事系统中不会很好:如果我们中的任何一个人犯了将任何路径硬编码到应用程序中的错误,那么它不久就会对我们中的一个进行制动,所以错误得到修复.

这当然是我们需要继承的某些库(因此它们不在我们项目的目录中)的一部分的表单和框架的问题!为了在处理这些文件时获得IDE支持,我们需要暂时将它们添加到项目中,我们不必忘记在完成后删除它们.如果我们忘记并推送/检查更改,更改将为我们的同事制造构建(因为他们在不同位置检查了库).

为了解决这个问题,我尝试将这些框架和表单添加到设计时包中(使用完整路径将包加载到IDE中,但路径不是项目文件的一部分,所以没关系).不幸的是,这失败了,我发布了这个问题.

Mar*_*ema 1

呃,如果只是将要重用的框架添加到要重用的项目中,有什么问题吗?

例如

  • Project1.dpr 使用 Form1 和 Frame1,您想要重用 Frame1。
  • 在不同的文件夹中启动新的 VCL 表单项目。
  • 当您单击工具选项板“标准”页面上的框架时,系统会提示没有框架。
  • 通过项目管理器将 Frame1 单元添加到该项目(以便将其添加到 dpr 中的使用列表中)。
  • 现在单击工具选项板“标准”页面上的框架将显示可供选择的框架 1。
  • 并右键单击项目管理器中的项目,然后选择添加新| 其他并转到“可继承项目”,也将 Frame1 显示为可继承项目。

编辑

如果您不想在 dpr 中包含框架的硬编码路径,则始终可以使用 IDE 的环境变量。

  • 转到工具| 选项| 环境变量。
  • 添加 var MYLIB 并将其指向适用于您当前所在分支的文件夹。
  • 添加包含源文件夹路径的文件并将其添加到源代码管理中。这可能是现在包含 MYLIB 值的注册表项的导出。
  • 将 $(MYLIB) 添加到项目的库路径中。
  • 将框架添加到您的项目中。它们现在应该包含在没有路径的 dpr 中(因为可以在库路径上找到它们)。
  • 集成分支时:确保相应更改具有 MYLIB 值的源文件。
  • 切换分支时:激活 MYLIB 的正确值。如果您将 .reg 文件添加到源代码管理:只需双击它即可更改 MYLIB 注册表的键值。