3

我们将 C++ Builder 用于其表单保存在数据库中 EXE 外部的应用程序。应用程序代码是 C++

这允许我们在不重新编译的情况下修改表单和表单/操作。这是一个完成加载表单工作的代码片段。

 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,但希望有人知道已经这样做的函数。

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

4

2 回答 2

1

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

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

于 2009-09-16T23:17:43.813 回答
0

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

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

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

于 2009-06-30T02:59:59.007 回答