使用动态调用bpl方式编写模块化的程序,可动态创建bpl里的窗体的时候必须知道bpl里用registerclass注册的“TForm”的具体名称,如何才能提取到指定bpl中用registerclass注册单元的类名?

解决方案 »

  1.   

    示例如下, 但你首先必须保证那些RegisterClass必须运行过
    procedure TForm1.Button1Click(Sender: TObject);
    var
      f: TClassFinder;
    begin
      RegisterClass(TForm1);
      f := TClassFinder.Create(Nil);
      try
        f.GetClasses(ClassCallBack);
      finally
        f.Free;
      end;
    end;procedure TForm1.ClassCallBack(AClass: TPersistentClass);
    begin
      Memo1.Lines.Add(AClass.ClassName);
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      c: TClassFinder;
    begin
      c := TClassFinder.Create(TForm);
      try
        c.GetClasses(DisplayClass);
      finally
        c.Free;
      end;
    end;procedure TForm1.DisplayClass(AClass: TPersistentClass);
    begin
      if (AClass <> TForm) and AClass.InheritsFrom(TForm) then
        Memo1.Lines.Add(AClass.ClassName);
     //  ListBox1.Items.Add(AClass.ClassName);
    end;
    initialization
      RegisterClass(TForm1);
      

  3.   

    TComponent
    TPersistent
    TMenuItem
    TForm1
    TForm
    TCustomForm
    TScrollingWinControl
    TWinControl
    TControl得到一大堆没用的东西,没有我自己注册的内容
      

  4.   

    http://www.e-midas.cn/Article_Show.asp?ArticleID=115
    正是你想要的
      

  5.   

    找到原因了,是因为没有带包运行,但是怎么从众多类里面滤除不想要的?我的form定义如下
    TAAForm=class(TForm)
    Tmyform=class(TAAForm)AClass.InheritsFrom(TAAForm) 返回false
      

  6.   

    问题解决了,但还有一点不明,GetClasses(DisplayClass);
    得到的是所有registerclass注册过的类,还是最近一次loadpackage时注册过的类?谢谢spirit_sheng(老盛)和aiirii(ari-http://spaces.msn.com/members/aiirii/) ,请接分!
    另外请spirit_sheng(老盛)
    到http://community.csdn.net/Expert/topic/4420/4420570.xml?temp=1.440066E-02
    再领40分aiirii在那里已经有发言了!
      

  7.   

    TO proman2003(旗舰):
    分已经够多了, 谢了, 再领就不必了