我们在项目进行的当中,碰到这样一个问题,随着项目的进行,由于窗体跟模块越来越多,大概有几百个,应用程序越来越大,现在已经接近20M,现在决定把所有的模块跟摸板都放到Dll里面去。应用程序中只保留主窗体!
现在碰到的问题是,由于我们所有的菜单都是动态创建的,所以窗体也都是用RTTI动态创建的,点击菜单时得到某一窗体名FormName,"T'+FormName得到该窗体的类型名称,然后通过这样的方式来创建 NewForm := TFormClass(FincClass('T'+FormName)).Create(Application),由于主窗体里什么都没有,我们必须在Dll里面实现RegisterClass[窗体类数祖],是在dll的begin..end 之间写吗?另外我们在dll里面定义了一个创建子窗体的函数:
CreateMDIChildForm(Application: TApplication; MDiMainForm: TForm; FormName:string)
var NewForm: TForm;
begin
  //此时如何判断该窗体是否已经被创建?
  if 如果没有被创建 then 
    NewForm := TFormClass(FIndClass('T'+ForMName)).Create(Application); //or Create(nil)?
  NewForm.Show;
end;
exports
  CreateMDIChildForm;
begin
  RegisterClass('窗体数祖');
end;
请问这样写有问题吗?以及CreateMDIChildForm怎么完善!
还有一个问题就是创建瘦客户机器程序一定要通过dll来实现吗?还可不可以通过方式实现,比如包的形式,以及怎么实现,谢谢了!

解决方案 »

  1.   

    我也这样做项目,
    不过我我采用功能分割,动态加载功能FORM的方法,不是采用动态注册类的方法,因为采用registerclass注册所有界面类的话,系统资源会不停的消耗下去,
    我采用动态功能菜单和按钮和事件,动态调入该最小功能FORM,最多一个功能为3个界面,这样避免资源的大量浪费,用完就释放,而且可以使我的DLL功能很多,但很小。
    我的主程序总共才800多K,而且很WEB化,可以用户自己定义功能的顺序,和用法。
    实现最大面向对象。
    采用DLL最大的麻烦就是静态注册DataModal的问题要解决好!就能达到目的。
      

  2.   

    有可能的话用COM实现。比较可靠……
      

  3.   

    bFoundChild := False;
           for I := 0 to MDIChildCount-1 do
           begin
               if(MDIChildren[I].ClassType = AFormClass) then
               begin
                    MDIChildren[I].BringToFront;
                    bFoundChild := True;
                    Break;
               end;
           end;
           if(not bFoundChild) then
           begin
                            FActiveClinetForm := AFormClass.Create(Self);
           end;