vcl组件精要

         一、Self和Sender       

        Self和Sender就像Delphi在函数中提供了Result变量(与函数返回数据类型相同)一样,Delphi也为方法提供了隐含的(指针类型的)Self变量,用来引用在运行时调用该方法的对象。而在许多事件的参数中,Delphi使用了Sender: TObject参数,该参数缺省传递引发事件的对象。通过该参数,可以传递Delphi中的任意对象,这就为事件处理实现多态提供了保证,实际上也可以用作多态性的一个很好的例子。                     

        二、可视化组件的层次结构

        1.Tpersistent类

        在VCL的层次结构中,TObject的下一层就是Tpersistent。Tpersistent类支持使对象独立于程序的生命周期而保留下来,这些具有这种特点的对象被称为“持久对象”。 在Tpersisten中增加了两个有用的方法——SaveToStream和LoadFromStream,用于进行流操作,它们是为了永久保存对象而创建的。    

  TPersistent = class(TObject)
  private
    procedure AssignError(Source: TPersistent);
  protected
    procedure AssignTo(Dest: TPersistent); virtual;
    procedure DefineProperties(Filer: TFiler); virtual;
    function  GetOwner: TPersistent; dynamic;
  public
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); virtual;
    function  GetNamePath: string; dynamic;
  end;
 

       2.Tcomponent类

        Tcomponent是所有组件的父类。而Tcomponent类又继承了Tpersisten,所以,所有的VCL组件都是“持久对象”。 Tcomponent类的独特特性是它的属性能够在设计期间通过Object Inspector来控制 ,并且可以拥有其他组件(FComponents)

  TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
  private

    FOwner: TComponent;    //组件的拥有者
    FName: TComponentName;
    FTag: Longint;
    FComponents: TList;  / /拥有的组件列表
  
  FFreeNotifies: TList;
    FDesignInfo: Longint;
    FComponentState: TComponentState;

  public
    constructor Create(AOwner: TComponent); virtual;//虚拟的哦~~~~~~为其指定一个拥有者
    destructor Destroy; override;

constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end;

procedure TComponent.Insert(AComponent: TComponent);
begin
  if FComponents = nil then FComponents := TList.Create;
  FComponents.Add(AComponent);
  AComponent.FOwner := Self;
end;

function GetParentComponent: TComponent; dynamic;

function HasParent: Boolean; dynamic;

function TComponent.GetParentComponent: TComponent;
begin
  Result := nil;
end;

function TComponent.HasParent: Boolean;
begin
  Result := False;
end;

       3.Tcontrol引入了另一个概念,即它可以有父组件(parent)。虽然Tcontrol可以有一个父,但它的父必须是一个TwinControl(父组件必须是窗口组件,作为其他组件的容器(双亲)),Tcontrol引入了Parent属性。

      TControl = class(TComponent)
      private
                  FParent: TWinControl;

       。。。

          function GetParentComponent: TComponent; override;

         function HasParent: Boolean; override;

         function TControl.GetParentComponent: TComponent;
           begin
                 Result := Parent;
          end;

       function TControl.HasParent: Boolean;
       begin
           Result := FParent <> nil;
       end;

       4.TwinControl类三大特征:句柄、焦点、部分可以为父(如TButton就不行)即容器

       property Controls[Index: Integer]: TControl read GetControl;//controls包含了组件的所有子组件。

       property ControlCount: Integer read GetControlCount;

       property Handle: HWnd read GetHandle;

       5.TgraphicControl类三大特征:无句柄、无焦点、全部不可以为父(容器)

          TGraphicControl = class(TControl)
          private
              FCanvas: TCanvas;
              procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
          protected
              procedure Paint; virtual;
              property Canvas: TCanvas read FCanvas;
          public
              constructor Create(AOwner: TComponent); override;
             destructor Destroy; override;
          end;

          图形组件对象都属于TgraphicControl类。TgraphicControl类派生的图形组件没有窗口句柄,不能接受输入焦点,也不能为父组件,但它有自身的优势——它不需要消耗系统资源,因此,它的绘制要比TwinControl组件的绘制快得多。


        6.TcustomControl类


       用户如果是组件编写者,可以通过这些这些基类给自定义组件提供绘制自己的功能。也就是说以Tcustom开头的派生类可以作为基类来派生和创建自定义组件。
         TCustomControl = class(TWinControl)
          private
               FCanvas: TCanvas;
               procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
          protected
               procedure Paint; virtual;
               procedure PaintWindow(DC: HDC); override;
               property Canvas: TCanvas read FCanvas;
          public
               constructor Create(AOwner: TComponent); override;
              destructor Destroy; override;
          end;
      与TGraphicControl何其相似~~~~~~~~~~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值