我现在想做个EXE调DLL中的窗体的程序
要求如下:
1、EXE中的主窗体为fsNormal
2、Dll中的Form为fsMDIForm
3、Dll中的Form要嵌入到EXE中的主窗体的一个Panel中
4、这个Panel的大小是可变的(即,是alClient的)
5、Dll中的Form要融合到EXE中的主窗体中(即,在主窗体移动、大小变化时Form要随之变化)
......
不知道说得清不清楚?其实我就是想在ChildForm中再嵌有Child!

解决方案 »

  1.   

    找到窗体,
    。PARENT:=FORM1
      

  2.   

    gcq(gcq) 
    dbExpress(都是昵称惹的祸)
    能不能说的详细点?
    能不能给个例子?
    谢谢~
      

  3.   

    具体怎么做,我也没现成的代码,
    2年没用过DELPHI了
    只是知道能够找到窗体的HANDLE,然后就可以操作了似乎是这样
      

  4.   

    我试了一下,不过有点问题,就是Minimize的时候有问题。我估计这个问题应该是可以解决的,拦截一下主窗口的WM_SYSCOMMAND,我晚上有时间再看看。不过最好是阿德大佬说的,换个思路。以下是两个Project,一个是EXE,一个是DLL。两个Project,Build的时候都要用Build with Runtime Packages编译,这一点很重要。//EXE Source
    //------------------------------------------------------------program MainFormProj;uses
      SysUtils,
      Classes,
      Windows,
      Forms,
      Controls,
      ExtCtrls;type
      TMainForm = class(TForm)
      private
        fChildFormHandle: THandle;
        fChildFormControl: TForm;
        fPanel: TPanel;
        procedure FormShow(aSender: TObject);
        procedure FormDestroy(aSender: TObject);    procedure PanelClick(aSender: TObject);
      public
        constructor Create(aOwner: TComponent); override;
      end;var
      MainForm: TForm;{$R *.res}const
      DLLProj = 'DLLProj.dll';function CreateForm: THandle; stdcall; external DLLProj name 'CreateForm';
    procedure FreeFrom(const aFormHandle: THandle); stdcall; external DLLProj name 'FreeForm';{ TDummyObj }procedure TMainForm.FormShow(aSender: TObject);
    begin
      Caption := 'MainForm';  //创建Panel
      fPanel := TPanel.Create(Self);
      fPanel.Align := alClient;
      fPanel.OnClick := PanelClick; //主窗显示完毕后,点击Panel就可以看到DLL的子窗
      fPanel.Parent := Self;
    end;procedure TMainForm.PanelClick(aSender: TObject);
    begin
      //创建DLL的子窗
      fChildFormHandle := CreateForm;
      fChildFormControl := TForm(FindControl(fChildFormHandle));
      fChildFormControl.Caption := 'ChildForm';
      fChildFormControl.Parent := fPanel;
      fChildFormControl.Align := alClient;
      fChildFormControl.Visible := True;
    end;procedure TMainForm.FormDestroy(aSender: TObject);
    begin
      //释放子窗
      FreeFrom(fChildFormHandle);
      fChildFormControl := nil;
    end;constructor TMainForm.Create(aOwner: TComponent);
    begin
      inherited CreateNew(aOwner, 0);  OnShow := FormShow;
      OnDestroy := FormDestroy;
    end;begin
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      Application.Run;
    end.//DLL Source
    //----------------------------------------------------------------------
    library DLLProj;uses
      SysUtils,
      Forms,
      Controls;{$R *.res}function CreateForm: THandle; stdcall;
    begin
      Result := TForm.Create(nil).Handle;
    end;procedure FreeForm(const aFormHandle: THandle); stdcall;
    begin
      FindControl(aFormHandle).Free;
    end;exports
      CreateForm,
      FreeForm;
      
    begin
    end.
      

  5.   

    dbExpress(都是昵称惹的祸) :
    看着你的代码觉得...
    高手 :)
    等我试试
    谢谢先
      

  6.   

    dbExpress(都是昵称惹的祸) :
    不行~
    :(
    最起码DLL中无法正常使用MDI
    这不行!另,让我换换思路我也想呀!
    本来这就已经换了思路了!——原来是想MDI下再有MDI
    :(怎么办?
    我现在的最简单的需求就是:要有三个层次的窗体结构(不一定非要DLL形式,其实这应该不是主要问题吧?!我想)
      

  7.   

    对不起,没看清你的MDI需求。这个,我不会。实在不好意思,浪费大家的时间。
      

  8.   

    Windows.SetParent(中再嵌有Child.Handle,ChildForm.Handle);
      

  9.   

    我已处理了,要的话给我E-MAIL 发一个给你呀。
      

  10.   

    anh(hananying) 
    要是可以的话我另开贴给你分
    :)
      

  11.   

    把你的E-MAIL 给我,我给你发一个例子。OK!
      

  12.   

    anh(hananying) 
    大侠,我要的不是DLL调用MDIChild
    这只是两级的!我是要三级窗体关系
    :(不过还是谢谢你的热心
    :)
      

  13.   

    继续学习
    把 anh(hananying) 代码给大家看看啊
    说不定就可以解决呢
      

  14.   

    你说的三级是指什么呀,我的那个例子中的确良dll是如何调用的,它是在那调用的。
    主程序是一个MDIFORM 的,那个算不算呀。
      

  15.   

    用frames控件试试!
    有问题请发信息到我的E-mail:[email protected]
      

  16.   

    anh(hananying) 
    大侠,我要的不是DLL调用MDIChild
    这只是两级的!我是要三级窗体关系我给你的是一个主程序(MDIFORM)调用DLL 中的子窗口,在子窗中再调用一个一般的窗口。
    而不是你说的,”DLL调用MDIChild“,你的,明白!!!你说我这是几层的呀。