CSDN博客

img laizx

DLL中使用Form问题

发表于2004/7/4 22:44:00  665人阅读

   

DLL中使用Form问题

在做大型项目的时候,通过一个主程序(EXE)带n个DLL的模式,是一种通用的做法,这样做的优点有:

1、便于项目的模块化,可以把逻辑上相近的模块封装到一起;

2、便于多人同时开发,由于每一个DLL的功能相对独立,可以同时并行开发;

3、便于发布后的维护和升级,在维护时可以单个单个DLL的修改和发布,不会影响其它模块。

当然还有其它好处,我目前就想到这些,大家补充(^_^偷懒!)

既然有这么多好处,我在开发一个项目时,就决定使用该模式,我的开发工具为C++BUILDER,

结果刚一开始就遇到n多问题(我在网上狂找了一阵,结果发现众说纷纭,莫衷一是,不过也给了我很多的启发)。

我开始的做法是在EXE中设置一个MDIForm,然后想在DLL中放置多个MDIChildForm,大概代码如下:

Host:

FormStyle 设置为fsMDIForm

MyShowForm(Application->Handle,asCaption)

 

DLL:

FormStyle设置为fsMDIChild

 

THandle* DllHandle;

MyShowForm(THandle* Handle,AnsiString asCaption)

{

    DllHandle=Application->Handle; //保存DLL的Handle

    Application->Handle=Handle;    //使用EXE的Handle

    if( asCaption == “Form1” )

    {

       Form1=new TForm1(Application->Handle);

    }

    else

   

}

 

结果发现这种用法问题多多,如当DLL获得焦点时,Tab键和Enter键都不起作用了,在退出时也有问题。

我想这都是因为EXE和DLL不在同一地址空间的缘故,EXE和DLL分别维护各自得内存空间。

加上我想把DLL中的Form放到EXE的Form中的某个控件中去,于是采用了如下的方式:

Host:

FormStyle设为fsNormal(设为fsMDIForm也可)

创建调用  MyShowForm(Control,asCaption);

关闭调用  MyDeleteForm(asCaption);

 

DLL:

FormStyle必须设置为fsNormal

MyShowForm(TWinControl* wcParent,AnsiStirng asCaption)

{

    if( asCaption == “Form1” )

    {

       if( Form1 == NULL )

       {

           Form1=new TForm1(NULL);

           Form1->Parent=wcParent;

       }

       Form1->Show();

    }

    else

   

}

MyDeleteForm(AnsiString asCaption)

{

    if( asCaption == “Form1” )

    {

       delete Form1;

       Form1=NULL;

    }

}

当然,还需要自己处理resize事件,以保证子窗体在主窗体最大最小时保持一致。

 

 

0 0

相关博文

我的热门文章

img
取 消
img