一、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何其相似~~~~~~~~~~