我在MainForm上放了一个Panel,把DLL中的窗体作为子窗体放到这个Panel上。
调用后,如果子窗体中有ListView或TreeView,一点就出错。说ListView没有父亲窗体。怎么办?

解决方案 »

  1.   

    我在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;////////////////////////
    调用后,如果DLL的窗体中有ListView或TreeView,一点就出错。说ListView没有父亲窗体。怎么办?