DLL中的子窗体问题?(200分)

  • 主题发起人 socool_100
  • 开始时间
S

socool_100

Unregistered / Unconfirmed
GUEST, unregistred user!
1。主程序做成MDI窗体,所有其他子模块都以DLL的形式,子模块的窗体都是MDI子窗体,
都放在DLL里,子窗体中有DBGrid,还有很多东西,如何用菜单或其他控制这个子窗体,
其中菜的是否有效跟子窗体有关,如:菜单中有保存,就要看数据是否不是在浏览状
态?
2。按照论坛答案:
Dll中的函数如下:
procedure PChild(ParentApplication: TApplication);
begin
Application := ParentApplication;
Form1 := TForm1.Create(Application);
Form1.Show;
end;
//
为何到主窗体中用
ShowMessage(inttostr(Application.MainForm.MDIChildCount));//在主调程序中
得到都为0;
而在Form1.Show;之前用
ShowMessage(inttostr(Application.MainForm.MDIChildCount));//在DLL中
就会得到正确答案?
3.最好有个例程发到Email:socool_100@163.com
如果分数不够可再家只要实用(可以实现的好)//我Search了整个论坛了都没有一个
//很好的办法,CSDN中也一样
 
给每个子窗体起唯一的名字,
在主窗体中用api-〉findwindow判断子窗体是否存在,
在主窗体中用自定义消息控制子窗体!
虽然麻烦一点,但可行
 
To:tjj给个例子具体操作,可行立刻给分,我现在急着用。
 
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。

函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);

参数:

IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。

IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。

返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
以上为查找窗体的api;返回窗体的句柄
在主窗体和子窗体中定义消息
const WM_USER1=WM_USER+400;常量值一定要大于400例如
const WM_USER2=WM_USER+401;
在子窗体中定义消息响应过程
procedure MW_USER1(var msg:Tmessage);message WM_USER1;
begin
你的程序。。。。
end;
在主窗体的代码中用sendmessage向子窗体发送消息
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

参数:

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息指定信息。

IParam:指定附加的消息指定信息

 
To:tjj
如下:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,
则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口
、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
子窗口得不到消息那怎么行啊,我是想把各个模块分到不同的DLL中,然后由一个主窗体
控制模块中的子窗体的啊,如何实现的呢?(问题是连接成一个EXE文件可能太大)
 
别用HWND_BROADCAST
 
To:tjj
你给我一个例子发到Email:socool_100@163.com好吗?我现在按照你说都不知如何
处理,先谢谢你了。
 
不用谢
晚上再发吧我现在上班,怕别老板看到,
而且现成的例子我手头也没有。不好意思
你可以参考一下别的关于消息处理的资料
 
好的谢谢你了!
 
帮你 up 一下
请高手们关注一下
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=534762
http://www.delphibbs.com/delphibbs/dispq.asp?lid=559087
 
[:D][:D][:D][:D][:D]
拿分!
 
To:zzhhb
问前我都看过了,我不是说都不符合要求吗?在CSDN中有个朋友回答了,不过还是不
符合我的要求,我是说可以有按扭之类在主窗体中操作子窗体的事件,不如:子窗体中有
个DBGrid可以在其中选一条记录,然后在主窗体的控件按扭(删除按扭)删除它,等等之类,
就象平常,不在DLL中的那样,这些问题还可以去哪里问,我都不知道了,不过我觉得应该
可以实现的吧?
 
To:花园风味
确实你的例子都差不多了,等等其他人的回答!有Access库的多用户在局网操作的例子
吗?发一个给我,加多200分,怎么样?
 
Access库的多用户在局网操作??
没做过!?帮你看看先!
[:)][:D][8D]
 
Access是文件型数据库,你在局域网里为什么不用SQL2k或Oracal之类的关系数据库呢?
装个SQL2k很容易呀!?
 
to socool_100:
你除了要传ParentApplication外,
你还需要传ParentScreen参数,
这样从不会出现你说的问题!
 
To:onlyonekgx
传ParentScreen参数,传过去好象无法利用,如何利用ParenteScreen能解释一下吗?
 
顶部