我试了很多方法,都有错误!!

解决方案 »

  1.   

    应用是MDI结构,同时想做动态模块的添加,
    所以就把主程序做成MDI
    窗体,所有其他子模块都以DLL的形式,子模块的窗体都是MDI子窗体,
    都放在DLL里,
    但是调用这些DLL中的子窗体的时候,总是提示“没有
    当前活动的MDI窗体”!怎么解决呀?
    将Application和MDIFrame作为参数传递给DLL。
    DLL中的Application.Handle默认是0。多谢了! :)  我用下面的方法试了一下可以:function _Close:HRESULT;stdcall;
    //系统关闭之前,需要调用本方法
    begin
    Application := TmpOldApp;    
          //TmpOldApp是全局变量,用于存放DLL的Application
          //参见_Open
    end;function _Open(Aapp :TApplication) :TDModule;stdcall;
    //创建一个模块,并返回它的指针
    //参数Aapp :主程序的Application
    var
      testM :TDMTempModule;
    begin
    if Application.Handle = 0 then
    tmpOldApp := Application;
    //记录DLL的原始Application Application := Aapp;
    //将DLL的Application赋为主程序的Application  //Application.CreateForm(TFrmtemp, frmtemp);
    //用这句不行。  ?  frmtemp := TFrmtemp.CreateParented(Aapp.MainForm.Handle);
    //创建在DLL中定义的MDI子窗体 TFrmTemp 的一个实例
    //测试代码
    end;另外在Help里找到这句话:
    Note: When writing a DLL that uses VCL forms, assign the window handle
    of the host EXE's main window to the DLL's Application.Handle
    property. This makes the DLL's form part of the host application.
    Never assign to the Handle property in an EXE.
      

  2.   

    自己研究了好久,终于
    [email protected]
      

  3.   

    大哥,把示例发我一个,行不??我的邮件地址:[email protected]我折腾了一下,就是二楼说的那个问题!呵呵!
      

  4.   

    在DLL中建立一个TMDIChildForM  1 Dll中的MDIForm.FormStyle为fmMDIChild.
      2 在CreateForm后写以下两句:   function ShowForm(mainForm:TForm):integer;stdcall
      var
      Form1: TForm1;
      ptr:PLongInt;
      begin
      ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起来,也无须释放,只不过是替换一下
      ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm。MainForm是特殊的WINDOW,它专门管理Application中的Forms资源.
      //为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性
      Form1:=TForm1.Create(mainForm);//用参数建立
      end; 
      备注:参数是主调程序的Application.MainForm
      

  5.   

    楼上的方法我已经试过了,都是同一个错误:“没有当前活动的MDI窗体”!三楼 阿日的方法,我调试不通,不知道TDModule,TmpOldApp,TDMTempModule这些是东西,也不知道那里能查到这些东西的资料,惭愧呀!!!!
      

  6.   

    [email protected]
    发不过去,你还是给我发信吧
    [email protected]
      

  7.   

    记得在《精通DELPHI6.0》的翻译本中有实例
      

  8.   

    //我的动态连接库如下定义:
    library Project2;uses
      SysUtils,
      Forms,
      Classes,
      Unit2 in 'Unit2.pas' {FormOne};{$R *.res}
    var
      OldApp:TApplication;
    procedure InitChildForm(tmpApp:TApplication);stdcall;
    begin
      OldApp:=Application;
      Application:=tmpApp;
    end;
    procedure LoadForm1;stdcall
    begin
      TFormOne.Create(Application.MainForm);
    end;
    procedure FinalChildForm;stdcall;
    begin
      Application:=OldApp;
    end;
    exports
      InitChildForm,
      FinalChildForm,
      LoadForm1;
    begin
    end.
    //主程序如下应用
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}
      procedure InitChildForm(tmpApp:TApplication);stdcall;external 'Project2.dll';
      procedure FinalChildForm;stdcall;external 'Project2.dll';
      procedure LoadForm1;stdcall;external 'Project2.dll';procedure TForm1.FormCreate(Sender: TObject);
    begin
      InitChildForm(Application);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      LoadForm1;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FinalChildForm;
    end;end.