我想通过dll调用一个MDIChild窗口,有办法吗?
也就是把这个MDIChild做到dll里,然后通过主MDI窗口调用这个MDIChild

解决方案 »

  1.   

    你也太很了吧,500分,呵呵,有人邦我就不用了,你看下刘艺写的Delphi面向对像编程思想吧 这本书不错
      

  2.   

    你可以通过以下这个例子解决你的问题
    一.函数过程的写法:library FIRSTDLL;uses
      SysUtils,
      Classes;{$R *.RES}
    // 1.定义函数具体过程和输出接口方式
    // --------------------------------
    // 函数 1
    // 功能:事数据3倍放大函数
    // --------------------------------
    function PenniesToSoins(SourceResult:Integer):Integer;stdCall;
    begin
      if SourceResult>0 then
        Result:=SourceResult*3 //结果存放于Result
      else
        Result:=SourceResult;
    end;exports 
      PenniesToSoins; //2.函数输出口定义
      
    end.==
    ==二.在DLL中创建Form
    =======================
    1.一步,创建DLL工程,及加入设置好的Formlibrary MGRPERSN;
    uses
      SysUtils,
      Classes,
      MGRPERFM in 'MGRPERFM.pas' {FormPERSON};//1.Form的代码(与一般的Form一样){$R *.RES}
    exports
       ShowPerSN;//2.函数输出口定义
    begin
    end.2. 在DLL设定的Form的设置 
    ===========================================
    unit MGRPERFM;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, ToolWin, ImgList;type
      TFormPERSON = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;//些处的变量不再用,给其改个地方,如下(改变之一)
    //var 
    //  FormPERSON: TFormPERSON;{ Declare the export function 宣布Form函数出口}//改变之二
    function ShowPerSN(AHandle: THandle; ACaption: String):BOOL; StdCall;implementation{$R *.DFM}
    //函数据过程定义
    function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
    var
      FormPERSON: TFormPERSON; //定义窗体类(上面的放到了此处)
    begin
      // Copy application handle to DLL's TApplication object
      //拷贝应用程式句柄给DLL的应有程式对象
      Application.Handle := AHandle;
      FormPERSON := TFormPERSON.Create(Application);//创建控件TForm
      try
        FormPERSON.Caption := ACaption;
        FormPERSON.ShowModal;//显示此Form
        // Pass the date back in Result
        Result := False; //反回成功值
      finally
        FormPERSON.Free;
      end;
    end;三.DLL中函数及窗体的调用
    ==========================
    1.调用方法一
    --------------
    implementation //在此的下方写明调用函数的DLL{$R *.DFM}
    //DLL内函数调用
    function PenniesToSoins(SourceResult:Integer):Integer;
         StdCall external 'FIRSTDLL.DLL';........2.调用方法二
    ==============
    type  //在此创建一个函数类
      // 1 -------------------------------
      { First, define a procedural data type, this should reflect the
        procedure that is exported from the DLL. }
      { Create a new exception class to reflect a failed DLL load }
      TShowPerSN = function (AHandle: THandle; ACaption: String): BOOL; StdCall;
      EDLLLoadError = class(Exception);//同时分创建一个出错记录类
      // 1 -------------------------------
      TMAINCLTR = class(TForm) //这里不变,系统自动生成......procedure TMAINCLTR.ToolButton1Click(Sender: TObject);
    var  //按钮的调用事件:调用过程
      LibHandle: THandle;
      ShowPerSN: TShowPerSN;
    begin
      Application.Title:='人力资源管理系统DLL文件测试程式';
      { Attempt to load the DLL 尝试装入DLL文件}
      LibHandle := LoadLibrary('MGRPERSN.DLL');
      try
        if LibHandle = 0 then
          raise EDLLLoadError.Create('Unable to Load DLL(无法成功装入MGRPERSN.DLL)');
        @ShowPerSN := GetProcAddress(LibHandle, 'ShowPerSN');
        if not (@ShowPerSN = nil) then
          ShowPerSN(Application.Handle, '人事资料管理')//呼叫出窗体
        else
          RaiseLastWin32Error;
      finally
        FreeLibrary(LibHandle); // Unload the DLL.
      end;
    end;
    ============== END ==================
      

  3.   

    好像delphi自己的demo中有,要么就是窑洞里有,这样的例子很多,找找吧
      

  4.   

    建议用dll做一个factory,这样能很好些我这样做过,效果不错
      

  5.   

    用dll做Mdi设计是错误的选择,框架窗口和子窗口通讯会非常麻烦,另外还有菜单处理、焦子处理等一系列问题。建议你用BPL代替DLL处理MDI设计,也就是把子窗口做了包中,这也是Borland推荐的做法。
      

  6.   

    高分求救,裸求!//男or女???楼主???? if 女 then where??
                                 else  象楼上的说的一样;