本人要动态的打开窗口(是几个中的一个),要用到变量,所以用到getclass,和registerclass函数,有那位用过请指教,最好有例子。

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      pClass:TFormClass;
      sFormClass:String;
      frm:TForm;
    begin
      sFormClass:='TForm2';//sFormClass:='TForm3';
      pClass:=TFormClass(GetClass(sFormClass));
      if pClass=nil then
      begin
        ShowMessage('Error');
        exit;
      end;
      frm:=pClass.Create(Application);
      frm.Show;
    end;end.unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm2 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}Initialization
      RegisterClass(TForm2);
    Finalization
      UnRegisterClass(TForm2);end.
    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm3 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.dfm}Initialization
      RegisterClass(TForm3);
    Finalization
      UnRegisterClass(TForm3);end.
      

  2.   

    我们在做一个比较大的系统(采用MDI方式)的时候,希望项目中的菜单、窗体全部是动态创建的,这样的话,程序员就很容易利用数据库将这些内容储存起来,需要的时候再根据这个用户的权限来取得相应的记录,根据这些记录来创建菜单、表单等!
      在这个过程中,我们必须面对的一个问题是: 在储存窗体对象的时候我们只能储存它的对象名(字符串), 但我们在程序中如何实现将字符串“转换”为对象名呢?(注:我这里用引号把“转换”引起来是因为:字符串是不可能转换为对象名的)  这个功能其实在一些伪编译的开发工具中,如VF中就比较容易实现,如在VFP中只要用一个“&”运算符就可以实现了!但由于DELPHI是一个编译程序,所以不可能这么去处理的!
      我们来看下面的简单例子:  //为了简单起见,在这里我没有写数据库操作的代码,只是直接写了一个字符串,实际使用的时候可以根据实际情况来写!1、在DELPHI集成开发环境中关闭所有的项目;2、建立一个新的MDI应用程序项目:file->new->other->projects->MDI Application;3、编辑MainMenu1,添加一个菜单项TestChange,并双击这个菜单项,编辑代码如下:4、在主窗口(mainform)中写上以下代码,以便调用你想要的窗口procedure TMainForm.Da1Click(Sender: TObject);
    var
      Child: TForm;//声明一个TForm类型的变量,做为显示子窗口的名称变量
    begin
       { create a new MDI child window }
      Child := GetClassName('TMDIChild');//TMDIChild就是你在数据库存储的,子窗口的类名!
      Child.Caption := 'hello world'; //设置窗体标题
      Child.Show;  //显示这个窗体
    end;
    5、编辑GetClassName函数:  private
        { Private declarations }
        procedure CreateMDIChild(const Name: string);
        Function GetClassName(tmpClass:String):TForm; //记得要在程序开头做声明
      public
        { Public declarations }
      end;....function TMainForm.GetClassName(tmpClass:String):TForm;
    var
     cClass:TClass;
    begin
     cClass:=GetClass(tmpClass);//取得类名
     if cClass <>nil then   //如果这个类已经注册
       application.CreateForm(TComponentClass(cClass),result);//创建这个类的实例
    end;
    5、在TMDIChild窗口中注册这个窗口的类:initialization
      registerClass(TMDIChild);finalization
      unregisterClass(TMDIChild);//注册完了当然要释放掉它了