delphi TComponent类 2
来自:http://blog.csdn.net/lailai186/article/details/7442385
-----------------------------------------------------------------------
学习DELPHI最好的方法是看DELPHI的VCL原代码爱看他的机制本文就类TComponent的原代码来看他的机制.
{ TComponent }
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);
end; procedure TComponent.InsertComponent(AComponent: TComponent);
begin
AComponent.ValidateContainer(Self);
ValidateRename(AComponent, , AComponent.FName);//看是否有重名的对象如果有则发异常
Insert(AComponent);//在自己的子组件列表里加入AComponent的引用
AComponent.SetReference(True);
if csDesigning in ComponentState then
AComponent.SetDesigning(True);
Notification(AComponent, opInsert);//给自己发一个通知消息
end; procedure TComponent.ValidateRename(AComponent: TComponent;
const CurName, NewName: string);
begin
if (AComponent <> nil) and not SameText(CurName, NewName) and
(AComponent.Owner = Self) and (FindComponent(NewName) <> nil) then
raise EComponentError.CreateResFmt(@SDuplicateName, [NewName]);
if (csDesigning in ComponentState) and (Owner <> nil) then
Owner.ValidateRename(AComponent, CurName, NewName);//递归调用查是否有重名的组件
end; procedure TComponent.ValidateContainer(AComponent: TComponent);
begin
AComponent.ValidateInsert(Self);
end; procedure TComponent.ValidateInsert(AComponent: TComponent);
begin
end; procedure TComponent.Insert(AComponent: TComponent);//我们可以看到他的子组件的引用是用TLIST来保存的
begin
if FComponents = nil then FComponents := TList.Create;
FComponents.Add(AComponent);
AComponent.FOwner := Self;//给刚刚加上的主件赋上拥有者属性
end; destructor TComponent.Destroy; file://可以看到每一个组件都维护一个FFREENOTIFILES的列表
begin
Destroying;
if FFreeNotifies <> nil then
begin
while Assigned(FFreeNotifies) and (FFreeNotifies.Count > ) do
TComponent(FFreeNotifies[FFreeNotifies.Count - ]).Notification(Self, opRemove);
FreeAndNil(FFreeNotifies);//如果自己析构的时候,对自己FFREENOTIFILES里面引用的对象调用Notification,把自己析构造的事件告诉他们
end;
DestroyComponents;
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end; procedure TComponent.FreeNotification(AComponent: TComponent);//通过这个过程可以证实FFREENOTIFILES是一个列表这个列表维护自己析构的时候给那些对象通知
begin
if (Owner = nil) or (AComponent.Owner <> Owner) then
begin
// Never acquire a reference to a component that is being deleted.
assert(not (csDestroying in (ComponentState + AComponent.ComponentState)));
if not Assigned(FFreeNotifies) then FFreeNotifies := TList.Create;
if FFreeNotifies.IndexOf(AComponent) < then
begin
FFreeNotifies.Add(AComponent);
AComponent.FreeNotification(Self);
end;
end;
Include(FComponentState, csFreeNotification);
end;
2.7 TComponent分枝
TComponent分枝包含了所有从TComponent而不是TControl继承下来的VCL&CLX类。对于这个分枝中的对象,你在设计时刻可以直接在窗体重操作它们,但是在运行时刻它们不会为用户所见。它们是持续的对象,具有以下功能:
n 出现在组件面板中,并且在窗体重可以被改变
n 拥有和操作其它组件
n 加载和保存它们本身
TComponent引入的几个方法指明了组件在设计时刻的行为和随着组件保存哪些信息。流功能(保存窗体中对象属性的窗体文件的加载和保存)在这个分枝中出现。组件的发布属性被规定为持续的并且将自动被“流”。
TComponent分枝也引入了所有权的概念,该概念取自组件库。有两个属性支持所有权:Owner和 Components。每个组件都含有一个Owner属性指定其所有者。
一个组件可能会拥有另外的组件,在这种情况下,所有被包含组件都会出现在该组件的Components属性中。
每个组件的构造器都会包含一个参数指定新组件的所有者。
如果该引入的所有者存在,那么这个组件就会自动被添加到所有者的Components属性中。
Components属性除了用来存储所包含组件列表外,还可以提供自动释放其所有的组件。一旦一个组件有了一个所有者,那么当其所有者被释放是,它也会自动释放。
例如,因为TForm继承自TComponent,所以当一个窗体被销毁时,其所包含的所有组件都会被自动销毁并且释放其所占用的内存(当然,每个组件必须正确地设计其析构器使其能够被自动的清除)。
如果一个属性类型是Tcomponent或者其后裔,当流系统读入它时会自动创建一个其实例。如果一个属性类型是TPersistent而不是TComponent,那么流系统会通过该属性使用一个已经存在的该类型实例,并且为这个实例属性读取值。
下面是TComponent分枝的某些类:
n TActionList,维护一个动作列表,这个动作列表提供了一系列使你的程序可以对用户输入作出反应的抽象动作
n TMainMenu,为一个窗体提供菜单栏以及其下拉菜单
n TOpenDialog, TSaveDialog, TFontDialog, TFindDialog, TColorDialog等等,这些类提供一些通用的对话框以显示&收集信心
n TScreen,一个用以跟踪应用程序所创建的窗体&数据模块、活动窗体、窗体中的活动组件、屏幕的尺寸及其组成、程序可用的光标及字体等数据的类。
不需要一个可视界面的组件一般都直接源自TComponent类。如果需要创建一个诸如TTimer的组件,你可以直接继承TComponent,这些组件可以出现在组件列表中,但不是通过设计时刻的可视界面而是通过代码来访问其内在功能。尺寸的huonList,
delphi TComponent类 2的更多相关文章
- delphi TComponent类(1)
来自:http://blog.csdn.net/lailai186/article/details/7442383 ------------------------------------------ ...
- Delphi之TComponent类
TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视 ...
- QMetaObject感觉跟Delphi的类之类有一拼,好好学一下
提供了一堆原来C++没有的功能,比如反射什么的...但是可能还是没有Delphi的类之类更强,因为类之类可以“创建类”.可惜我学艺不精,对“类之类”也没有完全学会.先留个爪,有空把两个东西都好好学学, ...
- delphi 实体类 JSON 数组
delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...
- 比较C++、Java、Delphi声明类对象时候的相关语法
同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...
- Delphi 遍历类中的属性
http://blog.csdn.net/easyboot/article/details/8004954 Delphi 遍历类中的属性 标签: delphistringbuttonclassform ...
- 再次深入理解delphi的类
property WindowState: TWindowState read FWindowState write SetWindowState; {声明一个属性WindowState,它从字段FW ...
- DELPHI学习---类和对象(五篇)
Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
随机推荐
- DataTables实现rowspan思路
直接看例子吧 <table id="example" class="display table table-bordered" cellspacing=& ...
- WinForm查询大数据界面假死,使用异步调用解决
用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...
- Android Layout: TableLayout
TableLayout<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" andr ...
- 【bzoj4337】【Bjoi2015】树的同构
题解 无标号树的HASH: 找到树的重心,以重心为根求出括号序列: 由于树的重心最多只有两个,取字典序的最小括号序列HASH即可 树的括号序列$s_{u}="(s_{v_{1}},s_{v_ ...
- mac go2shell 安裝
配合Finder打开Finder,按住command键,拖动Go2Shell的图标到Finder菜单就可以在Finder快捷打开Go2Shell了
- 【Asp.net入门05】第一个ASP.NET 应用程序-测试Asp.net程序
测试示例应用程序 本部分内容: ASP.NET应用程序测试方法 web窗体访问过程 Visual Studio工具栏上有一个下拉列表,其中列出了工作站上已安装的浏览器的名称(单击浏览器名称右侧的向下箭 ...
- vhost配置
server { listen ; server_name local.*****.com; index index.html index.htm index.php; root /home/wwwr ...
- mysql8 net start mysql 服务名无效
解决办法: 1.win+R打开运行窗口,输入services.msc 2.在其中查看mysql的服务名,我的是MySQL80 3.以管理员身份打开cmd,输入net start MySQL80 出现下 ...
- python3.6爬虫总结-01
1. HTTP 简介 HTTP常见状态码 200/OK: 请求成功 201/Created: 请求已被实现,且一个新资源已根据请求被建立,URI跟随Location头信息返回. 202/Accepte ...
- nginx配置详情(总结)
Nginx简介 Nginx是一款开源代码的高性能HTTP服务器和反向代理服务器,同时支持IMAP/POP3/SMTP代理服务 Nginx工作原理 Nginx由内核和模块组成,完成工作是通过查找配置文件 ...