¹Ø¼ü×Ö£ºVCLÔÉúÀà,À๤³§,ClassFacatory,ppower
Ò»¡¢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 <vector>
#include <Classes.hpp>
//---------------------
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)
// ±¾ÎÄת×Ô C++Builder Ñо¿ - http://www.ccrun.com/article.asp?i=655&d=a38061
{
return A.ClassName == ClassName;
}
//---------------------
class TMyClassFacatory // µ¥¼þģʽµÄ×î¼òµ¥ÊµÏÖ:È«¾Ö¾²Ì¬±äÁ¿
{
static std::vector<TMyClassInfo> ClassInfo;
public :
static inline void RegisterClass(AnsiString const &ClassName, TCreateMe CreateMe)
{
// ÕâÀïû¼ì²éÖØÃû¡£
ClassInfo.push_back(TMyClassInfo(ClassName, CreateMe));
}
static TComponent* CreateObject(AnsiString const&ClassName, TComponent *Owner)
{
std::vector<TMyClassInfo>::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<TMyClassInfo> TMyClassFacatory::ClassInfo; // ΪÀàµÄ¾²Ì¬³ÉÔ±·ÖÅä¿Õ¼ä
// ÏÂÃæµÄÄ£°åÓëºêÊÇΪÁËʹÓÃÉϸü¼òµ¥¡£
template <typename T>
TComponent *_Class_CreateMe(TComponent *Owner){return new T(Owner);}
template <typename T>
inline T *FactroyCreateObject(AnsiString const &ClassName, TComponent *Owner = NULL )
{
return (T*)TMyClassFacatory::CreateObject(ClassName, Owner);
}
#define FactroyRegisterClass(T)
TMyClassFacatory::RegisterClass(#T, _Class_CreateMe<T>);
// Ó÷¨¸ü¼òµ¥£º
1¡¢×¢²áÀࣺFactroyRegister(TForm1);
2¡¢´ÓÀàÃûÉú³ÉʵÀý
TForm *pForm = FactroyCreateObject<TForm>("TForm1", this);
»ò:
TForm *pForm = (TForm *)TMyClassFacatory::CreateObject("TForm1", this);
|