在C+中自动注册类+;建筑商VCL 我们使用C++ Builder作为一个应用程序,其表单被保存在数据库中的EXE外部。应用程序代码是C++

在C+中自动注册类+;建筑商VCL 我们使用C++ Builder作为一个应用程序,其表单被保存在数据库中的EXE外部。应用程序代码是C++,c++,c++builder,C++,C++builder,这允许我们修改表单和表单/操作,而无需重新编译。下面是一段代码,用于完成加载表单的工作 RegisterClass(__classid(TButton)); RegisterClass(__classid(TEdit)); RegisterClass(__classid(TRadioGroup)); RegisterClass(__classid(TGroupBox)); RegisterClass(__classid(TCheckBox)); RegisterClass(__cla

这允许我们修改表单和表单/操作,而无需重新编译。下面是一段代码,用于完成加载表单的工作

 RegisterClass(__classid(TButton));
 RegisterClass(__classid(TEdit));
 RegisterClass(__classid(TRadioGroup));
 RegisterClass(__classid(TGroupBox));
 RegisterClass(__classid(TCheckBox));
 RegisterClass(__classid(TRadioButton));
 RegisterClass(__classid(TTimer));
 RegisterClass(__classid(TListBox));
 RegisterClass(__classid(TComboBox));
 RegisterClass(__classid(TBitBtn));
 RegisterClass(__classid(TSpeedButton));
 RegisterClass(__classid(TMaskEdit));
 RegisterClass(__classid(TProgressBar));

 ms  = new TMemoryStream;
 ms2 = new TMemoryStream;

 // Loading Module into Memory Stream
 ms->Position = 0;
 ms->LoadFromFile(Filename->Text);
 ms->Position = 0;
 pModule = new TForm(this);

 // Reading Module Definition
 if( !Inputisbin->Checked )
 {
        ms2->Position = 0;
        ObjectTextToBinary(ms, ms2);
        ms2->Position = 0;
        ms2->ReadComponent(pModule);
 }
 else
        ms->ReadComponent(pModule);


 Log->Lines->Add("Displaying Module");
 pModule->Show();
我很想知道是否有任何内置函数可以调用来注册所有引用的类。我想可以自己扫描内存流或文件中的所有对象,并为每个对象调用RegisterClass,但希望有人知道已经实现了这一点的函数


因此,并非所有表单都使用所有这些类,因此最好只注册那些实际继承的类。

我不知道任何现有函数-对我来说,这似乎是一件非常罕见的事情。将表单DFM存储在数据库中的方法(它们分别存储在单元的CPP和H文件中?)也很奇怪。我知道你说“这允许我们在不重新编译的情况下修改表单和表单/操作”,但就我个人而言,我会将它们存储在DLL中并重新编译-至少在那时,根据构建系统的不同,它会被版本化,并且你会将你的单元存储为“单元”。我承认我不知道您的系统要求,您可能有很好的理由按照自己的方式来做

然而,考虑到您的方法,我认为扫描流、查找对象子句并在调用ReadComponent之前注册这些组件可能是最好的方法


单独存储DFM(为了只更改事件和操作处理程序)仍然会将CPP和H文件编译到主应用程序中。从那以后,您是否已经注册并内置了组件,因此这完全没有必要?

在我看来,您在这里采用的方法是完全正确的。几年前,我使用Delphi2采用了相同的方法,尽管我必须实现自己的类工厂和ObjectToText/TextToObject函数,因为VCL中从未出现ReadComponent()


关于只注册必需类的第二点,它们当然只需要注册一次?确定类是否需要注册的开销将超过注册所有内容的成本。同样,我会保持原样。

版本控制不是问题-我们自己开发的系统在存储DFM的数据库中处理版本控制。谢谢你的回复。事件处理程序并不重要——我最后编写了自己的ORM(对象关系映射器),将DFM连接到数据和事件。事件是用Perl编写的;我们在应用程序中嵌入了Perl解释器。除此之外,我们可以根据性能关键领域的需要随时使用C/C++。我们将这个“框架”用于我们构建它的系统之外的许多定制软件,它一直为我们提供良好的服务。