with TfrmDD.Create(Application.MainForm, RConnectDB, TeacherID, Right) do
--------------------------------------
如果是嵌入到MainForm或MainForm作为拥有者, 都是可以获得的TfrmDD的实例化对象的
--------------------------------------
如果是嵌入到MainForm或MainForm作为拥有者, 都是可以获得的TfrmDD的实例化对象的
unit UnitMDIBplForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
function ShowMDIForm(App: TApplication): THandle; stdcall;
exports
ShowMDIForm;implementation{$R *.dfm}function ShowMDIForm(App: TApplication): THandle;
begin
Application := App;
with TForm2.Create(App) do
try
Show;
result := Handle;
except
Result := 0;
end;
end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := CaFree;
end;end.调用单元,FormStyle设为fsMDIForm, 一个显示按钮;
包的载入和卸载时机自己把握
unit UnitMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
btnShowForm: TButton;
procedure btnShowFormClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
bplH, bplFormH: THandle;
public
{ Public declarations }
end;
TShowMDIForm = function(App : TApplication):THandle; stdcall;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btnShowFormClick(Sender: TObject);
var
pProc : TShowMDIForm;
begin
if bplFormH <> 0 then
try
ShowWindow(bplFormH, SW_SHOW);
exit;
except on E: Exception do
raise Exception.Create(e.Message);
end; if bplH = 0 then
raise Exception.Create('无法获取待使用的包文件句柄!'); pProc := getprocaddress(bplH, 'ShowMDIForm');
bplFormH := pProc(Application);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
bplH := 0;
bplH := LoadPackage('bplForExports.bpl'); bplFormH := 0;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseWindow(bplFormH);
if bplH <> 0 then
UnRegisterModuleClasses(bplH);
end;end.
得控制关闭了 句柄要给0
procedure TForm1.btnShowFormClick(Sender: TObject);
var
pProc : TShowMDIForm;
begin
//if bplFormH <> 0 then
if IsWindow(bplFormH) then
try
ShowWindow(bplFormH, SW_SHOW);
exit;
except on E: Exception do
raise Exception.Create(e.Message);
end; if bplH = 0 then
raise Exception.Create('无法获取待使用的包文件句柄!'); pProc := getprocaddress(bplH, 'ShowMDIForm');
bplFormH := pProc(Application);
end;
问题是这样的 我用show方法 把bpl中窗口show出来 主程序所占用内存就增长2m
但是我把show出来的窗口 关闭掉 发现 内存没释放
如果是做showmodal 我是可以释放内存
可是show 就不知道在哪里释放了 因为代码走掉了
应该要在bpl窗口中自己给释放掉 我已经在onclose里面 action 设置为 cafree 了,可是没有效果
这个细节 还请再麻烦您看下 谢谢。