就是说能不能这样实现:
    主窗体程序调用了一个DLL,而DLL中的窗体(或者类)继承自主窗体(或主体中的某个类),能实现这样的DLL吗?
   大家来探讨一下,如果这样能实现的话能够给小弟一些提示如何实现?
   我主要是想把系统设计成组态的软件,即主体提供一个框架,由其他相关人实现各个自模块的DLL,而DLL又是继承自主体的,所以能够使用主体提供的一些公共功能,并且主体要想使用子模块的功能的话,只需要override主体的一些虚方法即可。
   大家一起来探讨一下!请高手指点一二!

解决方案 »

  1.   

    应该不能~
    除非dell里面也写一个主窗体类dell是单独动态加载的
      

  2.   

    支持楼上,每份dll里应该有一份主体窗体的类
      

  3.   

    标准动态库DLL的没试过,应当是不行,跟Delphi的类地址结构有关。
    实现过Delphi动态库BPL的,有一点点复杂:
    1. 自TForm继承一个自己框架Form的基类,比如TMyBaseForm,把公用的属性和方法都加进去。
    2. 把TMyBaseForm放入一个bpl中,将它编译成独立包(package),不包含其他包。
    3. 所有其他模块窗体都继承自TMyBaseForm,每个窗体及其附属单元都封进一个包(package),在窗体单元的initialization段中加入RegisterClass([FormClassName]),并独立编译,也不包含其他包。
    4. 在主框架中维护一个模块类名与BPL文件的映射表,也可以从外部文件装入。
    5. 调用模块前,先用LoadPackage装入BPL,此时类信息被装入内存,可以用CreateForm将窗口类实例化,为了框架调用方便,通常实例化后都转换为基类使用。
    6. 卸载包之前记得一定要先Free掉模块,然后再用UnloadPackage卸载掉模块,否则会引起不可预期的异常。这是很早以前的一个实现,确实可行,但很久没写Delphi,印象不是很深了,记得有几点需要注意:
    1. 基类TMyBaseForm包和所有继承的模块包在编译时一定需要把Build with Runtime Packages选中,并把所有其他Runtime包都去掉。这样才能使所有框架和模块使用同一个全局类列表的内存空间。
    2. 每个模块单元的Initialization段会在Package被装入的时候自动执行,在这里要加入RegisterClass,将模块的窗口类注册到全局类列表中,提供给框架程序使用。
    3. Package用LoadPackage装入后,必须保留返回的句柄,卸载的时候要用到。
    4. 模块实例化之前确保相应的Package被装入,并在UnloadPackage前将所有该模块中的窗体实例Free掉。以上是凭印象写的,在Delphi5和6中都实现了,后继版本除非包结构和VCL类结构有重大调整,否则应当也能用。
    大家可以试试看,有什么问题可以交流,毕竟时间长了,有些细节记不清了。
      

  4.   

    感谢rodgerkong(Rodger)提供的思路。大家可以学习下。