关于MDI和DLL(FORM_CHILD)

bw1996 2002-04-09 07:54:08
我想用MDI调用一个DLL的FORM,使FORM成为MDI的CHILDFORM,如何实现。
...全文
82 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liusp 2002-05-15
  • 打赏
  • 举报
回复
DELPHI---> Project菜单--->Options菜单---->

弹出的对话框选“Packages”页,有Build with RunTime Package复选框,

选择该复选框,在下方Edit框内只保留Vcl50,其他去掉,即实行带包编译。
bw1996 2002-05-04
  • 打赏
  • 举报
回复
这么久了,还没有回信
bw1996 2002-04-23
  • 打赏
  • 举报
回复
""关键是无论DLL还是EXE都要带运行时间包VCL50.bpl编译""
怎么做才叫带运行时间包vcl50.bpl编译
Liusp 2002-04-13
  • 打赏
  • 举报
回复
//主程序:
type
TCallModule = procedure();stdcall;

var
FormMain: TFormMain;
LibHandle: HModule;
procedure LoadModule(AModuleName: String);

implementation

{$R *.DFM}


procedure LoadModule(AModuleName: String);
var
CallModule: TCallModule;
begin
LibHandle := LoadLibrary(PChar(AModuleName));
if LibHandle = 0 then Exit;
@CallModule := GetProcAddress(LibHandle,'CallModule');
if @CallModule <> nil then
CallModule();
end;

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
iCount: Integer;
begin
if MessageDLG('是否退出?',mtConfirmation,[mbYes,mbNO],0) = mrYes then
begin
for iCount := 0 to MDIChildCount - 1 do
MDIChildren[iCount].Close;
CanClose := True;
if not (LibHandle = 0) then
FreeLibrary(LibHandle);
end else
CanClose := False;
end;

关键是无论DLL还是EXE都要带运行时间包VCL50.bpl编译
Liusp 2002-04-13
  • 打赏
  • 举报
回复
//DLL
library Func;

uses
ShareMem,
SysUtils,
Classes,
Forms,
Windows,
MConnect,
Child2 in 'Child2.pas' {FormChild2};

{$R *.RES}

procedure CallModule();stdcall;export;
begin
if not Assigned(FormChild2) then
FormChild2 := TFormChild2.Create(Application);
FormChild2.Show;
end;

exports
CallModule;

begin
end;

//MDIChild单元:

procedure TFormChild2.N9Click(Sender: TObject);
begin
Close;
end;

procedure TFormChild2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TFormChild2.FormDestroy(Sender: TObject);
begin
FormChild2 := nil;
end;
make11111 2002-04-11
  • 打赏
  • 举报
回复
对,说的很对!!!
qiubolecn 2002-04-11
  • 打赏
  • 举报
回复
传递 Application是必须的, mainform可以通过 application得到;

在delphi的 mdi + dll里,我们经常要通过自定义消息来做一些标准消息可以做的事,比如,你的2,3,4.

通过自定义消息来通知主窗体,来发送子窗体的handle.
qiubolecn 2002-04-11
  • 打赏
  • 举报
回复
传递Application 是必须的,其它的 parentform可是通过application.mainform来得到;
在这方面,delphi本身是有不少问题,但,我们经常可以通过 sendmessage来实现解决问题的途径。

我们可以用消息来传递各个 dll窗体的 handle, 可以用自定义消息在主窗体里面来关闭dll里的窗体;和进行其它的操作
bw1996 2002-04-11
  • 打赏
  • 举报
回复
1,请问:为什么要定义MyParentForm,ParentApplication作用是什么,
释放的原理是什么?
2,我要实现父窗体,用代码的方法关闭dll的mdi,如何实现???
3,如何判断,dll的窗体已经打开
4,如何使已经打开的dll窗体显示在前面
VSaber 2002-04-11
  • 打赏
  • 举报
回复
相关讨论很多,不过除了“带包编译”是最好的办法,还真没别的好办法了。
传application之类的方法都由很大的缺陷,如果你的工程涉及到复杂的处理,你就会产生一大堆你想不到的问题了。
以前做过,吃了不少亏了。呵呵
bw1996 2002-04-11
  • 打赏
  • 举报
回复
有没有详细一点例子
Liusp 2002-04-11
  • 打赏
  • 举报
回复
还是带包VCL50。BPL编译所有的EXE和DLL吧,这样无须再传递Applicaiton,因为DELPHI的包能使调用它的模块(EXE和DLL)共用一个全局Application和Screen,但是DLL句柄应设置为全局变量,在关闭主程序时再释放DLL,之前最好用循环关闭所有的子窗体.

1.应为DLL和EXE都有各自的APPLICATION,所以传递APPLICATION到DLL,使两者共用一个Application,传递MyParentForm 可能是解决这样的问题:因为DLL中的
MDICHILD不能自动增加到MDI主窗体的MDICHILDREN数组中,所以想通过传递MyParenForm来解决,但是事实上只有传递SCREEN到DLL中,并赋给DLL的SCREEN就可自行解决

2.释放的原理: 第一次LoadLibrary把DLL计数设为1,并映射DLL到EXE的进程空间,以后再LoadLibrary,如果DLL没有释放则计数递增1;FreeLibrary每调用一次就使DLL计数递减1,如果DLL计数为0,则释放DLL,如果其中的资源例如FORM没有释放就会出错!
我们通常是LoadLibrary后调用FORM就马上FreeLibrary,这时DLL计数为0(LoadLibrary初次为1,而FreeLibrary为减1,计数自然为0 ),DLL自动释放,而FORM作为其中的资源却没有释放自然会出错!

snake_eye 2002-04-10
  • 打赏
  • 举报
回复
关注!
Liusp 2002-04-10
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/628/628608.xml?temp=.1550409
bw1996 2002-04-09
  • 打赏
  • 举报
回复
代码如下:
library mdidll;
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
mdi_Unit in 'mdi_Unit.pas' {Form1};

procedure LoadChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer;

begin
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
Form1.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

{$R *.res}
exports
LoadChild;
begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.
1,请问:为什么要定义MyParentForm,ParentApplication作用是什么,
释放的原理是什么?
2,我要实现父窗体,用代码的方法关闭dll的mdi,如何实现???
3,如何判断,dll的窗体已经打开
4,如何使已经打开的dll窗体显示在前面
Liusp 2002-04-09
  • 打赏
  • 举报
回复
明天再回答你
qiubolecn 2002-04-09
  • 打赏
  • 举报
回复
传递一个 application,其它的和正常的mdi类似;
yousoft2013 2002-04-09
  • 打赏
  • 举报
回复
使用DLL文件中封装的窗口

http://www.csdn.net/Develop/read_article.asp?id=10919

自已看吧·
内容概要:本文档围绕基于MATLAB/Simulink平台的直流无刷电机速度控制系统展开,重点介绍利用Simulink搭建电机控制模型,实现直流无刷电机的速度开环控制仿真。文档详细阐述了系统建模、关键模块设计与参数配置过程,帮助读者深入理解电机控制的基本原理与仿真流程。同时,文档还列举了涵盖电力电子、新能源系统、路径规划、智能优化算法等多个领域的丰富仿真案例,充分展示了MATLAB/Simulink在多学科交叉科研仿真中的强大功能与广泛应用前景。; 适合人群:具备一定自动控制理论基础和MATLAB/Simulink使用经验的高校学生、科研人员及工程技术人员,特别适用于从事电机控制、电力电子、新能源系统、智能优化等方向的研究者。; 使用场景及目标:①学习直流无刷电机的工作原理及其速度开环控制方法;②掌握使用Simulink进行电机控制系统建模与仿真的核心技能;③为后续开展更高级的闭环控制、矢量控制或结合智能优化算法的电机控制研究奠定坚实的技术基础并提供实用的参考实例。; 阅读建议:建议读者结合文档提供的仿真模型与代码资源,亲自动手实践Simulink建模全过程,逐步理解各功能模块的作用与参数整定方法,并充分利用网盘中的配套资料进行复现与深入学习,从而有效提升科研仿真与工程实践能力。
内容概要:本文系统阐述了基于二维离散时间卡尔曼滤波器在二维平面内对运动目标进行轨迹跟踪的技术方案,重点分析了过程噪声与测量噪声在不同强度下对滤波性能的影响。通过建立目标状态空间模型,设计完整的预测与更新算法流程,实现了对受噪声干扰的观测数据进行有效估计与轨迹平滑,充分展现了卡尔曼滤波在动态系统状态估计中的鲁棒性与实用性,并提供了完整的Matlab代码实现,便于理论验证与参数调试。; 适合人群:具备信号处理、控制理论或状态估计基础知识的研究生、科研人员,以及从事雷达系统、导航定位、机器人感知、自动驾驶等领域的工程技术人员。; 使用场景及目标:① 掌握卡尔曼滤波的核心原理及其在目标跟踪中的建模与实现方法;② 分析不同噪声协方差参数对滤波收敛性、估计精度和平滑效果的影响;③ 为深入研究非线性滤波算法(如EKF、UKF)或多传感器融合技术奠定理论与实践基础。; 阅读建议:建议读者结合所提供的Matlab代码进行仿真实验,通过调整过程噪声和观测噪声的强度,观察滤波轨迹与真实轨迹的偏差变化,深入理解协方差矩阵的演化机制,并尝试将该方法拓展至三维空间或多目标跟踪场景,以增强实际应用能力。

5,943

社区成员

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

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