根据条件定义包含不同形式的 (.dfm) 文件
Include different form (.dfm) file based on a conditional define
我们为两个略有不同版本的机器生产了两个版本的软件。两台机器上使用的硬件完全不同,我们维护两个项目,Project1 和 Project2。一些代码(.pas 和 .dfm,视情况而定)在两个项目之间共享,但大多数代码目前是 Project1 或 Project2 所独有的。
Project2 最初是从 Project1 克隆的,目的是启动新机器运行,但现在我正在重组代码,以便两个项目之间可以使用相同的形式和单位以减少开发工作量。在需要时使用条件定义,如 {$IFDEF PROJ1}
。
我们有一个在项目之间几乎相同的表单,除了一个 TCheckBox 在 Project1 而不是 Project2 中。让我们用单元文件 Masking.pas(和 Masking.dfm)调用此表单 Masking
。
步骤:
- 将 Project1 中的 .pas 和 .dfm 移动到公共共享文件夹中
- 已将 Masking.dfm 重命名为 MaskingProj1.dfm
- 已将 Masking.dfm 从 Project2 复制到公共共享文件夹并重命名为 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 文件使用不同的表单文件?
这是表单继承的典型案例。
创建一个包含两个项目所需的所有控件的公共祖先窗体。现在为 Project1 继承此窗体并添加仅 Project1 需要的那些控件。然后对 Project2 执行相同的操作(此处可能没有要添加的控件)。
两个项目都包含通用形式,但每个项目只包含适合该项目的继承形式。
虽然您可以在这里省略 Project2 的继承形式,但为了清楚起见,我建议这样做。
我们为两个略有不同版本的机器生产了两个版本的软件。两台机器上使用的硬件完全不同,我们维护两个项目,Project1 和 Project2。一些代码(.pas 和 .dfm,视情况而定)在两个项目之间共享,但大多数代码目前是 Project1 或 Project2 所独有的。
Project2 最初是从 Project1 克隆的,目的是启动新机器运行,但现在我正在重组代码,以便两个项目之间可以使用相同的形式和单位以减少开发工作量。在需要时使用条件定义,如 {$IFDEF PROJ1}
。
我们有一个在项目之间几乎相同的表单,除了一个 TCheckBox 在 Project1 而不是 Project2 中。让我们用单元文件 Masking.pas(和 Masking.dfm)调用此表单 Masking
。
步骤:
- 将 Project1 中的 .pas 和 .dfm 移动到公共共享文件夹中
- 已将 Masking.dfm 重命名为 MaskingProj1.dfm
- 已将 Masking.dfm 从 Project2 复制到公共共享文件夹并重命名为 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 文件使用不同的表单文件?
这是表单继承的典型案例。
创建一个包含两个项目所需的所有控件的公共祖先窗体。现在为 Project1 继承此窗体并添加仅 Project1 需要的那些控件。然后对 Project2 执行相同的操作(此处可能没有要添加的控件)。
两个项目都包含通用形式,但每个项目只包含适合该项目的继承形式。
虽然您可以在这里省略 Project2 的继承形式,但为了清楚起见,我建议这样做。