给我一个DLL子窗体的例子(100分)

  • 主题发起人 主题发起人 fbyang
  • 开始时间 开始时间
F

fbyang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用做一个MDIFORM程序.主窗体在EXE中,DLL中设计子窗体(设计时可以是NORMAL),
如何写调用函数,和子窗体CREATE函数,望高手给我DEMO
 
大家怎么没有人回答呀,嫌分数少,我可以再加!
 
我马上写一个给你等我一会儿
 
//对于比如要传递字符串时必须引用sharemem单元除非用pchar类型
//对于非模式窗口以下的方法不适用,因为您您无法知道用户什么时候关闭窗口,
//可能用户随时都会关闭窗口,必须用另一种方式,我写完了再贴上来
library Project1;
uses
SysUtils,
Classes,Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
procedure CrateAppWnd(AppWnd:Longint);stdcall;
var
Form1:TForm1;
begin
Application.Handle:=AppWnd;
Form1:=TForm1.Create(Application);
try
Form1.ShowModal;
finally
Form1.Free;
Form1:=nil;
end;
end;

exports CrateAppWnd;
{------------------}
begin
end.

//调用程序
unit LoadUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
procedure CrateAppWnd(AppWnd:Longint);stdcall;external 'project1.dll';
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
CrateAppWnd(Application.Handle);
end;

end.
 
TO PCEXPLORER
哥们,你给我的方法是SHOWMODAL,如果是MDICHILD,怎么办?先谢谢!
 
我回去写好了贴上来
 
设计时是fsNormal,运行时要fsMDIChild吗?创建窗体后你需要设置它的属性的。
对于调用动态库中的窗体做MDIChild,实际上你可以用动态装载,如
var
h:Thandle;
procedure LoadLib;
begin
h:=Loadlibrary(LibraryNAme);
end;

procedure CreateMDIChildFromDLL(MDIClassName:String);
begin
if h=0 then
LoadLib;
if h=0 then
exit;
for i:=0 to MainFmt.childcount-1do
if child.classname=MDIClassName then
Child.Bringtofront;
@createFmProc:=getprocessAddr(YourDllName);
CreateFmProc(MDIClassName);
end;

在动态库中写CreateFmProc过程,过程要能够通过一个类名创建类的实例。
在主程序的OnDestroy中,判断H<>0 then
freelibrary(h);
 
unit DLLFrm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Grids, Calendar;
type
TDLLForm = class(TForm)
calDllCalendar: TCalendar;
end;

{ Declare the export function }
function ShowCalendar(AHandle: THandle;
ACaption: String): Longint;
stdCall;
procedure CloseCalendar(AFormRef: Longint);
stdcall;
implementation
{$R *.DFM}
function ShowCalendar(AHandle: THandle;
ACaption: String): Longint;
var
DLLForm: TDllForm;
begin
// Copy application handle to DLL's TApplication object
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
Result := Longint(DLLForm);
DLLForm.Caption := ACaption;
DLLForm.Show;
end;

procedure CloseCalendar(AFormRef: Longint);
begin
if AFormRef > 0 then
TDLLForm(AFormRef).Free;
end;

end.


unit MainFfm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TMainForm = class(TForm)
btnShowCalendar: TButton;
btnCloseCalendar: TButton;
procedure btnShowCalendarClick(Sender: TObject);
procedure btnCloseCalendarClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FFormRef: TForm;
end;

var
MainForm: TMainForm;
function ShowCalendar(AHandle: THandle;
ACaption: String): Longint;
StdCall;
external 'CALENDARMLLIB.DLL';
procedure CloseCalendar(AFormRef: Longint);
stdcall;
external 'CALENDARMLLIB.DLL';
implementation
{$R *.DFM}
procedure TMainForm.btnShowCalendarClick(Sender: TObject);
begin
if not Assigned(FFormRef) then
FFormRef := TForm(ShowCalendar(Application.Handle, Caption))
else
FFormRef.Show;
end;

procedure TMainForm.btnCloseCalendarClick(Sender: TObject);
begin
if Assigned(FFormRef) then
begin
CloseCalendar(Longint(FFormRef));
FFormRef := nil;
end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
FFormRef := nil;
// Initialize the FFormRef field to nil.
end;

end.
 
to Djdsz,pcexplorer
你们提供的mdichild例子我都没有试清楚,请告诉我应该的设置。可否给我发一个例子!
谢谢,谢谢。我的邮箱是fbyang@fm365.com
 
to djdsz,pcexplorer
小弟也在写类似的程序,能发一个你的例子给我吗? thanks
lydargon@sina.com
 
pcexplorer 大仙,我看了你的mdichild的例子,但是没有看出能够创建mdichild form
而且试了也不行,能不能也给我发一个例子,多谢

goodshilei◎263.net
 
pcexplorer 大仙
你在时间:2001-5-17 17:05:55的回复中的DLL单元里的Application.handle
中的Application在我的delphi5中系统提示
[Error] about.dpr(12): Undeclared identifier: 'Application'
请问为什么
 
参见540766,那里有详细的讨论
 
To gst
我把上面的试了一下没有问题呀!!!
看看是不是你其它地方错了
或者引用一下Forms单元
 
normal form 也行呀,其实只要
ChildForm.FormStyle:=fsMdiChild;
ChildForm.WindowStyle:=Maxized(记不清了)
就是一个子窗体了。
关闭里再:
ChildForm.FormStyle:=fsNormal;
ChildForm.Hide;
 
多人接受答案了。
 
后退
顶部