子窗体TChild嵌入应用

来源:互联网 发布:淘宝活动报名表格 编辑:程序博客网 时间:2024/06/04 18:46
unit ChildFrm;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls, Menus;
type
  TChildForm = class(TForm)
  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;
    //重载第一个构造器,需要传递两个参数,使窗体成为子窗口,AParent为其父窗体,如panel面板
    // The method below must be overridden to return either the main menu
    // of the form, or nil.
    
    function CanChange: Boolean; virtual;
  end;
var
  ChildForm: TChildForm;
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;
  end;
end;
procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
  Inherited CreateParams(Params);
  if FAsChild then
    Params.Style := Params.Style or WS_CHILD;
end;
function TChildForm.CanChange: Boolean;
begin
  Result := True;
end;
end.
其它窗体继承时应注意声明:
   type
         TNewChildForm := class(TChildForm);
关闭窗体时在内存中释放它:
a.处理onclose事件,并把Action参数设为caFree
   Action := caFree ; //当关闭时释放窗体实例
b.处理ondestroy事件时把form1变量设为nil
   if    Assigned(form1)   then
       form1 := nil ;
这样可以防止Assigned()函数失败.