把用到的form放在一个dll里面,在dll中写一个showform的方法,在你的应用程序中调用这个dll

解决方案 »

  1.   

    在数据中建立一个对应的编号和form名称,然后设计一个通用的过程
    Procedure showForm(i,FormArr);
    begin
      formArr[i].show;
    end;
    不妨试一下!
      

  2.   

    VFP中有这样的用法
    s:='form1'
    &s.show;
    DEPHI 不清楚。
      

  3.   

    如果把所有的form放在dll中,那么这个showform该怎么写,我要传递给
    showform的参数是字符型的form的类名?如果把所有的form放在一个数组中,那么如何对这个数组初始化呢?
    手工一个一个赋值吗?那么编程过程中,随着功能的增加,合并等,
    我要手工维护这样一个数组,使其与数据库中的一致,那还不如不用动态
    菜单,直接用菜单编辑呢。还有更好的办法吗?
      

  4.   

    用bpl封装form;
    再动态调用!
      

  5.   

    我的菜单就是这样实现的,不过都是MDI形式的;你的表中最是保存FROM的名字;
    最体实现如下;
    procedure TMainForm.mymenuexcute(sender:Tobject);
    //所有菜单按钮执行的事件
    var
      tmpmenuname:string;
    begin
      tmpmenuname:=Tmenuitem(sender).name;
      lockwindowupdate(handle);
      try
        execute(tmpmenuname);
      finally
        lockwindowupdate(0);
      end;
    end;
    //执行具体功能;
    procedure TMainForm.execute(const agnbh:string);
    var
      exename: array[0..79] of char;
      fldname:string;
    begin
      with qsel_runexe do
      begin
        if active then close;
        parambyname('name').asstring:=agnbh;
        open; //根据菜单名字提取FORM名字
        if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then
        begin
          fldname:=trim(fieldbyname('frmname').asstring);
          if fldname='frmabc' then 
          begin
            if not checkMDIChildform('frmabc') then
            //查找此子窗体是否存生的函数!
            begin
               application.createform(Tfrmabc,frmabc);
            end else frmabc.show;
         end;
      end;
    end;
      

  6.   

    可是以上程序无论从数据库中返回的是什么,都是打开frmabc这个form呀?
    不知可否解释得再详细些?
      

  7.   

    把楼上的改一下就可以了呀!procedure TMainForm.execute(const agnbh:string);
    var
      exename: array[0..79] of char;
      fldname:string;  classname:string; //add by cxz
    begin
      with qsel_runexe do
      begin
        if active then close;
        parambyname('name').asstring:=agnbh;
        open; //根据菜单名字提取FORM名字
        if (recordcount=1) and (fieldbyname('frmname').asstring<>'') then
        begin
          fldname:=trim(fieldbyname('frmname').asstring);
          classname:='T'+fldname;//add by cxz            if not checkMDIChildform(fldname) then
            //查找此子窗体是否存生的函数!
            begin
               application.createform(classname,fldname);//by cxz
            end else Tform(fldname).Show; //by cxz     end;
      end;
    end;
      

  8.   

    Delphi提供以下函数:Getclass(ClassName) 获取某个名称的类型,不过那些类型必须要经过注册才可以被找到(否则返回空).
    RegisterClass(Class) 注册一个类。
    下面举一个例子:再FormUnit里有一个TmyForm窗体类,可以这么处理。
    1. 在FormUnit的最后加上
    Initialization
      //注册TmyForm
      RegisterClass(TmyForm) ;
    end ;2. 在需要的地方(比如在函数CreateFormByClassname(sClassName: String))
    function CreateFormByClassname(sClassName: String): TForm ;
    var
      rClass: TClass ;
    begin
      rClass := GetClass(sClassName) ;
      if  rClass <> nil  then
        //我不知道原因,但是TComponentClass(rClass).Create(nil)
        //好象会返回已经存在的对象,而application.CreateForm则不会
        application.CreateForm(TComponentClass(rClass),Result) ;
    end ;