with TfrmDD.Create(Application.MainForm, RConnectDB, TeacherID, Right) do
--------------------------------------
如果是嵌入到MainForm或MainForm作为拥有者, 都是可以获得的TfrmDD的实例化对象的

解决方案 »

  1.   

    以下代码D XE测试通过bpl中的form单元, FormStyle设为fsMDIChild;
    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.
      

  2.   

    这里面其实还有个问题 mdi窗口关闭了 再打开 就开不了了。、 英文句柄<>0 
    得控制关闭了 句柄要给0
      

  3.   

    我代码中的写法中没考虑关闭再打开的情况 
    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;
      

  4.   

    还有个问题 还得麻烦您下 既然弄了 最好再完美下。。
    问题是这样的  我用show方法 把bpl中窗口show出来  主程序所占用内存就增长2m
    但是我把show出来的窗口 关闭掉 发现 内存没释放
    如果是做showmodal 我是可以释放内存 
    可是show 就不知道在哪里释放了  因为代码走掉了
    应该要在bpl窗口中自己给释放掉 我已经在onclose里面 action 设置为 cafree 了,可是没有效果
    这个细节 还请再麻烦您看下 谢谢。
      

  5.   

    我第一次知道可以开发BPL 应用程式的。收藏了。