在一个典型的MDI应用程序中,通过主窗体提供的属性和方法MDIChildCount,ActiveMDIChild等可以实现对子窗体的访问。
  当我们将子窗体封装在DLL中进行调用时,虽然已经创建了子窗体,但主窗体的MDIChildCount,ActiveMDIChild属性起不了作用了,此时EXE和DLL产生的是两个独立的应用。
  那么该如何去控制这些子窗体呢?
主窗體傳遞給DLL中的子窗體的ADO控件連接參數,關閉程序出錯?

解决方案 »

  1.   

    带包编译,传入application.handle参数
      

  2.   

    HOHO俺们现在是exe -> dll -> bpl 哈哈
      

  3.   

    我有个例子,希望对楼主有所帮助。
    [email protected]
      

  4.   

    在主程序和dll的第一个 uses 中,都
    uses shareMem;
    看如何?
      

  5.   

    传递Application, Screen地址到Dll中, 并替换掉Dll中的Application与Screen
    的地址, 释放Dll之前要到Application与Screen的址恢复要不会报错的.
      

  6.   

    当我们将子窗体封装在DLL中进行调用时,虽然已经创建了子窗体,但主窗体的MDIChildCount,ActiveMDIChild属性起不了作用了,此时EXE和DLL产生的是两个独立的应用。
      那么该如何去控制这些子窗体呢?//通过输出函数的方法
    主窗體傳遞給DLL中的子窗體的ADO控件連接參數,關閉程序出錯?//ADO控件不能当作参数传递。
      

  7.   

    我们现在用的是   cncharles旺仔  的方法~~~~
      

  8.   

    //在调用动态库前将Application对象传入,用这个替换动态库的Application对象,在卸载前将动态库的Application再改回去.我的动态连接库如下定义:
    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.