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做在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.