我在MainForm上放了一个Panel,我想把DLL中的窗体放到这个Panel上。程序如下:
//我先自己做了一个窗体, ChildForm.FormStyle:=fsNormal;unit ChildFrm;
interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls, Menus;type  TChildForm = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private
    FAsChild: Boolean;
    FTempParent: TWinControl;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce;
      overload;  end;var
  ChildForm: TChildForm;
  RequireAction: Boolean;implementation{$R *.DFM}constructor TChildForm.Create(AOwner: TComponent);
begin
  FAsChild := False;
  inherited Create(AOwner);end;constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
  FAsChild := True;
  FTempParent := aParent;
  inherited Create(AOwner);
end;
procedure TChildForm.Loaded;
begin
  inherited;
  if FAsChild then
  begin
    align := alClient;
    BorderStyle := bsNone; //??
    BorderIcons := [];
    Parent := FTempParent;
    Position := poDefault;
    Scaled := false;
  end;
end;procedure TChildForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if FAsChild then
    Params.Style := Params.Style or WS_CHILD;
end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  RequireAction := False;
  Action:=caFree;
end;end./////////////////////////////////TDLLForm1 = class(TChildForm)
输出函数是这样写的:
function TestformCreat(mymainform:TForm; PWin: TWinControl): TChildForm; stdcall;
var
  Form1: TDLLForm1;
  ptr:PLongInt;
begin
  ptr:=@(Application.MainForm);
  ptr^:=LongInt(mymainform);
  Application.Handle:=mymainform.Handle; //保存在任务栏不出现图标
  Form1:=TDLLForm1.Create(Application, PWin);
  Form1.Show;
  Result:=Form1;
end;exports
  TestformCreat;在调用时,什么都看不到。可如果在Exe中调另一个ChildForm子窗体(非DLL形式),再关闭它,就可以看到DLLForm了。怎么回事?搞不明白!

解决方案 »

  1.   


    DLLForm
    的Parent指向它的父窗体(例如你指定的panel)就行了。
      

  2.   

    DLL中显示窗口不能用show   用ShowModal
      

  3.   

    DLLForm的Panel已经指定了,在TChildForm中有写如果用ShowModal就达不到要求了
      

  4.   

    我觉得不是这个问题,DLL调用是成功的,也可以看到我要的效果,可不是在适当的时候看到的。奇怪!
      

  5.   

    问题解决了,可新问题又出来了。调用后,如果子窗体中有ListView或TreeView,一点就出错。说ListView没有父亲窗体。怎么办?
      

  6.   

    bu ming bai bang mang ding