【问题标题】:Include different form (.dfm) file based on a conditional define根据条件定义包含不同的格式 (.dfm) 文件
【发布时间】:2018-03-11 00:43:15
【问题描述】:

我们为两种略有不同的机器版本制作了两个版本的软件。两台机器上使用的硬件完全不同,我们维护了两个项目,Project1 和 Project2。一些代码(.pas 和 .dfm,视情况而定)在两个项目之间共享,但大多数代码目前是 Project1 或 Project2 独有的。

Project2 最初是从 Project1 中克隆出来的,以使新机器能够正常运行,但现在我正在重组代码,以便可以在两个项目之间使表单和单元通用,以减少开发工作量。在需要时使用条件定义,如{$IFDEF PROJ1}

我们有一个在项目之间几乎相同的表单,除了一个 TCheckBox 在 Project1 中但不在 Project2 中。让我们用单元文件 Masking.pas(和 Masking.dfm)将此表单称为 Masking

步骤:

  • 将 .pas 和 .dfm 从 Project1 移到公共共享文件夹中
  • 将 Masking.dfm 重命名为 MaskingProj1.dfm
  • 从 Project2 复制 Masking.dfm 到公共共享文件夹并重命名为 MaskingProj2.dfm
  • 手动编辑每个项目的项目 (.dpr) 文件以反映更改
  • 在 Masking.pas 中,将 {$R *.dfm} 更改为:

    {$IFDEF PROJECT1} {$R MaskingProj1.dfm} {$ELSE} {$R MaskingProj2.dfm} {$ENDIF}

  • 同样在 Masking.pas 中,使用 {$IFDEF PROJECT1} 条件定义编译出 TCheckBox 控件和 Project2 的相关代码。

最后,重新打开两个项目并重新编译。嘿,快!有用。现在 Project1 使用 Masking.pas 和 MaskingProj1.dfm。 Project2 使用 Masking.pas 和 MaskingProj2.dfm。

这一切似乎工作正常...除了当我尝试在 IDE 中查看表单时,通过在表单和单位之间切换 (F12),什么都没有显示。我可以手动编辑任何一个 .dfm 文件,并且更改会在重新编译后反映在应用程序中……但 IDE 不会显示表单。

我做错了什么?是否可以通过这种方式更改{$R *.dfm} 以使.pas 文件使用不同的表单文件,具体取决于条件定义?

【问题讨论】:

  • 我怀疑 IDE 是否能够理解条件并根据它们编辑不同的 DFM。 编译器对此没有问题,但IDE有。
  • 条件定义仅在编译时起作用,在 IDE 中不起作用。
  • 你可以使用插件架构来解决这个问题。例如。创建两个实现公共接口的 DLL,并在创建窗体的 DLL 中具有 ShowDialog 函数。您还可以添加 GetData 和 SetData 函数以从表单中获取和设置数据。
  • 唯一的区别是 TCheckBox 的存在,我只需 HideShow 它以 OnCreate() 事件的形式使用 {ifdef} 块。
  • 作为建议,除非绝对必要,否则不要这样做。我继承了一个系统,由于在包装 COM 对象时出现了一些问题,所以有人这样做了。我最终重写了以编程方式创建有问题的控件。

标签: delphi delphi-7 dfm


【解决方案1】:

这是表单继承的典型案例。

创建一个共同的祖先表单,其中包含两个项目所需的所有控件。现在为 Project1 继承此表单并添加仅 Project1 所需的控件。然后对 Project2 执行相同的操作(此处可能没有要添加的控件)。

两个项目都包含共同的形式,但每个项目只包含适合该项目的继承形式。

虽然您可以在此处省略 Project2 的继承形式,但为了清楚起见,我建议这样做。

【讨论】:

  • 表单继承是一个很好的解决方案。但是由于这些表格用于两个不同的项目,我们的缺点是您仍然需要两个 DFM 文件。 Tom Brunberg(见 cmets)关于使用 {$IFDEF} 显示或隐藏复选框的建议在我的情况下更清晰。由于 Tom 没有把这个写成可能的答案,我会接受你的......并希望这个和 Tom 的 cmets 对任何寻求解决此类问题的人来说都是有用的附录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多