在我的工程中,有很多的窗体,但是我都没有用“Atuo Create”,我希望在用户点击菜单后,动态加载并显示。由于我的菜单都是通过数据库中的记录来生成的,所以在用户点击菜单时,我只能获取到窗体的名称。    我在发贴前也,看了一些以前的帖子,但是都没有能解决。看看哪位大侠能帮帮我!!!

解决方案 »

  1.   

    //
    建一个Data Module用TAction,静态的将所有创建窗口语句写上,然后菜单与TAction绑定,,最后与数据库联接来控制TAction的显示
      

  2.   

    TO hongqi162(失踪的月亮):
    你是说,先把窗体生成的语句都写在代码中,每一个窗体的生成代码都是作为一个ACTION来处理。是吧?但是这样的工作量也很大啊,我就是不想这样处理。 
      

  3.   

    http://www.7880.com/Info/Article-60fd1a00.html
      

  4.   

    谢谢,我就用下面的来创建类
    //创建一个类
    function TShowFormClass.CreateAClass(const AClassName: string): TForm;
    var
      LFormClass : TFormClass;
      LForm: TForm;
    begin
      LFormClass := TFormClass(FindClass(AClassName));
      LForm := LFormClass.Create(Application);
      Result := LForm;
    end;
    并在调用事件中,如下写,但是执行到该语句时,系统提示类“FfrmUsers”不存在,但是该窗体肯定是存在。
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      LForm: TForm;
    begin
      LForm := CreateAClass('TfrmUsers');
      try
        LForm.ShowModal;
      finally
        LForm.Free;
      end;end;
      

  5.   

    在TShowFormClass中是否添加了“TfrmUsers”的引用
      

  6.   

    把菜单的Tag设成数据字段的ID,当菜单时根据这个Tag来创建窗体,在一个菜单的OnClick事件中写以下代码:
    Case TMenuItem(Sender).Tag of
    1:fm1:=TForm1.Create;
    2:fm2:=TForm2.Create;
    ...
    end;
    这样所有的菜单使用同样的事件。
      

  7.   

    谢谢大家,但是好像还是不是我所想要的。我希望的是,我不需要在任何地方,把现有的窗体做一一列举,比如cmd9x(平常的心) 中,其实也是要把所以的窗体在Case TMenuItem(Sender).Tag of
    1:fm1:=TForm1.Create;
    2:fm2:=TForm2.Create;
    ...
    end;中列举下。其实hongqi162(失踪的月亮)说的倒是我想要的,但是还是有问题,不行。
      

  8.   

    我看你要实现一个通用灵活的form才行,在配置里面保存好所有界面要素,根据界面名称动态创建才好
      

  9.   

    谁能帮帮我啊,解决后,我另开贴酬谢啊。我先设置了一个函数CreateAClass
    function TfrmMain.CreateAClass(const AClassName: string): TForm;
    var
      LFormClass : TFormClass;
      LForm: TForm;
    begin
      LFormClass := TFormClass(FindClass(AClassName));
      LForm := LFormClass.Create(Application);
      Result := LForm;
    end;然后在BUTTON的事件中调用,
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      LForm: TForm;
    begin
      LForm := CreateAClass('TfrmSite');
      try
        LForm.ShowModal;
      finally
        LForm.Free;
      end;
    end;但是每次运行的时候都报错,说“Class TfrmSite not found”.即使我在frmSite模块的最后(.end前面)使用方法
    initialization
    RegisterClasses(TfrmSite);依然是这样的错误提示啊。各位大哥,快来帮帮忙啊!!!!!!!!!!!!
      

  10.   

    var
      LFormClass : TFormClass;
      LForm: TForm;
    begin
      //LFormClass := TFormClass(FindClass(AClassName));  <---------------已经进行了转换了
      //LForm := LFormClass.Create(Application);  LForm := TFormClass(FindClass(AClassName)).Create(Self);
      

  11.   

    你的窗体单元是放在DLL里?
      

  12.   

    但是每次运行的时候都报错,说“Class TfrmSite not found”.即使我在frmSite模块的最后(.end前面)使用方法
    initialization
    RegisterClasses(TfrmSite);依然是这样的错误提示啊。------------
    用了RegisterClasses(TfrmSite);肯定可以找到类的,除非你的工程根本没use frmSite单元
      

  13.   

    不是在DLL中的。
    TO zaza_bbface(我试着成熟一点~) ,
    我在frmMain中已经引用了单元UnitSite(就是frmSite所对应的单元)了啊,不会这两个名字一定要一样的吧。
      

  14.   

    var
      LForm: TLForm;implementation{$R *.dfm}function TShowFormClass.CreateAClass(const AClassName: string): TForm;
    begin
      if AClassName='LForm' then
        Result := LForm;
      else
        Result := nil;
    end;
      

  15.   

    TO starsky2006(星空无限),
    谢谢写的回帖,但是按照你的方法,那如果我有很多的窗体的话,是不是要一一列举呢?我现在就是不想一一列举,不想一有新的窗体,就要来更改这个过程。
      

  16.   

    在 Unit2 中加
    initialization
      RegisterClass(TForm2);
    在 Unit1 中
    procedure TForm1.Button1Click(Sender: TObject);
    var
      pc: TPersistentClass;
      fc: TFormClass;
      f: TForm;
    begin
      pc := FindClass('TForm2');
      fc := TFormClass(pc);
      f := fc.Create(Self);
      f.Show;
    end;win2003 + d7 调试通过
      

  17.   

    各位啊,我测试了一下,wwwcampus(稻草) 、netfly(支点)和hongqi162(失踪的月亮) 说的方法,如果我新建一个工程的话,都是可行的。但是在我的程序中就是不行,老是报什么类不存在(我已经使用RegisterClass了)。我用的是模板编程的,所以我想知道这啊会有什么影响啊?
      

  18.   

    如果你是用模板编程,很可能是你的系统前后有两个放CLASS的CLASSLIST(D5,D7,D6在这个地方都略有不同), 这样最好的方法是一自己定义一个全局的LIST然后自己往这个LIST里进行注册,并从这里来FIND就可以了.
      

  19.   

    TO netfly(支点) :我好像不是很理解啊?你能说详细点,或者给我一个简单的例子啊?谢谢。
      

  20.   

    把窗体放到dll中,每个dll都实现几个通用函数:
    createandshow;
    getformname;
    getmenuiten;主程序扫描指定文件夹的所有dll文件,遍历并动态生成菜单。
    每个菜单都调用这几个通用函数即可
      

  21.   

    在D中, 系统一般使用CLASSLIST(D7是RegGroups)这个全局变量来保存所有注册的类的类(class of class)
    例如在D5中, RegisterClass这个函数,实际就是把你的类ADD到CLASSLIST这个变量(D5里是一个TThreadList). 然后FindClass从这个全局变量中找出你的那个类的类,然后再创建.你的那个问题应该是注册的和读取的应该不是同一个地方,可以调试跟踪一下.如果不想的话,也可以根据这个原理,我们可以自己做一个自己的LIST来自己控制,自己读取(无非就是抄一次VCL的代码),呵呵.
      

  22.   

    问题尚未解决,还没有按照netfly(支点) 说的去试试呢。
    试后如果还不可以,另开贴请教,答谢各位,先把该贴结了,谢谢大家的帮助。