一、VCL的原生方法简单易用:
1、 RegisterClass(__classid(TForm1));
必须要先注册,否则FindClass找不到这个类。这一步可以创建一个注册单元,将所有要生成的Form注册进去。
2、 TClass aClass = FindClass("TForm1");
TClass是从类名称生成实例的桥梁。
3、 TForm *Form = NULL;
Application->CreateForm(aClass,Form);
BCB用这种方法生成类实例。其Owner是Application , 当然也可以改变Owner。在生成实例这点,Delphi有着先天的优势,Delphi的代码更简单明了。
二、下面是BCB实现的一个简单的类工厂实现,不使用VCL的TClass机制 , 要较多的C++知识才好理解。(注:重要的是思路,而不是代码,参考一下<设计模式>会发觉这只是一个工厂模式而已)
#include
#include
//---------------------
typedef TComponent *(*TCreateMe)(TComponent* Owner);
struct TMyClassInfo
{
AnsiString ClassName;
TCreateMe CreateMe;
TMyClassInfo(AnsiString const &aClassName, TCreateMe aCreateMe) :
ClassName(aClassName), CreateMe(aCreateMe) {}
};
bool operator == (TMyClassInfo const &A, AnsiString const &ClassName)
{
return A.ClassName == ClassName;
}
//---------------------
class TMyClassFacatory // 单件模式的最简单实现:全局静态变量
{
static std::vector ClassInfo;
public :
static inline void RegisterClass(AnsiString const &ClassName, TCreateMe CreateMe)
{
// 这里没检查重名。
ClassInfo.push_back(TMyClassInfo(ClassName, CreateMe));
// 本文转自 C++Builder研究 -
}
static TComponent* CreateObject(AnsiString const&ClassName, TComponent *Owner)
{
std::vector::iterator pos;
pos = std::find(ClassInfo.begin(), ClassInfo.end(), ClassName);
if(pos != ClassInfo.end())
return pos->CreateMe(Owner);
return NULL;
}
// 这行可不要,放在这里是为了完整性。
static inline void DeleteObject(TComponent *x) { delete x; }
};
//---------------------
std::vector TMyClassFacatory::ClassInfo; // 为类的静态成员分配空间
// 下面的模板与宏是为了使用上更简单。
template
TComponent *_Class_CreateMe(TComponent *Owner){return new T(Owner);}
template
inline T *FactroyCreateObject(AnsiString const &ClassName, TComponent *Owner = NULL )
{
return (T*)TMyClassFacatory::CreateObject(ClassName, Owner);
}
#define FactroyRegisterClass(T) \
TMyClassFacatory::RegisterClass(#T, _Class_CreateMe);
// 用法更简单:
1、注册类:FactroyRegister(TForm1);
2、从类名生成实例
TForm *pForm = FactroyCreateObject("TForm1", this);
或:
TForm *pForm = (TForm *)TMyClassFacatory::CreateObject("TForm1", this);
阅读(748) | 评论(0) | 转发(0) |