怎样使Dll中的Form成为MDIChild?(50分)

  • 主题发起人 主题发起人 softdog
  • 开始时间 开始时间
S

softdog

Unregistered / Unconfirmed
GUEST, unregistred user!
如果只简单的将Dll的form设为MDIChild,在创建是会提示说找不到MDIForm,是不是不能用
Create函数创建?或是还要传递什么参数?
 
在那里创建的一定要先创建mdiform.
 
library 中定义如下输出过程: (注Form1 中定义 var DLLApplication:TApplication)

procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer; { Called whenever DLL entry point is called }

begin
Application:=ParentApplication;

Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
// windows.SetParent(Form1.Handle,ParentForm.Handle);
// Form1.FormStyle:=fsMDIChild;
Form1.Show;
end;

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

exports
ProvaChild;

begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.

交流一下, 请问一下如何在DLL 中放上数据表,而调用在EXE中的TDatabase

 
LittleDot:

Thank you,让我试一下。

要调用Exe中的TDatabase,只要传递一个TDatabase类型的参数就可以了。
 
如果你的dll中的form不能改变,那么你觉只能用另一种方法,就是让dll中的form的parent
指向你自己的父窗口,这样也能有mdi窗口的效果,但是还是有差异的,你自己研究吧。
 
这个参数在DLL 中如何让其它的数据表(如TTQuery )使用。
 
to LittleDot:

TDatabase的我没有具体试过,但我用ADOConnection试过可以:

下面是Dll中的窗体:

procedure ShowDataWnd(AHandle: THandle; AConnection: TADOConnection); stdcall;

.....

procedure ShowDataWnd(AHandle: THandle; AConnection: TADOConnection);
var
Form1: TForm1;
begin
Application.Handle:=AHandle;
Form1:=TForm1.Create(Applicatoin);
with Form1 do
try
ADOQuery1.Connection:=AConnection;
ADOQuery1.Open;
ShowModal;
finally
free;
end;
end;

你在Exe文件中加入一个DataModule,把一个ADOConnection放上去,在调用Dll中窗体的时候
把该ADOConnection作为参数传递过去。

我想TDatabase应该类似,不过具体实现可能有点差别。
 
如果传递ADOConnection的连接字符串的话,DLL可以有更大的灵活性。
 
多人接受答案了。
 
后退
顶部