Delphi中的类和对象--转自CSDN

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

谈谈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中的控件数组功能
的程序也是很棒的嘛!:)

4.抽象类和它的实例
    Delphi中有一种类为抽象类,你不能天真的直接为它创建一个实例。如:TStrings
类。如下代码:
(一)
var
  StrLst:TStrings;
begin
  StrLst:=TStrings.Create;
  StrLst.Add('I love Japan!');
  StrLst.Free;
end;
这是不对的。那如何为诸如TStrings这样的抽象类构造实例呢?答案是借助它的非抽
象子类。我们知道TStrings有一个TStringList非抽象子类。我们就可以这样作:
(二)
var
  StrLst:TStrings;
begin
  StrLst:=TStringList.Create;//借助其子类的构造器,对StrLst进行子类化
  StrLst.Add('I love China!');
  StrLst.Free;
end;
(三)
var
  StrLst:TStringList;
begin
  StrLst:=TStringList.Create;
file://放弃吧,不要再用抽象类,完全用它的“儿子”来你的事吧 
  StrLst.Add('I love China!');
  StrLst.Free;
end;

5.类是一种对数据和操作高度的封装机制
(一)数据封装
unit Unit2;

interface
type
  TEmployee=class
  private
    FName:String;
  public
    Constructor Create;
    function  GetName:String;
    procedure SetName(AName:String);
  end;
implementation

{ TEmployee }

constructor TEmployee.Create;
begin
  FName:='BlazingFire';
end;

function TEmployee.GetName: String;
begin
  Result:=FName;
end;

procedure TEmployee.SetName(AName: String);
begin
  FName:=AName;
end;

end.
如上代码,我们就用了一个过程SetName和一个函数GetName对私有变量FName进行完全的
封装。我们要对FName操作就只有这样:
uses
  unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
  AEmployee:TEmployee;
begin
  AEmployee:=TEmployee.Create;
  AEmployee.SetName('Rose');//利用SetName来设置FName
  MessageBox(Handle,PChar(AEmployee.GetName),'Empoyee',0);
  file://用GetName来访问FName
  AEmployee.Free;
end;
(二)操作封装
unit Unit2;

interface
type
  TDivision=Class
  public
    file://多态性让你的程序更据有“柔韧性”
    function GetDiv(Num1,Num2:Double):Double;overload;
    function GetDiv(Num1,Num2:integer):integer;overload;
  end;
implementation

{ Division }

function TDivision.GetDiv(Num1, Num2: Double): Double;
begin

Delphi程序员的Python爬虫初体验:用Python4Delphi轻松抓取CSDN博客内容 本文为Delphi开发者介绍了如何利用Python4Delphi组件库,在熟悉的Delphi环境中无缝集成Python能力,实现网页抓取功能。文章以抓取CSDN博客内容为例,详细讲解了从环境搭建、编写Python爬虫脚本到Delphi端数据接收与展示的完整流程,展示了两种技术栈融合的实践方法,帮助传统桌面应用扩展现代网络数据处理能力。 阅读详情

相关推荐

比较VCDelphi

比较VCDelphi Visual C++与Delphi之比较"最近在CSDN的论坛上的讨论非常火热,本文将以一个程序员的角度,从技术水平、功能、性能、易用性、稳定性、发展历程前景等方面,以Visual C++6Delphi5为代表,尽可能客观地比较介绍Visual C++Delphi这两大主流开发工具的优缺点,其中将涉及到语言、应用框架、控件、编译连接、集成界面、调试、COM、数据库

hhhfff2010的专栏 1686

Delphi 基础知识:对象

具有严格保护可见性的成员在它们被声明的中是可见的,在任何子中也是可见的,不管它在哪里被声明。一个的实例不能访问同一个的其他实例中的严格私有或严格保护的实例成员。一个被保护的成员在其被声明的模块中的任何地方都是可见的,也可以从任何子中看到,不管子出现在哪个模块。受保护的方法可以被调用,受保护的字段或属性可以被读写,可以从属于声明受保护成员的的任何方法的定义中调用。在声明的开头没有指定可见性的成员默认为公开的,只要该是在{$M+}状态下编译的,或者是从{$M+}状态下编译的派生的;

sensor_WU 博客 2598

Delphi 基础知识 2】定义的几种形式

type// 基本定义private// 私有成员protected// 受保护成员public// 公有成员// 构造函数// 析构函数override;// 成员方法end;上述是一个简单的定义,包含私有、受保护公有成员,以及构造函数、析构函数一个成员方法。

记录日常技术经验 864

Delphi对象指向对像的指针

http://blog.sina.com.cn/s/blog_4ca032c301000a7m.html delphi程序片断如下:             aobj1   :=   TMyClass1.Create(1,2);         aobj2   :=   TMyClass1.Create(3,4);         aobj1   :=   aobj2;  

az44yao的专栏 2657

delphi自定义大体描述

delphi,自定义的大体描述. 刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富、强大的VCL(可视化构件库)。仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容 易地做出一个有实用价值的程序,真是令人激动。但是,VCL只是Delphi的一小部分,Delphi的优秀远远不只是表现在VCL上。如果你仅仅停留在 使用VCL这一阶段,那么你永远也不可能成为一个真正的Delphi高手。记住,...

yygyyygy1233的博客 881

Delphi中的对象

                   谈谈Delphi中的对象1.登不了大雅之堂地理解几个概念   说到对象,我们不能不提及这样几个概念:对象,实例。就我个人觉得可以这样来理解:对象指的是泛称,自然界的任何实体都可以看成一个对象;而则是以这些对象某些特征而分成的一系列的种;实例则是特指属于某一个的一个对象。好啦,这些大道理我就不用多说了。不如来一个“背道而驰”的作法,我们用Del

blazingfire的专栏 1144

DELPHI面向对象支持特点--保护级成员的应用

今天在CSDN论坛里面游逛,发现这样的一个帖子《刚才看到一位武林高手的几行精妙代码,百思不得其解,希望各位指点》,本着向各大武林高手学习的态度,我看完了整个帖子,发现内容甚为经典,记录于此,作个总结:  type  TStringGridEx = class(TStringGrid);procedure TForm1.Button1Click(Sender: TObject);begin  if

LiangGH的专栏 1912

Delphi简介

Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurbo Pascal”,最早的版本由美国Borland(宝兰)公司于1995年开发。主创者为Anders Hejlsberg。经过数年的发展,此产品也移至Embarcadero公司旗下。Del...

CSDN1332531529的博客 1200

delphi结构体c++结构体_使用Delphi声明C++带函数的结构体实战 good

typedef structtagRecord{intval;intgetvalplus(){val++;returnval;}}TRecord, *PRecord;带函数的结构体!面对这个面目狰狞的家伙,我开始无所适从,狂在GOOGLE、BAIDU里通过关键字“Delphi 带函数的记录型”、“Delphi C++ 结构体 函数”、“Delphi record function”......

weixin_39890102的博客 379

掌握DELPHI多线程技术:实战指南

在计算机科学中,多线程(Multithreading)是一种编程范式,允许一个程序中包含两个或多个部分同时执行,这些部分被称为线程。每个线程可以视为独立的执行路径,它们共享程序的全局数据,但具有自己的调用栈程序计数器。多线程能够提升应用程序的性能,允许在等待I/O操作或处理慢速任务时,CPU继续执行其他线程。

weixin_42612804的博客 1135

Delphi制作DLL的方法

自:http://blog.csdn.net/FlyHope2005/archive/2004/10/14/136004.aspx用Delphi制作DLL的方法一 Dll的制作一般步骤二 参数传递三 DLL的初始化退出清理[如果需要初始化退出清理]四 全局变量的使用五 调用静态载入六 调用动态载入七 在DLL建立一个TForM八 在DLL中建立一个TMDIChildForM九 示例:

CrazyCock的专栏 1531

CSDN问答:Delphi中如何保存Webbrowser中的页面到图片

procedureGenerateJPEGfromBrowser(browser:iWebBrowser2;jpegFQFilename:string;srcHeight:integer;srcWidth:integer;tarHeight:integer;tarWidth:integer);varsourceDrawRect:TRect;targetDrawRect:TRect;sourceB...

爱.NET 960

delph mysql结构体,Delphi中的结构体与

结构体与的概述结构体可以看作轻量级的。从使用的方式上讲,结构体定义了便可直接使用,而必须创建该对象才可使用。从内存的管理上讲,结构体对内存的占用是由应用自动维护的,而则需要手动创建该对象,当我们不再需要时要手动释放。注意:相比轻量级的结构体,重量级的可以有更复杂的功能,同时更加地体现面向对象的思想。结构体与的定义结构体与的定义使用的关键字不同,分别是:record、clas...

weixin_34270007的博客 142

Delphi也可以这样写

版权声明:本文由Lyris完成,首发于CSDN,作者保留中文版权。未经许可,不得使用于任何商业用途。欢迎载,但请保持文章及版权声明完整。如需联络请发邮件:lyricsoft@gmail.comtype  TDemo = class    aa: string;    bb: string;  end;  使用的时候with TDemo.Create dotry  aa := test;  b

Lyris的专栏 1036

Delphi高手突破》初稿目录

这是我的新书的初稿的目录,写了近半年时间,可以说很辛苦,不过也感觉很值得,只是心中一直惴惴不安,恐怕辛苦换不来成果。很高兴CSDN上很多朋友期待这本书,于是在完成初稿后,想立刻大家分享一些。注意:正式稿的目录可能与这个目录还有细微差异。本书主题相关的,如果您还想要加入什么内容,请告诉我,谢谢。本书第一章全文,可在这里看:http://www.csdn.net/Expert/To

Nicrosoft的专栏 1665

Delphi2010发布日,请CSDN走开!!!

Delphi2010即将在8月25日发布,这是易博龙易主Borland以来拿出最有说服力的作品。之前的D2009,开发阶段进入了尾声,易博龙才收购了Borland整个开发产品线的作品,除了ECO。由于发行过于仓促,D2009直到打了第四个补丁才稳定下来。而D2010是在D2009的第四个补丁分支上开发,整个开发过程让全球开发人员参与beta版本测试与体验,产品日趋稳定,备受赞誉。    这么大好的

219

剖析Delphi中的构造析构

版权声明 请尊重原创作品。载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”主站点地址,方便其他朋友提问指正。 剖析Delphi中的构造析构1 Delphi中的对象模型:21.1 对象名表示什么?21.2 对象存储在哪里?21.3 对象中存储了什么?它们是如何存储的?32 构造函数与创建对象52.1 什么是构造函数?(“特殊的”方法)52.2 对象的创建的全...

buliedian 216

Delphi实现对注册表的监视扫描[]

声明:CSDN以外的任合团体个人载本文必须注明出处作者。 Delphi自带的TRegistry只能实现注册表的基本操作,如果我们要实时监视注册表的变化或者扫描注册表特定项下的所有子项,TRegistry就无能为力了。我啃了半天SDK,终于实现了Delphi对注册表的监视与扫描,不敢独享,拿来献给广大的Delphi爱好者。 监视注册表相关项的改变要用到一个AP...

120

Delphi模式编程

Delphi模式编程

qqrrjj2011的博客 1508
上一篇: delphi压宿Access数据库
下一篇: SQL学习笔记!
Vsun
博客等级 码龄23年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值