在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++。我们将这个“框架”用于我们构建它的系统之外的许多定制软件,它一直为我们提供良好的服务。