请教:可以把MDI ChildForm做在DLLs中吗?(200分)

  • 主题发起人 主题发起人 Micro Whaight
  • 开始时间 开始时间
M

Micro Whaight

Unregistered / Unconfirmed
GUEST, unregistred user!
初学Delphi,乱七八糟自己满试.
前几天看到一个怎么把Form做在DLLs中的Tips,试了一下,可行.不过产生的Form是普通窗口(FormStyle为fsNormal).于是想,能不能把fsMDIChild也做在DLLs中,可是做起来总是不对.
我的想法是这样的,在DLLs中做一个普通的Form,然后导出一个函数:ShowFormInDLLs,作用是建立窗口,并返回这个窗口;然后在主程序中调用,把窗口的Parent属性改为MainForm.不知道这个想法对不对?方法呢?
我试过,按这个方式,如果把DLL中的Form设为fsMDIChild,调用时说不存在MDIForm;如果把主程序中的窗口作为参数传过去,也出错.还把VCL目录下的Forms单元拿给我看!是在一个汇编程序位置...根本就是初学...Delphi的帮助中我只找到把Dialog放在DLL中的一个说明building dialog box into dll.我是不是有问题...哪里没学清楚?我用的是Delphi 3.

另:第一次发言,不知行情如何,也不知道如何操作.有关分数分配问题,可以请版主处理吗?

程序如下:

{DLL部分}
Library DllPrj;

uses
FormInDLL in 'FormInDLL.pas' {FormInDLLs};

Exports
ShowFormInDLLs
{$R *.RES}

begin
end.

unit FormInDLL;

interface

uses
...
type
TFormInDLLs = class(TForm)
BtnClose: TButton;
Label1: TLabel;
procedure BtnCloseClick(Sender: TObject);
procedure FormClose(Sender: TObject
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormInDLLs: TFormInDLLs;

function ShowFormInDLLs:TForm;export
{这句是不是该写在这?有错吗?}

implementation

{$R *.DFM}
function ShowFormInDLLs:TForm;export;
begin
FormInDLLs:=TFormInDLLs.Create(Application)
{这句不知有没有问题?}
ShowFormInDLLs:=FormInDLLs;
end;

procedure TFormInDLLs.BtnCloseClick(Sender: TObject);
begin
Close;
end;

procedure TFormInDLLs.FormClose(Sender: TObject
var Action: TCloseAction);
begin
FormInDLLs.Free;
end;

end.

{主程序部分}

unit CallingForm;

interface

uses
...
type
TFormMain = class(TForm)
BtnOpen: TButton;
procedure BtnOpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormMain: TFormMain;

implementation

uses FormNormal;

{$R *.DFM}
function ShowForm:TForm;stdcall;external 'Dllprj.dll' name 'ShowFormInDLLs';

procedure TFormMain.BtnOpenClick(Sender: TObject);
var
MDIForm:TForm;
begin
MDIForm:=ShowForm
{偷懒没有做重复生成检查,反正自己只按一次}
// MDIForm.Parent:=FormMain
{这句可以执行,不过看不到窗口内容了!结果无法用子窗口上的Close按钮;退出程序时就Access Violation}
end;

end.
 
你主程序中的Form的FormStyle可能没有设为fsMDIForm,所以出现不存在MDI
窗口的信息。
 
糟糕,忘记分行了.对不起,第一次用.

我的想法是这样的,在DLLs中做一个普通的Form,然后导出一个函数
:ShowFormInDLLs,作用是建立窗口,并返回这个窗口;然后在主程序中
调用,把窗口的Parent属性改为MainForm.不知道这个想法对不对?方法
呢?
我试过,按这个方式,如果把DLL中的Form设为fsMDIChild,调用时说不
存在MDIForm;如果把主程序中的窗口作为参数传过去,也出错.还把VCL
目录下的Forms单元拿给我看!是在一个汇编程序位置...根本就是初学
...Delphi的帮助中我只找到把Dialog放在DLL中的一个说明building
dialog box into dll.我是不是有问题...哪里没学清楚?我用的是Delphi 3.

主程序中的Form已经设为fsMDIForm了.
 
哈哈哈,同志们!到这来看看!!!

深度历险-->全部源程序:

http://vcl.vclxx.com/DELPHI/D32SAMPL/MDIDLL.ZIP

不过,昨晚下来后,还没有仔细看,好象有涉及到回调函数,
这方面我还没有学过,还有好些东西不懂,过几天再上来看看。
 
接受答案了.
 
后退
顶部