delphi中的对象其实也是一种指针

原创 2007年10月10日 13:14:00

 谈谈Delphi中的类和对象
1.登不了大雅之堂地理解几个概念
   说到类和对象,我们不能不提及这样几个概念:类,对象,实例。就我个人觉得可
以这样来理解:对象指的是泛称,自然界的任何实体都可以看成一个对象;而类则是
以这些对象某些特征而分成的一系列的种类;实例则是特指属于某一个类的一个对象。
好啦,这些大道理我就不用多说了。不如来一个“背道而驰”的作法,我们用Delphi
code 来阐述这些外国人提出的一些令我们中国人不好理解的概念吧:
var
  ABtn:TButton;
义ABtn是属于TButton类的一个对象,但ABtn不能说是一个实例,因为它还没有
创建,所以我们说这是定义了一个对象,如果说定义了一个实例,多多少少有
些不够确切。:)
begin
  ABtn:=TButton.Create(Self);//创建一个TButton的实例
  ABtn.Caption:=对象;
  ABtn.Free;
end;

2.对象是一个地地道道的指针
   从物理角度来看,对象就是一段地址空间,这段地址空间的标志就是我们定义的
类“变量”。所以我们可以把对象看成一个类的指针。大家知道,要访问一个指针就
必须对指针初始化。对象的既然是一个指针,也必须对它进行初始化。如何初始化呢?
还是说指针的初始化吧。对于一个指针可以有以下两种方法来进行初始化:
(一)直接分配
var
  Pint:^Integer;
begin
  new(Pint);
  Pint^:=12;
  Dispose(Pint);
end;
(二)指向别的已分配空间的变量
var
  Pint:^Integer;
  i:integer;
begin
  i:=12;
  Pint:=@i;
end;
有趣的是,对象这种“指针”也有两种方法初始化
(一)直接分配
var
  AForm:TForm;
begin
  AForm:=TForm.Create(Self);
  AForm.ShowModal;
  AForm.Free;
end;
(二)指向别的已分配空间的实例
var
  AForm:TForm;
begin
  AForm:=Self;
  AForm.Caption:=知道了吗?为什么会这样呢;
end;
file://这个AForm和它所指向的Form实例共用同一段地址单元,所有对AForm操作都将反应
file://到它所对应的Form实例之上。
说到这,我们就很好解释为什么过程(函数)的对象参数传递时,象这样这的格式:
(一)procedure SetEdit(var Edit:TEdit);
    begin
      Edit.Text:=11;
    end;

(二)procedure SetEdit(Edit:TEdit);
    begin
      Edit.Text:=11;
    end;
效果是一样的了。(一)是把一个TEdit实体作为参数引用的形式进行参数传递,(二)是
把一个TEdit的对象“指针”作为参数传递。

3.类可以理解成一种特殊的数据类型
    我们知道数据类型可以进行强制类型转化,类即然可以理解成一种数据类型,那
么它也应该可以进行类类型转。比方如下代码为一个按钮(Button1)的单击事件:
(一)
procedure TForm1.Button1Click(Sender: TObject);
var
  ACaption:String;
begin
  ACaption:=TButton(Sender).Caption;//Sender从TObject转化到TButton
  ShowMessage(Format(You clicked %s !,[ACaption]));
end;
在这段代码中,Sender是一个TObject型对象,我们把它强制转化为TButton类型。如你
看得不清楚,可以参照一下我们通常的数据类型的转化:
(二)
procedure TForm1.Button1Click(Sender: TObject);
var
  S_Str:String;
  P_Str:PChar;
begin
  S_Str:=I love China!;
  P_Str:=PChar(S_Str);
  S_Str:=;
  S_Str:=String(P_Str);
  ShowMessage(S_Str);
end;
但是在面对对象的程序设计过程中,强调的是安全性,如(一)的强制类型转化存在着不
安全性。如下的代码,依然是写Button1.OnClick事件:
(三)
procedure TForm1.Button1Click(Sender: TObject);
begin
  TCanvas(Sender).Brush.Color:=clRed;
end;
执行一下,就会出错。这样岂不是违背了面对对象的程序设计的宗旨了吗?没有,即然
是类,就应该有类特定的类强制转化方法,改(三)的方法如下:
(四)
procedure TForm1.Button1Click(Sender: TObject);
begin
  (Sender as TCanvas).Brush.Color:=clRed;
end;//用as来转化,as就可以把错误抓住,不会影响程序的正常运行。
说到这我顺便提一下VB吧,如果学过VB的人可能觉得其中的控件数组比较爽,尤其是在
编写象计算器这样的程序时。但Delphi给我们什么呢?答案是Delphi也能快速简洁的开
发出这样的程序。如是操作:在窗体上放一个Edit和十个Button,把Button.Caption分
别设为0,1,2,...9,然后写一个按钮的OnClick事件如下:
(五)
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:=Edit1.Text+(Sender as TButton).Caption;
end;
把别的Button的OnClick事件都关联到Button1Click上,运行程序。拍拍手!这样计算器
程序的雏形就具备了。我们用Delphi的类类型转化,开发出来类似VB中的控件数组功能
的程序也是很棒的嘛!:)

 

Delphi可视化精讲视频教程

-
  • 1970年01月01日 08:00

Delphi下使用指针的简单总结

1:指针的赋值。   type RTestInfo = record Age:Integer; end; PtestInfo = ^ RtestInfo; var Test1,Test2:...
  • zisongjia
  • zisongjia
  • 2017-07-27 10:50:20
  • 695

Delphi 中将对象作为参数传递的使用

Delphi 中将对象作为参数传递的使用 举例分析2009-07-24 13:40 下面的单击事件,将要调用一个以对象为参数的方法,并将结果显示出来。procedure TForm1.btn1Clic...
  • diligentcat
  • diligentcat
  • 2010-04-19 08:06:00
  • 2375

Delphi对象和指向对像的指针

http://blog.sina.com.cn/s/blog_4ca032c301000a7m.html delphi程序片断如下:             aobj1   :=  ...
  • az44yao
  • az44yao
  • 2015-07-31 09:57:11
  • 1511

Delphi类与对象的概念

1.类(Class),是一个包含字段(Field,也称为域)、方法(Method)和属性(Property)(事件(Event)是一种特殊的属性)三种成员的构造体。2.对象即类的实例,是使用构造函数(...
  • CKLi
  • CKLi
  • 2007-07-05 23:57:00
  • 2332

Delphi 对象的创建(create)与释放(free/destory)

create后一定要free吗? 简单举例  procedure   a;  var   x:TX;  begin      x:=TX.create;      //do   som...
  • Renruyi666
  • Renruyi666
  • 2016-10-01 14:51:38
  • 2251

真正的Delphi面向对象编程(一)

一.实现商业对象 封装了商业规则的类是真正面向对象编程的基础这篇文章我们会涉及程序设计的各个方面,并对质疑一些我们写Delphi程序的惯用方式。这些设计方法背后的基础概念是封装:设计一组清楚定义接口(...
  • haydnliu
  • haydnliu
  • 2004-01-06 22:12:00
  • 3039

delphi 对象与类类型

对象与类类型   从用户角度考虑,用户并不需要了解面向对象编程,就可编写Delphi应用程序。当用户在建立新窗体,添加新构件以及处理事件时,大部分相关代码会由Delphi自动产生。但是,知道语言...
  • hcwp2008
  • hcwp2008
  • 2014-03-23 14:32:22
  • 783

关于DELPHI中的类对象以及类指针简单探讨总结。

      最近用DELPHI写程序,发现了DELPHI类对象引用时,有个需要特别注意的地方,故总结如下,与大家分享。有讲的不对的地方,还请不吝斧正。              首先:我们定义一个类,...
  • wbcp2000
  • wbcp2000
  • 2006-11-15 15:30:00
  • 2343

Delphi对象指针小结

1 一个对象指针指向的一个对象的数据区,该数据区前面4个字节是一个指针,指向的是大名鼎鼎的VMT,其实是Self的地址,代码如下: procedure TForm1.btn3Click(Sender...
  • rainychan2009
  • rainychan2009
  • 2012-06-07 22:54:25
  • 1583
收藏助手
不良信息举报
您举报文章:delphi中的对象其实也是一种指针
举报原因:
原因补充:

(最多只允许输入30个字)