我试了很多方法,都有错误!!
解决方案 »
- 关于rave:我用如下代码在page中手工生成了一个text,请问我怎么再用程序找到它???
- 用Delphi 在SQL Server2000中存取Word文件的问题?
- 如何给菜单加动态提示?
- ADOdataSet1.CommandText中SQL语句太长
- 请教这条SQL语句应该如何写啊??
- 关于TreeView中结点的唯一性问题!
- 高分!!! Ado执行sql语句的参数设置问题.
- 一个MDI程序中子窗口(MDIChild)显示的问题?请各路英雄帮忙!
- 老鸭明急救:为何不能打开.jpg图片???
- 棘手的问题
- 能不能在Winform取得机器硬件特征传给Webbrowser,再提交到指定的web服务器上?
- 昨天去一个软件公司面试题目, 虽然不难可是题量还是比较大. 看你们能做多少, 不能上机调试都是笔试的.
所以就把主程序做成MDI
窗体,所有其他子模块都以DLL的形式,子模块的窗体都是MDI子窗体,
都放在DLL里,
但是调用这些DLL中的子窗体的时候,总是提示“没有
当前活动的MDI窗体”!怎么解决呀?
将Application和MDIFrame作为参数传递给DLL。
DLL中的Application.Handle默认是0。多谢了! :) 我用下面的方法试了一下可以:function _Close:HRESULT;stdcall;
//系统关闭之前,需要调用本方法
begin
Application := TmpOldApp;
//TmpOldApp是全局变量,用于存放DLL的Application
//参见_Open
end;function _Open(Aapp :TApplication) :TDModule;stdcall;
//创建一个模块,并返回它的指针
//参数Aapp :主程序的Application
var
testM :TDMTempModule;
begin
if Application.Handle = 0 then
tmpOldApp := Application;
//记录DLL的原始Application Application := Aapp;
//将DLL的Application赋为主程序的Application //Application.CreateForm(TFrmtemp, frmtemp);
//用这句不行。 ? frmtemp := TFrmtemp.CreateParented(Aapp.MainForm.Handle);
//创建在DLL中定义的MDI子窗体 TFrmTemp 的一个实例
//测试代码
end;另外在Help里找到这句话:
Note: When writing a DLL that uses VCL forms, assign the window handle
of the host EXE's main window to the DLL's Application.Handle
property. This makes the DLL's form part of the host application.
Never assign to the Handle property in an EXE.
[email protected]
2 在CreateForm后写以下两句: function ShowForm(mainForm:TForm):integer;stdcall
var
Form1: TForm1;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起来,也无须释放,只不过是替换一下
ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm。MainForm是特殊的WINDOW,它专门管理Application中的Forms资源.
//为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性
Form1:=TForm1.Create(mainForm);//用参数建立
end;
备注:参数是主调程序的Application.MainForm
发不过去,你还是给我发信吧
[email protected]
library Project2;uses
SysUtils,
Forms,
Classes,
Unit2 in 'Unit2.pas' {FormOne};{$R *.res}
var
OldApp:TApplication;
procedure InitChildForm(tmpApp:TApplication);stdcall;
begin
OldApp:=Application;
Application:=tmpApp;
end;
procedure LoadForm1;stdcall
begin
TFormOne.Create(Application.MainForm);
end;
procedure FinalChildForm;stdcall;
begin
Application:=OldApp;
end;
exports
InitChildForm,
FinalChildForm,
LoadForm1;
begin
end.
//主程序如下应用
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
procedure InitChildForm(tmpApp:TApplication);stdcall;external 'Project2.dll';
procedure FinalChildForm;stdcall;external 'Project2.dll';
procedure LoadForm1;stdcall;external 'Project2.dll';procedure TForm1.FormCreate(Sender: TObject);
begin
InitChildForm(Application);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
LoadForm1;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FinalChildForm;
end;end.