我的程序采用MDI模式,子窗体封装到了DLL中,当主程序调用DLL中的子窗体时“窗口”菜单不能新增这个项目,而调用主程序中的子窗体却可以在“窗口”菜单中显示,不知道我说清楚了没有,请高手指教。我的程序如下:主程序:
unit MainUnit;interfaceuses
  ......type
  InvokeDLLForm = function(App: TApplication; Scr: TScreen): TForm;
  TForm1 = class(TForm)
  ......var
  Form1: TForm1;
  DLLForm:TForm;//下面这个可以在“窗口”菜单中显示,TChildForm在主程序中。
procedure TForm1.NewItemClick(Sender: TObject); 
var
  Child: TChildForm;
begin
  Inc(Count);
  Child := TChildForm.Create(Self);
  Child.Caption := Child.Caption + ' ' + IntToStr(Count);
end;//下面这个不能在“窗口”菜单中显示,子窗体在DLL中。
procedure TForm1.OrderForm1Click(Sender: TObject);
var
  DLLHandle: THandle;
  DLLSub: InvokeDLLForm;
begin
  DLLHandle := LoadLibrary('E:\DOrderForm.dll');
  if DLLHandle <> 0 then
  begin
    @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
    if Assigned(DLLSub) then
    begin
      DLLForm := DLLSub(Application, Screen);
    end;
  end;
end;
==========================================================
//DLL子窗体
library DOrderForm;
.....var
  DLLApp: TApplication;
  DLLScr: TScreen;function CreateDLLForm(App: TApplication; Scr: TScreen):TForm;
begin
  Application := App;
  Screen := Scr;
  Application.CreateForm(TfrmDLLForm, frmDLLForm);
  Application.CreateForm(TForm1, Form1);
  result:=Form1;
end;procedure ExitDLL(Reason: Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
  begin
    Application := DLLApp;
    Screen := DLLScr;
  end;
end;
exports
  CreateDLLForm;begin
  DLLApp := Application;
  DLLScr := Screen;
  DLLProc := @ExitDLL;end.

解决方案 »

  1.   

    wudi_1982(Delphi & Vs.NET)能说说为什么不用MDI吗?
      

  2.   

    wudi_1982(Delphi & Vs.NET) 啊?我觉得MDI还可以呀,你说的不灵活是在于MDI介面呆板吧,可是我的问题我觉得一定有解决的办法,只是我的思路还没想到,所以请高手指点一下。
      

  3.   

    给你一个例子:
    //主程序
    type
      TMainForm = class(TForm)
        MainMenu1: TMainMenu;
        Start: TMenuItem;
        procedure StartClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;   T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;var
      MainForm: TMainForm;implementation{$R *.DFM}procedure TMainForm.StartClick(Sender: TObject);
    var
       DllHandle: THandle;
       ProcAddr: FarProc;
       ProvaChild: T_ProvaChild;
    begin   
       DllHandle := LoadLibrary('ProjectDll');
       ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
       if ProcAddr <> nil then
       begin
          ProvaChild := ProcAddr;
          ProvaChild(Application,Self);
       end;
    end;
    //子窗体的DLL
    procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
    var
      Form1: TForm1;  
      DllProc: Pointer;             { Called whenever DLL entry point is called }begin
       Application:=ParentApplication;   Form1:=TForm1.Create(ParentForm);
       Form1.MyParentForm:=ParentForm;
       Form1.MyParentApplication:=ParentApplication;
    //   windows.SetParent(Form1.Handle,ParentForm.Handle);
    //   Form1.FormStyle:=fsMDIChild;
       Form1.Show;
    end;procedure DLLUnloadProc(Reason: Integer); register;
    begin
      if Reason = DLL_PROCESS_DETACH then  Application:=DllApplication;
    end;exports
       ProvaChild;begin
       DllApplication:=Application;
       DLLProc := @DLLUnloadProc;
    end.