各位老大:
    请问一下,怎么把DLL中的MDI子窗口,创建在MDI主程序中!小弟才入门,请写出代码!谁有好的解决办法,另有高分送上!!!

解决方案 »

  1.   

    建義先買一本什麼<<DELPHI 實用技巧XXX例>> 或者<<DELPHI 實用程序 XXX例>>書看看, 里面有很多這方面的小技巧
      

  2.   

    把主窗体的句柄作为参数送入DLL,就行了!
      

  3.   

    有两种方式,一种是模式窗口,一种是无模式窗口。
    下面是模式窗口的例子。unit MainFfm;
    interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls;type
      { First, define a procedural data type, this should reflect the
        procedure that is exported from the DLL. }
      TShowCalendar = function (AHandle: THandle; ACaption: String): TDateTime; StdCall;  { Create a new exception class to reflect a failed DLL load }
      EDLLLoadError = class(Exception);  TMainForm = class(TForm)
        lblDate: TLabel;
        btnGetCalendar: TButton;
        procedure btnGetCalendarClick(Sender: TObject);
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}procedure TMainForm.btnGetCalendarClick(Sender: TObject);
    var
      LibHandle   : THandle;
      ShowCalendar: TShowCalendar;
    begin  { Attempt to load the DLL }
      LibHandle := LoadLibrary('CALENDARLIB.DLL');
      try
        { If the load failed, LibHandle will be zero.
          If this occurs, raise an exception. }
        if LibHandle = 0 then
          raise EDLLLoadError.Create('Unable to Load DLL');
        { If the code makes it here, the DLL loaded successfully, now obtain
          the link to the DLL's exported function so that it can be called. }
        @ShowCalendar := GetProcAddress(LibHandle, 'ShowCalendar');
        { If the function is imported successfully, then set lblDate.Caption to reflect
          the returned date from the function. Otherwise, show the return raise
          an exception. }
        if not (@ShowCalendar = nil) then
          lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
        else
          RaiseLastWin32Error;                                                               
      finally
        FreeLibrary(LibHandle); // Unload the DLL.
      end;
    end;end.unit DLLFrm;
    interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Grids, Calendar;type  TDLLForm = class(TForm)
        calDllCalendar: TCalendar;
        procedure calDllCalendarDblClick(Sender: TObject);
      end;{ Declare the export function }
    function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime; StdCall;implementation
    {$R *.DFM}function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
    var
      DLLForm: TDllForm;
    begin
      // Copy application handle to DLL's TApplication object
      Application.Handle := AHandle;
      DLLForm := TDLLForm.Create(Application); 
      try
        DLLForm.Caption := ACaption;
        DLLForm.ShowModal;
        Result := DLLForm.calDLLCalendar.CalendarDate; // Pass the date back in Result
      finally
        DLLForm.Free;
      end;
    end;procedure TDLLForm.calDllCalendarDblClick(Sender: TObject);
    begin
      Close;
    end;end.
      

  4.   

    下面是无模式窗口的例子。unit MainFfm;
    interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls;type  TMainForm = class(TForm)
        btnShowCalendar: TButton;
        btnCloseCalendar: TButton;
        procedure btnShowCalendarClick(Sender: TObject);
        procedure btnCloseCalendarClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        FFormRef: TForm;
      end;var
      MainForm: TMainForm;function ShowCalendar(AHandle: THandle; ACaption: String): Longint; StdCall;
      external 'CALENDARMLLIB.DLL';procedure CloseCalendar(AFormRef: Longint); stdcall;
      external 'CALENDARMLLIB.DLL';implementation{$R *.DFM}procedure TMainForm.btnShowCalendarClick(Sender: TObject);
    begin
      if not Assigned(FFormRef) then
        FFormRef := TForm(ShowCalendar(Application.Handle, Caption));
    end;procedure TMainForm.btnCloseCalendarClick(Sender: TObject);
    begin
      if Assigned(FFormRef) then
      begin
        CloseCalendar(Longint(FFormRef));
        FFormRef := nil;
      end;
    end;procedure TMainForm.FormCreate(Sender: TObject);
    begin
      FFormRef := nil; // Initialize the FFormRef field to nil. 
    end;end.
    unit DLLFrm;
    interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Grids, Calendar;type  TDLLForm = class(TForm)
        calDllCalendar: TCalendar;
      end;{ Declare the export function }
    function ShowCalendar(AHandle: THandle; ACaption: String): Longint; stdCall;
    procedure CloseCalendar(AFormRef: Longint); stdcall;
    implementation
    {$R *.DFM}function ShowCalendar(AHandle: THandle; ACaption: String): Longint;
    var
      DLLForm: TDllForm;
    begin
      // Copy application handle to DLL's TApplication object
      Application.Handle := AHandle;
      DLLForm := TDLLForm.Create(Application);
      Result := Longint(DLLForm);
      DLLForm.Caption := ACaption;
      DLLForm.Show;  
    end;procedure CloseCalendar(AFormRef: Longint);
    begin
      if AFormRef > 0 then
        TDLLForm(AFormRef).Release;
    end;end.
      

  5.   

    谢谢上面哪位大哥,可是我的是MDI程序,在DLL中也是MDI的子窗口,我是要把DLL中的子窗口创建在MDI应用的主窗口上!
      

  6.   

    http://www.delphibyte.com/download/softview.php?softid=259
    源码参照