VCL Framework 的核心组件基础类TComponent,提供的基础服务:
   *作为基础根组件类以及基础组建管理功能
   *可同时扮演Container组件和单一组件的功能
   *基础组件互动通知功能(Notification)
   *同时提供可视化和非可视化组件构架基础
TComponent类定义了组件的许多核心元素,TComponent类的一个核心特性是所有权的定义。当建立一个组件时,它可以被赋给一个所有者组件,同时也要负责消除这个组建。所有每个组件都有一个所有者,并还可以做为其他组件的所有者。
参看70行,如果建立一个组件并且将它赋给某个所有者,那么它将被添加 到组件列表(Insertcomponent),并使用components数组属性来访问。特定组件有个owner,并通过componentindex属性了解自己在所有者组件列表中的位置。最后,所有者的析构器将负责其所有对象的解除,此时,可调用destroycomponents。
改变所有者(owner),为了改变组件的所有者,可以通过调用所有者自己的insertcomponent与removecomponent对象方法来影响该值(将当前组件做为参数传递)
procedure changeowner(component, newowner:   TComponent);
begin
   component.owner.removecomponent(component);
  newowner.insertcomponent(component);
end;
可定制的tag属性
   tag属性是一个奇怪的属性,因为它根本就没有什么效果,它只是一个附加内存地址,出现在每个组件类中,用于存储专用的值。它存储的种类及其使用方式完全由用户来决定。
1.作为基础根组件类以及基础组建管理功能
TComponent作为组件类的根类自然需要声明虚拟构造函数和虚拟析构函数以便让派生类可以改写。
核心库类之TComponent类public
核心库类之TComponent类    constructor Create(AOwner: TComponent); virtual;
核心库类之TComponent类    destructor Destroy; override;

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

 1核心库类之TComponent类destructor TComponent.Destroy;
 2核心库类之TComponent类begin
 3核心库类之TComponent类  Destroying;
 4核心库类之TComponent类  if FFreeNotifies <> nil then
 5核心库类之TComponent类  begin
 6核心库类之TComponent类    while Assigned(FFreeNotifies) and (FFreeNotifies.Count > 0do
 7核心库类之TComponent类      TComponent(FFreeNotifies[FFreeNotifies.Count - 1]).Notification(Self, opRemove);
 8核心库类之TComponent类    FreeAndNil(FFreeNotifies);
 9核心库类之TComponent类  end;
10核心库类之TComponent类  DestroyComponents;
11核心库类之TComponent类  if FOwner <> nil then FOwner.RemoveComponent(Self);
12核心库类之TComponent类  inherited Destroy;
13核心库类之TComponent类end;

 tcomponent实现了基础组件管理服务,这些方法是InsertComponent、RemoveComponent、components等相关特性。
2.可同时扮演Container组件和单一组件的功能

核心库类之TComponent类TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
核心库类之TComponent类  
private
核心库类之TComponent类    FOwner: TComponent;
//父代对象
核心库类之TComponent类    FName: TComponentName;
核心库类之TComponent类    FTag: Longint;
核心库类之TComponent类    FComponents: TList;
//存储所有它管理的子组件


3.基础组件互动通知功能(Notification)
采用了Notify设计模式来管理子组件,在TComponent的构造函数中调用了父代对象的InsertComponent来通知一个新的TComponent对象的加入。在005行中把新的子组件加入到FComponents中,在009行中调用Notification通知FComponents中的每个组件现在有新的组件加入了。

 1核心库类之TComponent类procedure TComponent.InsertComponent(AComponent: TComponent);
 2核心库类之TComponent类begin
 3核心库类之TComponent类  AComponent.ValidateContainer(Self);
 4核心库类之TComponent类  ValidateRename(AComponent, '', AComponent.FName);
 5核心库类之TComponent类  Insert(AComponent);
 6核心库类之TComponent类  AComponent.SetReference(True);
 7核心库类之TComponent类  if csDesigning in ComponentState then
 8核心库类之TComponent类    AComponent.SetDesigning(True);
 9核心库类之TComponent类  Notification(AComponent, opInsert);
10核心库类之TComponent类end;
11核心库类之TComponent类
12核心库类之TComponent类procedure TComponent.Insert(AComponent: TComponent);
13核心库类之TComponent类begin
14核心库类之TComponent类  if FComponents = nil then FComponents := TList.Create;
15核心库类之TComponent类  FComponents.Add(AComponent);
16核心库类之TComponent类  AComponent.FOwner := Self;
17核心库类之TComponent类end;
18核心库类之TComponent类
19核心库类之TComponent类procedure TComponent.Notification(AComponent: TComponent;
20核心库类之TComponent类  Operation: TOperation);
21核心库类之TComponent类var
22核心库类之TComponent类  I: Integer;
23核心库类之TComponent类begin
24核心库类之TComponent类  if (Operation = opRemove) and (AComponent <> nil) then
25核心库类之TComponent类    RemoveFreeNotification(AComponent);
26核心库类之TComponent类  if FComponents <> nil then
27核心库类之TComponent类  begin
28核心库类之TComponent类    I := FComponents.Count - 1;
29核心库类之TComponent类    while I >= 0 do
30核心库类之TComponent类    begin
31核心库类之TComponent类      TComponent(FComponents[I]).Notification(AComponent, Operation);
32核心库类之TComponent类      Dec(I);
33核心库类之TComponent类      if I >= FComponents.Count then
34核心库类之TComponent类        I := FComponents.Count - 1;
35核心库类之TComponent类    end;
36核心库类之TComponent类  end;
37核心库类之TComponent类end;

     TComponent的Notitication声明成虚拟方法。
TComponent另一个基础管理组件服务RemoveComponent,同样使用Notify设计模式知会子组件有组件被释放了,在通知完所有相关组件之后才会调用Remove真正把组件从FComponents中移除。

核心库类之TComponent类procedure TComponent.RemoveComponent(AComponent: TComponent);
核心库类之TComponent类begin
核心库类之TComponent类  ValidateRename(AComponent, AComponent.FName, 
'');
核心库类之TComponent类
  Notification(AComponent, opRemove);
核心库类之TComponent类  AComponent.SetReference(
False);
核心库类之TComponent类  Remove(AComponent);
核心库类之TComponent类
end;
核心库类之TComponent类
核心库类之TComponent类procedure TComponent.Remove(AComponent: TComponent);
核心库类之TComponent类begin
核心库类之TComponent类  AComponent.FOwner :
= nil;
核心库类之TComponent类  FComponents.Remove(AComponent);
核心库类之TComponent类  
if FComponents.Count = 0 then
核心库类之TComponent类  begin
核心库类之TComponent类    FComponents.Free;
核心库类之TComponent类    FComponents :
= nil;
核心库类之TComponent类  
end;
核心库类之TComponent类
end;
核心库类之TComponent类

核心库类之TComponent类procedure TComponent.DefineProperties(Filer: TFiler);
核心库类之TComponent类var
核心库类之TComponent类  Ancestor: TComponent;
核心库类之TComponent类  Info: Longint;
核心库类之TComponent类begin
核心库类之TComponent类  Info :
= 0;
核心库类之TComponent类  Ancestor :
= TComponent(Filer.Ancestor);
核心库类之TComponent类  
if Ancestor <> nil then Info := Ancestor.FDesignInfo;
核心库类之TComponent类  Filer.DefineProperty(
'Left', ReadLeft, WriteLeft,
核心库类之TComponent类
    LongRec(FDesignInfo).Lo <> LongRec(Info).Lo);
核心库类之TComponent类  Filer.DefineProperty(
'Top', ReadTop, WriteTop,
核心库类之TComponent类
    LongRec(FDesignInfo).Hi <> LongRec(Info).Hi);
核心库类之TComponent类
end;

  1核心库类之TComponent类TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
  2核心库类之TComponent类  private
  3核心库类之TComponent类    FOwner: TComponent;
  4核心库类之TComponent类    FName: TComponentName;
  5核心库类之TComponent类    FTag: Longint;
  6核心库类之TComponent类    FComponents: TList;
  7核心库类之TComponent类    FFreeNotifies: TList;
  8核心库类之TComponent类    FDesignInfo: Longint;
  9核心库类之TComponent类    FComponentState: TComponentState;
 10核心库类之TComponent类
 11核心库类之TComponent类    FVCLComObject: Pointer;
 12核心库类之TComponent类    function GetComObject: IUnknown;
 13核心库类之TComponent类
 14核心库类之TComponent类    function GetComponent(AIndex: Integer): TComponent;
 15核心库类之TComponent类    function GetComponentCount: Integer;
 16核心库类之TComponent类    function GetComponentIndex: Integer;
 17核心库类之TComponent类    procedure Insert(AComponent: TComponent);
 18核心库类之TComponent类    procedure ReadLeft(Reader: TReader);
 19核心库类之TComponent类    procedure ReadTop(Reader: TReader);
 20核心库类之TComponent类    procedure Remove(AComponent: TComponent);
 21核心库类之TComponent类    procedure RemoveNotification(AComponent: TComponent);
 22核心库类之TComponent类    procedure SetComponentIndex(Value: Integer);
 23核心库类之TComponent类    procedure SetReference(Enable: Boolean);
 24核心库类之TComponent类    procedure WriteLeft(Writer: TWriter);
 25核心库类之TComponent类    procedure WriteTop(Writer: TWriter);
 26核心库类之TComponent类    { IInterfaceComponentReference }
 27核心库类之TComponent类    function IInterfaceComponentReference.GetComponent = IntfGetComponent;
 28核心库类之TComponent类    function IntfGetComponent: TComponent;
 29核心库类之TComponent类  protected
 30核心库类之TComponent类    FComponentStyle: TComponentStyle;
 31核心库类之TComponent类    procedure ChangeName(const NewName: TComponentName);
 32核心库类之TComponent类    procedure DefineProperties(Filer: TFiler); override;
 33核心库类之TComponent类    procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic;
 34核心库类之TComponent类    function GetChildOwner: TComponent; dynamic;
 35核心库类之TComponent类    function GetChildParent: TComponent; dynamic;
 36核心库类之TComponent类    function GetOwner: TPersistent; override;
 37核心库类之TComponent类    procedure Loaded; virtual;
 38核心库类之TComponent类    procedure Notification(AComponent: TComponent;
 39核心库类之TComponent类      Operation: TOperation); virtual;
 40核心库类之TComponent类    procedure PaletteCreated; dynamic;
 41核心库类之TComponent类    procedure ReadState(Reader: TReader); virtual;
 42核心库类之TComponent类    procedure SetAncestor(Value: Boolean);
 43核心库类之TComponent类    procedure SetDesigning(Value: Boolean; SetChildren: Boolean = True);
 44核心库类之TComponent类    procedure SetInline(Value: Boolean);
 45核心库类之TComponent类    procedure SetDesignInstance(Value: Boolean);
 46核心库类之TComponent类    procedure SetName(const NewName: TComponentName); virtual;
 47核心库类之TComponent类    procedure SetChildOrder(Child: TComponent; Order: Integer); dynamic;
 48核心库类之TComponent类    procedure SetParentComponent(Value: TComponent); dynamic;
 49核心库类之TComponent类    procedure Updating; dynamic;
 50核心库类之TComponent类    procedure Updated; dynamic;
 51核心库类之TComponent类    class procedure UpdateRegistry(Register: Booleanconst ClassID, ProgID: string); virtual;
 52核心库类之TComponent类    procedure ValidateRename(AComponent: TComponent;
 53核心库类之TComponent类      const CurName, NewName: string); virtual;
 54核心库类之TComponent类    procedure ValidateContainer(AComponent: TComponent); dynamic;
 55核心库类之TComponent类    procedure ValidateInsert(AComponent: TComponent); dynamic;
 56核心库类之TComponent类    procedure WriteState(Writer: TWriter); virtual;
 57核心库类之TComponent类    { IInterface }
 58核心库类之TComponent类    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
 59核心库类之TComponent类    function _AddRef: Integer; stdcall;
 60核心库类之TComponent类    function _Release: Integer; stdcall;
 61核心库类之TComponent类
 62核心库类之TComponent类    { IDispatch }
 63核心库类之TComponent类    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
 64核心库类之TComponent类    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
 65核心库类之TComponent类    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
 66核心库类之TComponent类      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
 67核心库类之TComponent类    function Invoke(DispID: Integerconst IID: TGUID; LocaleID: Integer;
 68核心库类之TComponent类      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
 69核心库类之TComponent类
 70核心库类之TComponent类  public
 71核心库类之TComponent类    constructor Create(AOwner: TComponent); virtual;
 72核心库类之TComponent类    destructor Destroy; override;
 73核心库类之TComponent类    procedure BeforeDestruction; override;
 74核心库类之TComponent类    procedure DestroyComponents;
 75核心库类之TComponent类    procedure Destroying;
 76核心库类之TComponent类    function ExecuteAction(Action: TBasicAction): Boolean; dynamic;
 77核心库类之TComponent类    function FindComponent(const AName: string): TComponent;
 78核心库类之TComponent类    procedure FreeNotification(AComponent: TComponent);
 79核心库类之TComponent类    procedure RemoveFreeNotification(AComponent: TComponent);
 80核心库类之TComponent类
 81核心库类之TComponent类    procedure FreeOnRelease;
 82核心库类之TComponent类
 83核心库类之TComponent类    function GetParentComponent: TComponent; dynamic;
 84核心库类之TComponent类    function GetNamePath: string; override;
 85核心库类之TComponent类    function HasParent: Boolean; dynamic;
 86核心库类之TComponent类    procedure InsertComponent(AComponent: TComponent);
 87核心库类之TComponent类    procedure RemoveComponent(AComponent: TComponent);
 88核心库类之TComponent类    procedure SetSubComponent(IsSubComponent: Boolean);
 89核心库类之TComponent类    function SafeCallException(ExceptObject: TObject;
 90核心库类之TComponent类      ExceptAddr: Pointer): HResult; override;
 91核心库类之TComponent类    function UpdateAction(Action: TBasicAction): Boolean; dynamic;
 92核心库类之TComponent类    function IsImplementorOf(const I: IInterface): Boolean;
 93核心库类之TComponent类    function ReferenceInterface(const I: IInterface; Operation: TOperation): Boolean;
 94核心库类之TComponent类
 95核心库类之TComponent类    property ComObject: IUnknown read GetComObject;
 96核心库类之TComponent类
 97核心库类之TComponent类    property Components[Index: Integer]: TComponent read GetComponent;
 98核心库类之TComponent类    property ComponentCount: Integer read GetComponentCount;
 99核心库类之TComponent类    property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;
100核心库类之TComponent类    property ComponentState: TComponentState read FComponentState;
101核心库类之TComponent类    property ComponentStyle: TComponentStyle read FComponentStyle;
102核心库类之TComponent类    property DesignInfo: Longint read FDesignInfo write FDesignInfo;
103核心库类之TComponent类    property Owner: TComponent read FOwner;
104核心库类之TComponent类
105核心库类之TComponent类    property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
106核心库类之TComponent类
107核心库类之TComponent类  published
108核心库类之TComponent类    property Name: TComponentName read FName write SetName stored False;
109核心库类之TComponent类    property Tag: Longint read FTag write FTag default 0;
110核心库类之TComponent类  end;

相关文章:

  • 2022-12-23
  • 2021-07-25
  • 2021-10-27
  • 2022-12-23
  • 2021-04-18
  • 2021-11-30
  • 2022-12-23
  • 2021-05-03
猜你喜欢
  • 2021-12-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案