可以用DLL中的Form作为主MDIForm的MDIChild吗?

wangxiangsjz 2003-03-27 09:31:44
我做了一个MDI类型的程序,其中打开若干MDIChild。现在想把MDIChild做成DLL包,这样当我更新升级时只需要升级相应的DLL。我试验了用DLL做Form,当FormStyle是fsNormal时,可以Show出来。但把它改成fsMDIChild,运行到new 建立窗口时,就出现“没有活动的MDIForm”的提示,无法建立MDIChild类型的Form。
请各位高手名示,是不是在DLL中不能建立MDIChild窗口?如果可以,怎么建立?
谢谢!
...全文
36 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiangsjz 2003-03-29
  • 打赏
  • 举报
回复
我整理好了。
http://expert.csdn.net/Expert/topic/1594/1594285.xml?temp=.1471063
wangxiangsjz 2003-03-29
  • 打赏
  • 举报
回复
我已经试验成功了,等一等,我整理好再贴上来。
wangxiangsjz 2003-03-29
  • 打赏
  • 举报
回复
谢谢各位,我试验一下。
dragonhux 2003-03-29
  • 打赏
  • 举报
回复
我同意Friecin(雪客)的说法,
我曾经做过的,不过有点不同

完全可以!
代码如下:
首先建立一个DLL项目,然后加入一个Form;
在工程的主源代码unit的.cpp中加入:
#include "Form.h"
TApplication *ThisApp=NULL;

定义导出函数:
extern "C" void __declspec(dllexport)ShowForm(TApplication *CallingApp,TForm *MainForm);

void __std ShowForm(TApplication *CallingApp,TForm *MainForm) //改变
{
//MainForm主窗口的指针;
if(!ThisApp)
{
ThisApp=Application;
Application=CallingApp;
Form->Parent=MainForm;
}
TForm=new Form(Application);
Form->Show();
}


int WINAPI DllEntryPoint(..........)
{
if((reason==DLL_PROCESS_DETACH)&&(ThisApp))
Application=ThisApp;
return 1;
}


//-----------------------------------------
//你的exe中调用方法如下:

void __fastcall TParentForm::NewForm(TObject *Sender)
{
//先定义ShowForm 函数指针
//动态调用那个DLL
.....

ShowForm(Application,this); //改变

}

OK了!

你试试,肯定是可行的!
bobbycn 2003-03-29
  • 打赏
  • 举报
回复
给Friecin(雪客)分吧!
我手头上的程序用的方法和他的一样.
记得要:
Action = caFree;
kataboy 2003-03-28
  • 打赏
  • 举报
回复
哦,学习.
嘻嘻...
pp616 2003-03-28
  • 打赏
  • 举报
回复
呵呵。用setparent就好了。
Behard 2003-03-28
  • 打赏
  • 举报
回复
不过在我看来 Friecin(雪客) 的代码有点问题
怎么没有恢复 Dll Application 的代码呢?
Behard 2003-03-28
  • 打赏
  • 举报
回复
这个问题曾经讨论过很多次
Behard 2003-03-28
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1528/1528981.xml?temp=.5969812
http://expert.csdn.net/Expert/topic/1498/1498963.xml?temp=.3961756
kataboy 2003-03-28
  • 打赏
  • 举报
回复
我试了一下,好像不可以啊!
wangxiangsjz 2003-03-27
  • 打赏
  • 举报
回复
我试验一下。
Friecin 2003-03-27
  • 打赏
  • 举报
回复
完全可以!
代码如下:
首先建立一个DLL项目,然后加入一个Form;
在工程的主源代码unit的.cpp中加入:
#include "Form.h"
TApplication *ThisApp=NULL;

定义导出函数:
extern "C" void __declspec(dllexport)ShowForm(TApplication *CallingApp);

void __std ShowForm(TApplication *CallingApp)
{
if(!ThisApp)
{
ThisApp=Application;
Application=CallingApp;
}
TForm=new Form(Application);
Form->Show();
}


int WINAPI DllEntryPoint(..........)
{
if((reason==DLL_PROCESS_DETACH)&&(ThisApp))
Application=ThisApp;
return 1;
}


//-----------------------------------------
//你的exe中调用方法如下:

void __fastcall TParentForm::NewForm(TObject *Sender)
{
//先定义ShowForm 函数指针
//动态调用那个DLL
.....

ShowForm(Application);

}

OK了!
wangxiangsjz 2003-03-27
  • 打赏
  • 举报
回复
可是我要的效果是主程序不动(fsMDIForm),不同类型的模块用几个DLL实现,画面镶嵌在主程序中。主程序的Form我设置成fsMDIForm,在主程序中调用不同的DLL。可是DLL中的fsMDIChild不能在主程序的fsMDIForm中显示。
kataboy 2003-03-27
  • 打赏
  • 举报
回复
我的意思是说,你做两个窗体.一个是fsMDIForm,一个是fsMDIChild.然后.....
wangxiangsjz 2003-03-27
  • 打赏
  • 举报
回复
“你可以将fsMDIForm这个Hide就行了”是什么意思?
kataboy 2003-03-27
  • 打赏
  • 举报
回复
是不可以的,只有存在fsMDIForm这个窗口时,才有fsMDIChild.你要将DLL中的窗口变成fsMDIChild的话,就必须有fsMDIForm这个,你可以将fsMDIForm这个Hide就行了.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧