根据类名(字符串)建立类实例
有时候需要根据类名来建立类的实例,比如把类名存于数据库,然后在程序中根据数据库中的
内容建立不同的窗体,下面的例子可以实现这个需求.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Controls, StdCtrls,Forms;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
public
procedure CreateForm(AClassName:string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//调用建立本身
CreateForm('TForm1');
end;
procedure TForm1.CreateForm(AClassName: string);
//如果查找到类类型(有的书叫类引用),则建立实例
begin
if GetClass(AClassName)<>nil then
TFormClass(FindClass(AClassName)).Create(self).Show;
end;
////下面的代码注册窗体类,你要注册才能用FindClass找到(以前记得好象不用注册?)
initialization
RegisterClass(TForm1);
end.
----------------------------------------------------------------------------
GetClass与FindClass的区别
GetClass不会引发错误,如果没有找到类,它会返回nil
FindClass如果找不到类,它会引发一个错误
---------------------------------------------------------------------------
可以注册并在运行期生成非窗体类,条件是该类必须TPersistentClass的子类