在C ++ Builder的VCL自动化的RegisterClass
-
20-08-2019 - |
题
我们用C ++生成器用于应用其形式保持外部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每个而是希望有人知道的已经做了这个功能。
这样,不是所有形式使用所有这些类要么所以它会是不错的唯一寄存器那些实际上继承。
解决方案
您在这里的做法是完全正确的,在我看来。我采取了同样的做法年前使用Delphi2,虽然我不得不实现自己的类工厂和ObjectToText / TextToObject功能ReadComponent()在VCL从来没有达到过。
在您的唯一注册所需的类第二点,当然,他们只需要注册一次?并确定如果一个类需要被注册的开销,将超过登记的一切费用。再次,我会离开,因为它是
其他提示
我不知道任何现有的功能 - 它似乎相当罕见的事情必须做,对我来说。在数据库中存储的形式的DFM的方法(他们分别存储到CPP和H文件为单位?)也是奇数。我知道你说的“这让我们修改表格和表格/动作没有重新编译”,但我个人将它们存储在一个DLL并重新编译 - 至少,然后,根据您的构建系统上,它会版本,你就会有你的单位存储为“单位”。我承认我不知道您的系统要求,你可能有一个很好的理由这样做你的方式。
不过,考虑你的方法我觉得扫描流,找对象条款,并呼吁ReadComponent可能是最好的办法之前注册的组件。
分别存放DFM(为了只是改变事件和动作处理程序)仍有编译到主应用程序的CPP和H文件。从这一点,你会不会已经有组件注册,并内置的,所以这是完全没有必要的?