我们在项目进行的当中,碰到这样一个问题,随着项目的进行,由于窗体跟模块越来越多,大概有几百个,应用程序越来越大,现在已经接近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.   

    CreateMDIChildForm(Application: TApplication;var MDiMainForm: TForm; FormName:string)
    var NewForm: TForm;
    begin
      //此时如何判断该窗体是否已经被创建?
      if Assigned(MDIMainForm)=false then //窗体没有被创建
        NewForm := TFormClass(FIndClass('T'+ForMName)).Create(Application); //or Create(nil)?
      NewForm.Show;
    end;
    exports
      CreateMDIChildForm;
    begin
      RegisterClass('窗体数祖');
    end;
      

  2.   

    我是要判断子窗体有没有被创建啊,也就是窗体名为FormName的窗体类TFormName有没有实例被创建啊
      

  3.   

    还有一个问题,我是每一个模块写一个dll呢,还是一个摸板写一个dll,哪种效率更高(1个摸板有100个模块)
      

  4.   

    if Not Assigned(Application.FindComponent(ComponentName)) then
      ShowMessage(Format('Component %s is not created',[ComponentName]))
    else
      ShowMessage(Format('Component %s is created already',[ComponentName]))
      

  5.   

    不过你Create的时候,必须是.Create(Application);
      

  6.   

    谢谢,恶渔杀手!明天我去试一试!
    还有一个问题,我是每一个模块写一个dll呢,还是一个摸板写一个dll,哪种效率更高(1个摸板有100个模块)
      

  7.   

    目前3个,每个摸板大概有100个左右的模块,我想是将继承自同一类摸板的模块放在一个Dll中,但考虑到我创建某一个窗体时要将一个Dll,全部调进来,但其实我只创建一个窗体,是不是有点奢侈了,到底是将一个模块做成一个Dll呢,还是将继承自同一类摸板的模块放在一个Dll中!
      

  8.   

    为什么不把常用的放到一个DLL中呢?
      

  9.   

    每个动态库都是一个程序
    用FindWindow函数查找程序句柄是否存在,判断程序是否创建。
      

  10.   

    狂到~~~~~~~~楼上的学过SDK没有??学过英文没有??FindWindow的字面意思是什么你看得懂么???查找窗口!根本就不是什么查找程序。只是根据窗口类或者标题来查找窗口句柄。你知道什么是DLL么?
      

  11.   

    假设3个魔板,每个魔板100个模块。为什么要将思维局限在1个魔板封装成一个DLL或者1个模块封装成一个DLL呢??
    为什么不10个模块一个DLL呢?
      

  12.   

    为什么10个模块一个Dll呢?因为我的Dll是动态调用的,所以每次创建的时候动态调用一次,但我要调用含有10个或者100个模块的Dll.是不是浪费了呢?因为要加载到内存中的哦!
      

  13.   

    我是举个例子啊~~~~~你也可以20个模块一个DLL,50个模块一个DLL阿
      

  14.   

    那样你暂时不要的DLL就FreeLibrary掉,要的时候才LoadLibrary