根据类名(字符串)建立类实例

有时候需要根据类名来建立类的实例,比如把类名存于数据库,然后在程序中根据数据库中的
内容建立不同的窗体,下面的例子可以实现这个需求.

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的子类

posted @ 2010-08-25 23:45  覆雨翻云  阅读(485)  评论(0编辑  收藏  举报