一个 dfm 中的多个对话框
multiple dialogs inside one dfm
我正在开发一个包含许多小型自定义对话框的应用程序。
这些对话框例如提供选择、显示图表或提供额外的界面。大多数情况下,它们只需要很少的标记代码并且只有很少的子元素。
目前我正在使用 embarcadero'c XE2 RAD Studio 的 C++ Builder,它与 VCL 一起工作并为每个表单生成一个 .dfm 文件、一个 .h 文件和一个 .cpp 文件。
现在我想概述生成和合并的文件,例如多个小对话框的 .dfm 文件。 (甚至可能还有 .cpp 和 .h)。
不过,我也想用C++-Builder的VCL设计器。
有没有办法合并 .dfm 文件并让 IDE 的设计师照常工作?
或者我应该在运行时动态生成这些对话框吗?
Now I would like to keep an overview over the files produced and merge e.g. the .dfm files of multiple small dialogs. (maybe even the .cpp and .h, too). However, I also want to use C++-Builder's VCL designer.
Is there a way to merge .dfm files and still have the IDE's designer working as usual?
可以(但不推荐)将设计时生成的事件处理程序实现从一个 .cpp 文件移动到另一个 .cpp 文件(但不要移动它们在 .h 文件中的声明)。因此,可以想象拥有 1 个包含所有事件处理程序实现的 .cpp 文件,应用程序将正常运行。我在我的一个项目中做了相反的事情——我有一个 TForm
上面有很多事件处理程序,所以我将它们移动到按功能分组的单独的 .cpp 文件中(是的,我应该使用 TFrame
来管理它,但在这个开发阶段我不能随意改变它。
但是有一个副作用 - 如果您尝试在对象检查器中双击分配的事件,如果您移动它,它将无法找到处理程序的实现代码。
但是,对于 DFM,在设计时创建的每个 TForm
、TFrame
和 TDataModule
class 必须 有自己独立的 DFM。 IDE 和 DFM 流式传输系统都希望如此。最终可执行文件中的 DFM 资源由 class 名称标识,当将 DFM 加载到单个根对象实例时,DFM 流系统从头到尾读取整个 DFM 资源。此外,DFM数据格式不支持单个资源流中的多个DFM。
所以不,您不能将多个 DFM 合并在一起。
Or should I just dynamically generate those dialogs during runtime?
是的。或者只是让对话框使用单独的 DFM 资源。如果您的对话框确实像您说的那样内容少,那么您的可执行文件的开销应该是最小的。
您可以使用“遗留”TNotebook组件(RAD2007中的“Win3.1”页面)在一个文件中模拟许多小对话框;它像没有标签按钮的页面控件一样工作。在组件中创建所需数量的页面并在表单的构造函数中激活所需的页面。
我正在开发一个包含许多小型自定义对话框的应用程序。
这些对话框例如提供选择、显示图表或提供额外的界面。大多数情况下,它们只需要很少的标记代码并且只有很少的子元素。
目前我正在使用 embarcadero'c XE2 RAD Studio 的 C++ Builder,它与 VCL 一起工作并为每个表单生成一个 .dfm 文件、一个 .h 文件和一个 .cpp 文件。 现在我想概述生成和合并的文件,例如多个小对话框的 .dfm 文件。 (甚至可能还有 .cpp 和 .h)。 不过,我也想用C++-Builder的VCL设计器。
有没有办法合并 .dfm 文件并让 IDE 的设计师照常工作?
或者我应该在运行时动态生成这些对话框吗?
Now I would like to keep an overview over the files produced and merge e.g. the .dfm files of multiple small dialogs. (maybe even the .cpp and .h, too). However, I also want to use C++-Builder's VCL designer.
Is there a way to merge .dfm files and still have the IDE's designer working as usual?
可以(但不推荐)将设计时生成的事件处理程序实现从一个 .cpp 文件移动到另一个 .cpp 文件(但不要移动它们在 .h 文件中的声明)。因此,可以想象拥有 1 个包含所有事件处理程序实现的 .cpp 文件,应用程序将正常运行。我在我的一个项目中做了相反的事情——我有一个 TForm
上面有很多事件处理程序,所以我将它们移动到按功能分组的单独的 .cpp 文件中(是的,我应该使用 TFrame
来管理它,但在这个开发阶段我不能随意改变它。
但是有一个副作用 - 如果您尝试在对象检查器中双击分配的事件,如果您移动它,它将无法找到处理程序的实现代码。
但是,对于 DFM,在设计时创建的每个 TForm
、TFrame
和 TDataModule
class 必须 有自己独立的 DFM。 IDE 和 DFM 流式传输系统都希望如此。最终可执行文件中的 DFM 资源由 class 名称标识,当将 DFM 加载到单个根对象实例时,DFM 流系统从头到尾读取整个 DFM 资源。此外,DFM数据格式不支持单个资源流中的多个DFM。
所以不,您不能将多个 DFM 合并在一起。
Or should I just dynamically generate those dialogs during runtime?
是的。或者只是让对话框使用单独的 DFM 资源。如果您的对话框确实像您说的那样内容少,那么您的可执行文件的开销应该是最小的。
您可以使用“遗留”TNotebook组件(RAD2007中的“Win3.1”页面)在一个文件中模拟许多小对话框;它像没有标签按钮的页面控件一样工作。在组件中创建所需数量的页面并在表单的构造函数中激活所需的页面。