如何在DLL中创建MDI子窗体

daniel007 2003-05-16 04:10:37
我试了两种方法,
一:传入TApplication对象,然后赋值给DLL,然后利用该TApplication对象创建子窗体
二:传入Mainform的句柄,利用指针强制给DLL中的Application对象的MainForm成员赋值为传入的MainForm句柄,然后利用DLl中的Application对象创建子窗体

两个方法都能创建子窗体,不过都存在一些细节上的问题,譬如不响应Tab建,最大化时边框凹陷,如果在窗体中只放置了一个DBGrid,另外都是一些Panel,Button等无焦点控件,那么一旦焦点切换到主窗体,再次点击该Grid,Grid将无法响应,只有切屏或者切换MDI子窗口,该DBGrid才能再次得到响应,反正问题多多,这些问题我如果用一般的MDI窗口是不会有的,不知道我创建DLL中的MDI窗口方法是否有错误,请各位大侠指点,谢谢!
...全文
99 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
daniel007 2003-05-27
  • 打赏
  • 举报
回复
我的EMail:daniel790719@etang.com,大家互相交流!
daniel007 2003-05-27
  • 打赏
  • 举报
回复
多谢 murphy,MDIChildCount的问题得到解决了,不知各位还有什么经验没有,大家共享嘛!
reallike 2003-05-25
  • 打赏
  • 举报
回复
不是我小气,有关商业问题。

我不随便发的。请原谅。
reallike 2003-05-24
  • 打赏
  • 举报
回复
我可是花钱买的啊。

交流一下可以的。
jxc163 2003-05-24
  • 打赏
  • 举报
回复
可以给我一个吗?我的E—mail是:jxc163@21cn.com
谢谢
reallike 2003-05-23
  • 打赏
  • 举报
回复
搂主!你有福了!

我刚刚接到一个ERP代码,里面的server就是用dll装载Mdi窗体的。

如果需要请和我联系。我愿意帮助你。并且给你个实际使用的方案。

real-like@163.com
huahanbing9 2003-05-23
  • 打赏
  • 举报
回复
UP一下
daniel007 2003-05-19
  • 打赏
  • 举报
回复
to TScreen:传入TScreen有何作用?具体如何创建呢?
to DelphiBoy2003: 传入父窗体的Handle来创建我好像也试过了,不行,不知你具体是如何实现的?
chinazjb 2003-05-19
  • 打赏
  • 举报
回复
具体实现办法!
代码呢?
murphy 2003-05-19
  • 打赏
  • 举报
回复
TScreen有何作用?
是这样子的,对于普通的调用Dll中Form是一般只要传入Application即可!
然而在MDI调用时,如果你只传入Application的话你会发现,主程序的MDIChild的Count没有计数,这就是TScreen的原因,当你传入TScreen时这个问题就解决了。
当然,还有些其他的问题我这儿也没解决!——譬如说:(&S)这种快捷键的响应、子窗体主菜单的融合等等
murphy 2003-05-19
  • 打赏
  • 举报
回复
主程序:
......
//统一的接口
TRunApp = procedure(AApplication: TApplication; AScreen: TScreen); stdcall;
......
procedure TFrmMain.RunMyDlls(MyDlls: string);
var
RunApp: TRunApp;
hMod: THandle;
begin
hMod := LoadLibrary(PChar(MyDlls));//MyDlls是Dll文件
@RunApp := GetProcAddress(hMod , 'RunApp');
try
if @RunApp <> nil then
begin
RunApp(Application, Screen);
end;
except
Showmessage('RunApp Error!');
end;
end;
......

Dll中:
library testDlls001;

uses
SysUtils,
Classes,
Windows,
Forms,
Controls,
Unt_Child1 in 'Unt_Child1.pas' {FrmChild001};

{$R *.RES}

var
DLLApp: TApplication;
DLLScr: TScreen;

procedure DLLEntryPoint(dwReason: DWORD);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
DLLScr := Screen;
DLLApp := Application;
end;
DLL_PROCESS_DETACH:
begin
Screen := DllScr;
Application := DllApp;
end;
end;
end;

//////////////////////////////////////////
procedure RunApp(AApplication: TApplication; AScreen: TScreen); stdcall;
begin
Screen := AScreen;
Application := AApplication;
FrmChild001 := TFrmChild001.Create(Application);
end;

//////////////////////////////////////////////////////////////////////
exports
RunApp;

//////////////////////////////////////////////////////////////
begin
DLLProc := @DLLEntryPoint; //Assign the address of DLLEntryPoint to DLLProc
DLLEntryPoint(DLL_PROCESS_ATTACH); //Indicate that the DLL is attaching to the process
end.
888888888888 2003-05-18
  • 打赏
  • 举报
回复
关注
DelphiBoy2003 2003-05-16
  • 打赏
  • 举报
回复
何必如此,给MDI子窗体传入父窗体的Handle就可以了
tonylk 2003-05-16
  • 打赏
  • 举报
回复
使用runtime bpl
murphy 2003-05-16
  • 打赏
  • 举报
回复
我做的方法是传递主应用程序的TApplication和TScreen给MDIDLL
google1106 2003-05-16
  • 打赏
  • 举报
回复
up
seawavefj 2003-05-16
  • 打赏
  • 举报
回复
帮你up一下

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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