各位大侠们,你们好,问题是这个样子的,我有一个单元UUser,里面的类是TfrmUser,我在这个单元里面注册了这个类,
initialization
  RegisterClass(TfrmUser);
然后我在我的主程序里面GetClass('TfrmUser')总是返回一个nil值,不知道什么原因,到网上找了些资料,说是把porject ->Build with Runtime packages选上,我选上也不行,但是我重新建立一个application,就两个窗体,用上面的方法是可以得到这个类的。不知道我的是什么原因。
 
我程序是这个样子做的,首先我的主程序是frmMain,启动时的程序是frmWelcome,登入界面是frmLogin,DataModule:UPt_DM 然后就有一个frmUser窗体,运行的基本代码是:
{工程文件}
program....
begin
  Application.Initialize;
  Application.CreateForm(TDM_PT, DM_PT);
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.{Data Module}
procedure TDM_PT.DataModuleCreate(Sender: TObject);
begin
  Application.CreateForm(TfrmWelcome, frmWelcome);
  frmWelcome.ShowModal;
end;{主程序}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.CreateForm(TfrmLogin, frmLogin);
  frmLogin.ShowModal;
end;{登入窗口的登入按钮}
procedure TfrmLogin.Spb_OkClick(Sender: TObject);
begin
  frmLogin.Close;
  frmMain.Show;
  frmMain.WindowState := wsMaximized;
end;
{UUser中的注册类代码}
unit UfrmUser;
...
initialization
  RegisterClass(TfrmUser);{主程序中的找类过程}
{FormName是窗体名字}
procedure ShowForm(FormName: String);
var
  FormClass: TFormClass;
  Form: TForm;
  FormClassName: String;
begin
  FormClassName := 'T' + FormName;
  FormClass := TFormClass(GetClass(FormClassName));//为什么这里总是返回nil,???
  if FormClass = nil then Exit;
  begin
    Application.CreateForm(FormClass,Form);
    try
      Form.Show;
    finally
    end;
  end;
end;麻烦大侠指点一下,谢谢  

解决方案 »

  1.   

    你要在主程序中引用 UfrmUser单元.
    以下是我的例子.//Unit1相当你的主程序
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;procedure ShowForm(FormName: String);
    var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure ShowForm(FormName: String);
    var
      FormClass: TFormClass;
      Form: TForm;
      FormClassName: String;
    begin
      FormClassName :='T'+ FormName;
      FormClass := TFormClass(GetClass(FormClassName)) ;//为什么这里总是返回nil,???
      if FormClass = nil then Exit;
      begin
        Application.CreateForm(FormClass,Form);
        try
          Form.Show;
        finally
        end;
      end;
    end;procedure TForm1.btn1Click(Sender: TObject);
    begin
      ShowForm(Form2.Name);
    end;procedure TForm1.btn2Click(Sender: TObject);
    begin
      RegisterClass(TForm2);
    end;end.//Unit2相当于你的UfrmUser
    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);
    end.
      

  2.   

    你的class 至少要从 TPersistentClass 这个类继承, 才能得到你要的效果
      

  3.   

    没有创建当然是nil
    procedure CreateFormFromName(const FormName: string);//=TFirstForm
    var
      fc: TFormClass;
      f: TForm;
    begin
    //  TFormClass(FindClass(FormName)).Create(Application).Show;
      fc := TFormClass(FindClass(FormName));
      f := fc.Create(Application);
      f.Show;
    end;procedure TMainForm.FormCreate(Sender: TObject);
    begin
      RegisterClass(TFirstForm);
    end;
      

  4.   

    cdsgajxlp(起名很难),你的这种写法不是我想要的,你注册一个类是在主程序里面的OnCreate事件里面,因为我想是在我需要显示的窗体里面注册这个类,然后在主程序里面去找这个类,然后动态创建。我新建一个Application,然后用我的procedure ShowForm(FormName: String);过程是可以运行的,不知道我的这个程序那些地方需要改改。
        
       aiirii(ari-淘金坑) 能不能讲详细一点,具体怎么做,我的这个frmUser窗体是继承的另外一个窗体。谢谢,指点一下
      

  5.   

    cncharles(旺仔) 如果我的窗体有100个要调用,怎么搞,?是不是只显示窗体就有很多的代码,而且你那样写,代码不灵活。。
      

  6.   

    为什么我新建一个Application,这样写是可以的。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Unit3;type
      TfrmMain = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation
    {$R *.dfm}
    procedure ShowForm(FormClassName: String);
    var
      FormClass: TFormClass;
      Form: TForm;
      FormName: String;
    begin
      FormName := 'T' + FormClassName;
      FormClass := TFormClass(GetClass(FormName));
      if FormClass = nil then Exit;
      begin
        Application.CreateForm(FormClass,Form);
        try
          Form.Show;
        finally
        end;
      end;
    end;procedure TfrmMain.Button1Click(Sender: TObject);
    begin
      ShowForm('frmSingle');
    end;end.----------------------------------------
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TfrmSingle = class(TForm)
        Label1: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmSingle: TfrmSingle;implementation{$R *.dfm}initialization
      RegisterClass(TfrmSingle);end.
     
      

  7.   

    没看你的代码.估计你没做错什么,除了把GETCLASS换成FINDCLASS之外.