我把MDI子窗体做成DLL后。子窗体中,不能用Tab切换控件焦点.也不能用Button上设置的快捷键了。
我的代码如下:DLL中这么写的function ShowChild(App :TApplication ; pFormFreeCallBack : Pointer) : TFormChild;stdcall; export;
Begin
Application:=App;
Form_Record:=TFormChild.Create(Application);
result:=FormChild;
End;
///**Application 保存另一个单独的单元中procedure SetOldApplication;stdcall;export;
Begin
Application:=OldApp;
end;exports
ShowChild,SetOldApplication;
begin
OldApp:=Application;
end.主窗体中这么写的:
TF_ShowChild=Function(App :TApplication ;pFreeCallBack : Pointer):TForm ;stdcall; var
ShowChild : TF_ShowChild;
Form : TForm;
testDLL :DWODRD;
begin
testDll:=LoadLibrary('Project3.dll');
showChild:=GetProcAddress(testDll,'ShowChild');
Form:=ShowChild(application,nil);
fORM.Show;
end;谁能帮我解决,我可以发例程,有重谢哦。
我的代码如下:DLL中这么写的function ShowChild(App :TApplication ; pFormFreeCallBack : Pointer) : TFormChild;stdcall; export;
Begin
Application:=App;
Form_Record:=TFormChild.Create(Application);
result:=FormChild;
End;
///**Application 保存另一个单独的单元中procedure SetOldApplication;stdcall;export;
Begin
Application:=OldApp;
end;exports
ShowChild,SetOldApplication;
begin
OldApp:=Application;
end.主窗体中这么写的:
TF_ShowChild=Function(App :TApplication ;pFreeCallBack : Pointer):TForm ;stdcall; var
ShowChild : TF_ShowChild;
Form : TForm;
testDLL :DWODRD;
begin
testDll:=LoadLibrary('Project3.dll');
showChild:=GetProcAddress(testDll,'ShowChild');
Form:=ShowChild(application,nil);
fORM.Show;
end;谁能帮我解决,我可以发例程,有重谢哦。
ahyf(冷剑白狐) :
你写的应该没问题啊!主窗体改为:
TF_ShowChild=Function(App :TApplication ;pFreeCallBack : Pointer):TForm ;stdcall; var
ShowChild : TF_ShowChild;
Form : TForm;
testDLL :DWODRD;
begin
testDll:=LoadLibrary('Project3.dll');
showChild:=GetProcAddress(testDll,'ShowChild');
Form:=ShowChild(application,nil);
fORM.Show;//--改为fORM.ShowModal
end;
我用的dll中封装了一个主窗体和子窗体,子窗体(frmstytle 设置为fsMDIChild)上有一个tabpage控件,有一个系统默认的激活页面,系统运行时报错:Error reading PageControl1:TTabIndex:can't create form.No MID forms are current active
该怎么解决?
感谢你的回答,但是我的子窗体的FormStyle=fsMDIChild 不能ShowModal
我想,你报错的地方,应该是PageControll 的OnChange 事情里吧
Function Open():Boolean;stdcall;
var
frmMain:TfrmMain;//主窗体
Begin
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TmessageFrm, messageFrm);//子窗体
Application.CreateForm(TfrmPubInfo, frmPubInfo);//子窗体
frmMain.ShowModal; Result:=True;
End;
如果情况就象你所说的,那该怎么办?总不能不用吧
要注意几点:
1,参数Application 可以不用传递的,在 Project -> option 的 packages 钩上 build
with runtime packages. 主窗体和MDI 子窗体都要钩上的!
2, MDI子窗体不能用 ShowModal 只能用 Show;
3, MDI子窗体关闭的时候记得 Action := Cafree; 而且 窗体变量 := nil;
4, 所有MDI子窗体最好在程序由代码创建,不要自动创建.
好处:节省内存,启动快!