delphi self 的使用

delphi之self

在使用delphi的对象技术的时候,经常会看到一个词汇:self,它到底指的是什么呢?

我们还要从对象与类的关系谈起。 类是对将要创建的对象的性质的描述,是一种文档。这很重要:

类只是一段描述性的文字,它并不会真去分配内存,无论在其中定义多少变量。 如果打个比方,

类就是图纸,而对象就是根据图纸盖的房子。对象是真正在 内存中存在的东西,是运行“实体”。

根据一份图纸可以盖多个相似的房子,同 样道理,根据一个类,可以创建多个类似的对象,

这个过程叫做“实例化”。在delphi中使用对象技术,要遵循以下的步骤:

1。定义一个类

2。用该类声明一个名字(实质是一个指针)

3。用该类实例化一个对象,并使它与先前的名字联系起来

4。调用对象的方法或属性

5。释放对象

下面我们写一个最简单的表达累加器功能的类

type

TCount = class

private

FNum: integer; // 记录有多少个数字被累加

FSum: integer; // 当前的累加和

pubic

procedure Add(n: integer) // 把整数n累加进去

procedure clear; // 清零

procedure show; // 显示当前信息

constructor create; // 构造函数

end;

....

使用的过程是这样的:

var a: TCount; // 这里只是声明了一个名字,并非真正地分配了一个对象

...... // a这个变量只占用4字节地内存

a := TCount.create; // 在堆空间中分配内存,并把首地址拷贝到a中。

a.add(5);

a.add(7);

a.show(); // 以上是调用a对象的有关方法

a.free; // free会去调用析构函数,完成堆空间的释放。

我们看这样一个问题:一个对象到底占用多大的内存空间?

答案是很小!因为在分配一个对象地时候,实际上只分配了类中定义的数据,

而没有分配其中的函数所需要的空间。这些类中定义的函数(称为成员函数),

与普通函数一样被存放在静态地址空间中。

这样就引出了第二个问题:既然对象的数据和操作这些数据的方法不是存在一起,

那么这些函数如何才能知道到底要操作哪个数据块呢?(类可生成多个实例)

显然,最容易想到的解决办法就是让这些特殊函数带一个参数,是个指针类型,

该指针指示要操作的数据块的首地址。

事实上,成员函数正是这样做的,它们有一个缺省的参数self,这是个指针类型,

对于上边的例子,它的定义就是:TCount self。编译器在遇到调用a.add(5)的时候,

把它解释为:TCount.add(a,5);把代表对象的数据块的地址送给add函数作为第一个参数--隐含的参数。

说得本质一些就是:self是当前正在执行本函数的那个对象的数据块的首地址。

self既然代表对象自己,那么难道自己还用定义吗?看下边的代码:

procedure TForm1.button1click(sender: TObject);

var

a: TButton;

begin

a := Tbutton.create(self);

....

end;

在创建Tbutton类的对象的时候,需要给出一个内存管理者。

self就表示了正在运行button1click这个过程的那个对象(的数据块的首地址)。其实大多数情况下就是form1。//这里的理解有点问题应该是OWER管理者

Delphi之覆盖和隐藏

如果一个子类方法声明指定的标识符与继承得到的方法具有相同的名称,

但是未包含override,那么新的声明只是隐藏(hides)了父类方法。也就是说子类和父类方法同样存在,

父类方法是静态的,并未被覆盖,例如:

type

T1=class(TObject)

procedure Act;virtual;//virtual也好,或则dynamic也好,只是说明此方法可被覆盖

end;

T2=class(T1)

procedure Act;//Act再次被声明,但是因为没有被声明为overriden,所以没有覆盖父类T1的相应方法

end;

var

SomeObject:T1;

begin

SomeObject:T2.Create;

SomeObject.Act;//这里实际调用的是T1.Act

end;

关于Sender,Self,Owner和parent

Sender--意义:指本对象。

Sender在什么对象相关代码里,那么Sender就是什么。

Self--意义:指本类,也就是Self被引用的类。比如若在类TMyClass内引用了Self,

那么Self=TMyClass.

Owner--意义:哪个对象释放我的内存啊?

如:Pan:=TPanel.Create(Self);其中Create的参数是:AOwner:TComponent。

Owner释放Pan的内存。因为窗口释放Pan的内存,

但窗口类的对象是Self.一般给Owner传Self就可以。

比如:

代码段一:

pan:=TPanel.Create(Self);

with Pan do begin

try

Left:=20;

Top:=20;

parent:=Self; //Parent:=Form1也可以。

Visible:=true;

ShowMessage('Created');

finally

Pan.free;

end;

end;

-----------------------------------------------------

Parent--

意义:此对象包括在哪个对象里那?

说明:若组件不是从TControl继承来的,那么在创建组件后不必声明此属性。

转自:http://hi.baidu.com/xingfupingguo/item/79e2291647c768f686ad4e47

转载于:https://www.cnblogs.com/linguoqiu/archive/2013/01/11/2855893.html

delphi self 的使用相关推荐

  1. Delphi 之Copyrect的使用

    http://cqujsjcyj.iteye.com/blog/380970 Copyrect的使用(图片复制.放大.以及做图片放大镜等) 一.从一个选取一个区域中的图象到另一个图象组件中的固定区域 ...

  2. delphi 10 seattle 中 解决IOS 9 限制使用HTTP 服务问题

    IOS 9 于17号早上正式开始推送,早上起来立马安装,这次升级包只有1G, 安装空间也大大降低(想起IOS 8 升级时,几乎把手机里面的东西删光了,满眼都是泪). 虽然安装后,网上几乎是铺天盖地的吐 ...

  3. 奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit

    在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印.但是比较蛋疼的是,这个地方选 ...

  4. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

  5. [原]SSL 开发简述(Delphi)

    一.            简介 现在网上有关SSL的资料较多的是基于VC开发,Delphi的SSL开发资源很少. 本文主要使用OpenSSL为基础,讲述SSL的有关开发流程.OpenSSL功能非常丰 ...

  6. 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子

    前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了. 譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX; 另外提前来个列表 ...

  7. ado控件连接oracle,在Delphi 7中用ADOConnection控件连接Oracle 9i的问题

    我在本地机器上安装了oracle客户端,其中tnsnames.ora文件中的内容如下: dbtest_212.113.74.23 = (DESCRIPTION = (ADDRESS_LIST = (A ...

  8. delphi自定义事件处理

    http://www.cnblogs.com/ywangzi/archive/2012/09/06/2673414.html delphi自定义事件处理 为什么我们点击按钮,就会执行按钮的onclic ...

  9. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...

  10. RADStudio连接MySQL_使用FireDac(Delphi)在Firebird中创建数据库

    我最近从AnyDac改为FireDac(8.0.5.3365).我们正在运行Delphi 2006. 当我使用此组件的AnyDac版本时,我可以通过执行以下操作来创建新数据库. 设置我的连接 fCon ...

最新文章

  1. Python培训:Python有哪些函数?你了解几种?
  2. 常用的Linux服务器各项性能指标查看方法!
  3. hud-1495--非常可乐 VS nyoj-21--三个水杯
  4. java web mvc 拆分_JAVA WEB初接触——简单的MVC架构
  5. AMD推Radeon HD 7790显卡 性价比突出下月开卖
  6. 转hdmi_苹果本轻松接大屏,毕亚兹雷电接口转HDMI/VGA转换器评测
  7. asp.net core 依赖注入问题
  8. 随心所欲学Java,起步-心理安慰
  9. matlab对有周期性噪声的图像去噪,数字图像中去除周期性噪声研究.doc
  10. Android中在SurfaceView上高效绘图
  11. chr() 、ord()
  12. 清华学霸尹成Python爬虫视频 [MP4] (33.96G)
  13. IT项目管理追踪表格
  14. 什么是内存对齐以及作用
  15. python三阶魔方_三阶魔方自动求解及动态可视化matlab代码
  16. 浅析安全架构中遇到的问题
  17. Maven的下载与配置 和在IDEA中创建Maven的项目
  18. select()函数的作用
  19. JAVA中的二维数组的定义及使用
  20. 2017 Material design 第三章第三节《图像》

热门文章

  1. 多层PCB的叠层板材
  2. 编写有效的事条指导原则
  3. 【数据挖掘笔记九】分类:高级方法
  4. Java应用梯度下降求解线性SVM模型参考代码
  5. qlineedit文本改变时_行文本编辑框QLineEdit及自动补全
  6. 视图——概述 || 创建或者修改视图 || 查看视图 || 删除视图
  7. DevExpress- XPO入门(1)
  8. [YTU]_2566( 虚基类练习:动物)
  9. 8.2 matlab曲线对象和曲面对象(曲线对象、曲面对象、光照处理、图形对象的反射特性)
  10. Kth Largest Element in an Array