换一批

Delphi

Delphi是著名的Borland(现在已和Inprise合并)公司开发的可视化软件开发工具。Delphi被称为第四代编程语言,它具有简单、高效、功能强大的特点。

经验文章 概述
Delphi是著名的Borland(现在已和Inprise合并)公司开发的可视化软件开发工具。“真正的程序员用c,聪明的程序员用Delphi”,这句话是对Delphi最经典、最实在的描述。Delphi被称为第四代编程语言,它具有简单、高效、功能强大的特点。和VC相比,Delphi更简单、更易于掌握,而在功能上却丝毫不逊色;和VB相比,Delphi则功能更强大、更实用。可以说Delphi同时兼备了VC功能强大和VB简单易学的特点。它一直是程序员至爱的编程工具。

基本信息

外文名称

Delphi

发布时间

1995年

类    别

编程语言

发布单位

美国Borland(宝兰)公司

作    者

安德斯·海尔斯伯格

基本介绍

Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurbo Pascal”,最早的版本由美国Borland(宝兰)公司于1995年开发。

详细介绍

Delphi由Borland公司推出的Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了MicrosoftWindows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编译器、最为领先的数据库技术。

对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。

Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3.x、Windows95、WindowsNT、WindowsXP、Windows Vista、Windows7等环境下使用。当前,Delphi 也可以在LINUX平台上开发应用,其在LINUX上的对应产品Kylix。

Delphi 拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言ObjectPascal和基于部件的开发结构框架。Delphi它提供了500多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。

“真正的程序员用c,聪明的程序员用Delphi”,这句话是对Delphi最经典、最实在的描述。Delphi被称为第四代编程语言,它具有简单、高效、功能强大的特点。和VC相比,Delphi更简单、更易于掌握,而在功能上却丝毫不逊色;和VB相比,Delphi则功能更强大、更实用。可以说Delphi同时兼备了VC功能强大和VB简单易学的特点。它一直是程序员至爱的编程工具。Delphi具有以下的特性:基于窗体和面向对象的方法,高速的编译器,强大的数据库支持,与Windows编程紧密结合,强大而成熟的组件技术。但最重要的还是Object Pascal语言,它才是一切的根本。Object Pascal语言是在Pascal语言的基础上发展起来的,简单易学。

Delphi提供了各种开发工具,包括集成环境、图像编辑(Image Editor),以及各种开发数据库的应用程序,如DesktopDataBase Expert等。除此之外,还允许用户挂接其它的应用程序开发工具,如Borland公司的资源编辑器(Resourse Workshop)。

在Delphi众多的优势当中,它在数据库方面的特长显得尤为突出:适应于多种数据库结构,从客户机/服务机模式到多层数据结构模式;高效率的数据库管理系统和新一代更先进的数据库引擎;最新的数据分析手段和提供大量的企业组件。

发展历程

1995 1.0 支持16位Windows开发。基于框架(VCL)的,可拖曳、可视化的开发环境

1996 2.0 以32位编译器为核心,支持C/S数据库开发

1997 3.0 语法:加入接口(Interface)的机制。IDE:首次提供了(Code Insight)

1998 4.0 语法:加入动态数组和方法覆盖等支持。IDE:增强调试能力,提供代码模板

1999 5.0 增强了IDE和调试器,提供了TeamSource。简化Internet的开发,增强数据库支持

2001 6.0 提供了Web Service。跨平台的Kylix 1.0和CLX

2002 7.0 提供了.NET的过渡,增强的Internet开发(IntraWeb),完善数据库支持,增加了Indy网路元件和Rave Report资料库报表,并且支援UML及XP的程式制作。

2003 8.0 单纯的for .NET版本,拥有C#的能力,保留了Delphi的易用性(业内视为一个过渡版本)

2004 9.0 正式名称:Delphi 2005。语法:加入了inline及for in loop等功能。IDE:把Borland Delphi. Net、Borland Delphi Win32、Borland C#、Enterprise Core Objects等环境和功能集成成一个开发工具,因此可以在Win32和.NET开发环境中切换或同时进行

2005 10.0 发布名称:Borland Developer Studio(BDS) 2006。集成C++ Builder; ECO(Enterprise Core Objects)升级到ECO III; 集成Together for Delphi,可以在同一个IDE中进行UML开发;QA Audits和QA Metrics可以快速的把握专案的设计和代码的质量。

2006 Turbo Borland将BDS 2006拆分成几个独立的版本(Delphi for win32、Delphi for .net、C#、C++ Builder),而且不能同时安装两个不同的版本。由于Borland的IDE生产部份独立成为一家名为codegear的公司,所以这个版本是以Borland名义推出的最后一个版本。

2007 11.0 正式名称:CodeGear RAD Studio - Delphi 2007。

2008 5.7 Borland正式宣布将CodeGear子公司出售给Embarcadero(易博龙)技术公司。

2008 8.25 Embarcadero发布CodeGear Delphi 2009 Pre-release版。

2009 8.25 Embarcadero发布CodeGear.RAD.Studio.2010版

2010.8.30 Embarcadero 发布 Delphi XE(又名Delphi 2011,代号为Fulcrum)

2011.1.27 Embarcadero公司宣布成立一个新的精简版Delphi Starter Edition,是在爱好者和谁得到一个稍微简化的功能集为一个小的创业公司的价格,旨在可用性。

版本更新

注 FM = 可用于 FM 应用平台 VCL = 可用于VCL

Delphi 2009中新增内容

Unicode FM VCL功能区控件VCLRobust项目管理FM VCL重要的DataSnap 升级FM VCL泛型和匿名方法FM VCL

Delphi 2010中新增内容

构建已启用触碰和手势支持的应用FM VCLWindows 7支持FM VCLIDE内视FM VCLdbExpress可连接到Firebird 数据库FM VCL已添加到Delphi语言的扩展 RTTI(反射)FM VCL

Delphi XE中新增内容

用DataSnap进行扩展的多层开发FM VCL额外的附带工具(CodeSite Express、IP*Works、Beyond Compare Differ)VCL针对Azure和Amazon的云计算支持FM VCLIDE中的Subversion 集成FM VCL正则表达式FM VCL

Delphi XE2中新增内容

针对Windows的64位 Delphi编译器FM VCLFireMonkey应用平台 - 利用一个代码库创建多平台、多设备应用FM用FireMonkey 创建Windows 和Mac OS X桌面应用FMDataSnap移动连接器FM VCLLiveBindings引擎FM VCLFastReport报表工具FM VCL

Delphi XE3中新增内容

Windows 8支持FM VCL通过Metropolis UI,将Windows 现代化的外观融入到您的应用中FM VCLOS X Mountain Lion和Retina 显示支持FM可视化的LiveBindings FM VCL增强的FireMonkey样式、音频/视频和3D FM修复和功能增强FM VCL

Delphi XE4中新增内容

通过Delphi iOS ARM编译器、工具链、全新可视化开发环境和针对iOS的控件,开发iOS 应用FMIBLite数据库可用于iOS,带有不受限的部署许可证FMFireDAC – 功能强大、快速且简单的数据访问FM VCLFireMonkey传感器对位置、方向和运动的支持FMFireMonkey框架和全新的 TListView组件 FMOS X全屏模式FM修复和功能增强FM VCL

Delphi XE5中新增内容

开发Android应用FM针对Android 和iOS的全新移动组件FMREST客户端支持,以访问基于云端的 RESTful web服务(在专业版和更高级版本中)FM VCLFireDAC已集成到Delphi安装,并且核心组件已包括在专业版中FM VCL针对Android的IBLite数据库,并带有不受限的部署许可证FM开发iOS 7 应用FM修复和功能增强FM VCL

Delphi XE6中的新增内容

应用Tethering组件扩展您的现有Windows应用到移动,无需一定要移植您的整个Windows应用。选择对移动有意义的特性,并轻松地与您的现有 Windows应用进行交互。连接您的桌面(VCL 和FMX)应用和移动应用。为您的VCL应用创建移动伙伴应用。通过Wi-Fi 和在您的本地网络上工作。 将来的版本会支持蓝牙。任务栏组件通过预览内的按钮控件,组件可用于显示您的应用中可选择的多个窗口预览。自动或自定义预览。在任务栏按钮中显示您的应用的进度。在任务栏按钮上叠加图标。云端服务(BaaS)与用于Kinvey和Parse的组件进行集成与领先的后端即服务(BaaS)提供者集成,以添加功能特性和平台服务到您的移动应用。您可以轻松地访问云端中的公共服务,无需一定要您自己构建或维护后端服务。在任意设备和平台上使用推送通知来吸引您的用户。访问云端中的数据和对象存储。用户身份认证。在XE5中已引入的 REST客户端支持上构建。通过公共的API组件集,支持流行的BaaS 提供者、Kinvey和Parse。全新的VCL 样式赋予您的应用一个现代化的Windows或自定义外观。包括Windows 手写板样式。支持Windows 7 和Windows 8。完全样式化您的应用,包括菜单和边框。VCL传感器组件即使对于使用全新 Windows平板电脑像Surface Pro的Windows用户来说,传感器也无处不在。现在您的 Delphi应用可以添加位置、运动和其他特性。从运行在Windows平板电脑上的VCL应用访问设备传感器。加速计、GPS和回转仪功能。内置购买和内置广告功能移动应用是应用开发人员的收入产生良机。现在通过集成内置购买功能和广告,您可以将您的移动应用兑换成现金。iOS 和Android上的销售内容、功能、服务和订阅。支持顶部广告网络(Google AdMob和Apple iAd)。创建用于Google眼镜的应用用delphi进行的多设备应用开发现在已延伸到PC、平板电脑、和智能手机外,到可穿戴设备。 创建可运行在Google 眼镜上的Android应用。带有已优化Google眼镜的外观和分辨率的全新自定义样式。Google眼镜设备设计器模板。可访问性使您的应用对大多数用户来说更易于使用,包括使用屏幕阅读器软件的那些用户。针对FM 桌面应用的全新可访问性特性。支持 Windows上的JAWS 和Mac OS X上的VoiceOver。质量、性能和稳定性获取最好的开发经验,并为您的用户交付最佳的用户体验。解决了超过 2,000个已报告的问题。增强了所有平台上的总体应用运行时性能。核心和数据库特性贯穿于产品的核心增强。数据库和FireDAC 增强、FDMemTable。用于FireDAC 的数据库浏览器。Apache支持(WebBroker)。DirectX 11标题。DataSnap性能和更新向导。RTL重构和功能增强。FireDAC Informix驱动程序更新。Apache C++支持。

特点特性

Delphi发展至今,从Delphi1、Delphi2到现在的Delphi2011,不断添加和改进各种特性,功能越来越强大。Delphi5开始添加了对IDE(集成开发环境)的很多改进新特性,扩展了数据库支持(ADO和InterBase数据库),带有Internet支持的MIDAS改进版,TeamSouse版本控制工具,转换功能,框架概念以及很多的新组件与新特性。

Delphi 6.0是Borland公司推出的一套无论是界面还是功能都近乎完美的应用程序开发工具。与以前的Delphi版本相比,Delphi 6.0使用更简便,效率也更高。

Delphi 7.0Delphi 7.0使用更简便,效率更高,最稳定的一个版本,被称为开发人员的工具之最,也是Borland产品最顶峰时期,更是风靡全球。

Delphi2010内置的Direct 2D模块及开发库,其新加的功能:拥有一个能同时运作于x86和x64的IDE,在此IDE下将会有跨平台编译器,能够编译用于linux和MAC的应用程序;将会支持windows7下的触摸式编程;强化的DataSnap;将支持云计算;将支持函数式编程,这需要很多时间,据David估计是2011会实现。

Delphi XE2实现了跨平台通用开发,通过Delphi XE2所带的FireMonkey平台,Delphi可以开发跨平台应用程序,并原生编译到Windows和Mac OS X平台。FireMonkey还可以为iPhone、iPod Touch和iPad创建iOS应用,并分发到苹果公司的应用商店。Delphi的FireMonkey应用程序拥有完全的硬件加速。

特点

(1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。

(2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输量,提高了应用处理的速度。

(3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。

(4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。

(5)具有强大的数据存取功能。它的数据处理工具BDE(BorlandDatabaseEngine)是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。Delphi既可用于开发系统软件,也适合于应用软件的开发。

(6)拥有强大的网络开发能力,能够快速的开发B/S应用,它内置的IntraWeb和ExpressWeb使得对于网络的开发效率超过了其他任何的开发工具。

(7)Delphi使用独特的VCL类库,使得编写出的程序显得条理清晰,VCL是现在最优秀的类库,它使得Delphi在软件开发行业处于一个绝对领先的地位。用户可以按自己的需要,任意的构建、扩充、甚至是删减VCL,以满足不同的需要。

(8)从Delphi8开始Delphi也支持.Net框架下程序开发。

当前DELPHI 已经成为一个品牌,而不仅仅是一个开发平台或开发语言的名称。当前DELPHI产品已经由CodeGear公司继续发展,该公司是BORLAND公司的全资子公司。当前,CodeGear为广大开发者提供了DELPHI FOR PHP,以高度可视化的方式全面支持面向对象的PHP 网站开发,大大提高了PHP开发网站的代码复用程度,成为WEB应用开发的新利器。

编程方法

Delphi的编程语言是以Pascal为基础的。Pascal语言具有可读性好、编写容易的特点,这使得它很适

合作为基础的开发语言。同时,使用编译器创建的应用程序只生成单个可执行文件(.EXE),正是这种结合,使得Pascal成为Delphi这种先进开发环境的编程语言。

本章中,将讨论ObjectPascal的主要特点,并讲解如何在事件处理过程和其他应用程序中,使用它来编制程序代码。本章将讲解Delphi应用程序中最常用的ObjectPascal语法,而不是Pascal语言的一切细节。如果您完全不熟悉Pascal编程,请参阅一些基础的Pascal教程。如果您具有编程经验,并能熟练地使用其他流行程序语言,您将在本章的ObjectPascal中发现一些相同的概念。如果您已经熟悉了BorlandPascal,就可以快速浏览或跳过本章。 

编写ObjectPascal程序代码 

在前边的章节中,通过例程,已经编写了几行简单的代码。在本章中,将从熟悉Pascal编程的角度,配合实例,讲解ObjectPascal编程的基该方法。

在编写自己的ObjectPascal程序时,要注意程序的可读性。Pascal语言是英式结构语言,在程序中选择合适的缩排、大小写风格,并在需要时将程序代码分行,会使得程序代码能够很容易地被自己和他人读懂。一般的程序员都有这样的体验:如果不给程序加上适当的注解,一段时间后,自己也难以理清程序的流程。给程序及时地加上注释是良好的编程习惯。Delphi的注释需要加注在{}之间,编辑器会把它们处理成为空白。Delphi保留了BorlandPascal编辑器的风格,关键字采用黑体字,被注释的部分会变暗,这使得编程风格良好,易读易写。

语句类型

赋值语句

在事件处理过程中,最常用到的工作就是把一个新值赋给一个属性或变量。在设计用户界面时,可以

使用ObjectInspector(ObjectInspector)来改变其属性;但有时需要在程序执行时改变属性的值,而且有些属性只能在执行时改变,这些属性在Delphi的在线帮助的“Proprety”主题中被标为执行期属性。进行这种改变,就必须使用赋值语句。

下文的赋值语句表征一个OnClick事件。当按钮按动后,将编辑框部件Edit1的Color属性置为clRed:

procedureTForm1.Button1Click(Sender:TObject);

begin

Edit1.Color:=clRed;

end; 

当按动按钮后赋值语句被执行,编辑框变成红色。

在语句中,部件的名称在属性前,中间用“.”表示属性的所属关系。这样就准确地指定了要将clRed值赋给哪一部件的哪一属性。赋值号为“:=”,不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。

当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应相同或兼容。一个属性或变量的类型定义了此属性或变量的可能值集合,也定义了程序代码可以执行的运算。在前边的例程中,编辑框部件的Color属性和clRed的类型都是TColor。可以在在线帮助中找到一个属性的类型;另外一种方法是在ObjectInspector中选定该属性值段,并按下F1键,则类型将在属性说明的结尾处列出,例如Color属性列出下边的语句: 

PropertyColor:TColor; 

有些属性是只读(ReadOnly)的,它们只能被读取,不能被改变。请查阅在线帮助,在Delphi中这些只读属性都有注解。 

标识符的说明与使用 

标识符是Delphi应用程序中一些量的名称,这些量包括变量(var)、常量(const)、类型(type)、过程(procedure)、方法(Method)及其他,ObjectPascal在应用标识符时,必须首先说明它们。ObjectPascal是强类型语言,它的编译器可以检查确保赋给变量或属性的值是正确的类型,以便于您改正错误。因为ObjectPascal是编译语言,所以Delphi的执行速度要比使用解释语言快得多。在使用标识符前说明它们,可以减少程序错误并增加代码的效率。 

变量

变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码执行时可以被改变。在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型。在所有变量说明以前加上保留字var。变量说明左边是变量的名称,右边则是该变量的类型,中间用(:)隔开。 

var

Value,Sum:Integer;

Line:String; 

在窗体中加入一个名称为Edit1的编辑框,再加入一个名称(属性Name)为Add的按钮部件,并建立如下的事件处理过程:

procedureTForm1.addClick(Sender:TObject);

var

X,Y:Integer;

begin

X:=100;

Y:=20;

Edit1.Text:=IntToStr(X+Y);

end; 

在本例中,当按动ADD按钮时,编辑框中显示值120。在ObjectPascal中,必须确保变量或属性被赋予类型相同或兼容的值。您可以尝试将赋给X的值改为100.0,或去掉IntToStr函数,在编译时会出现类型不匹配的错误,这也说明了ObjectPascal强类型语言的特点。

过程函数

过程与函数是程序中执行特定工作的模块化部分。Delphi的运行库包含许多过程与函数以供您的应用程序调用。您不必了解过程与函数的逻辑,但要知道过程与函数的用途。在对象中说明的过程和函数称为方法(Method)。所有的事件处理过程都是过程,以保留字procedure开头。每一个事件处理过程只包含了当这一事件发生时需要执行的程序代码。在事件处理过程中使用Delphi已经存在的过程与函数,只需在程序代码中调用它们即可。

函数使用

与过程一样,函数的程序代码也执行特定的工作。它和过程的差别为:函数执行时会返回一个值,而过程则没有返回值。函数可以用来赋给一个属性或变量;也可以使用返回值来决定程序的流程。前文中实际上已经接触过了函数。在讲述变量时,曾用到过下面的程序段:Edit1.Text:=IntToStr(X+Y);其中,IntToStr(Value)把一个LongInt类型的数值转化为字符串的值,Value是IntToStr唯一的参数,它可以是一个整形的值、变量、属性或产生整形值的表达式。调用函数,必须把返回值赋给和此返回值类型兼容的变量或属性。

有些函数返回一个True或False的布尔量,用户的程序可以根据返回值来决定跳转。下文的例程讲述了函数返回值为Boolean的判断用法:

在窗体中加入一个ColorDialog对象和一个Name属性为ChangeColor的按钮。为按钮的OnClick事件建立事件处理过程如下: 

procedureTForm1.ChangeColorClick(Sender:TObject);

begin

ifColorDialog1.Executethen

Form1.Color:=ColorDialog1.Color

else

Form1.Color:=clRed;

end; 

此事件处理过程使用一个返回Boolean值的Execute方法。按动按钮,并在颜色对话框中选择一个颜色。如果按动OK按钮,ColorDialog.Execute方法将返回True,则Form1.Color将被赋值为ColorDialog1.Color,窗体显现您选用的颜色;如果按动颜色对话框的Cancel按钮,方法将返回False值,窗体将变为红色。

跳转语句 

ObjectPascal的跳转语句有if和case两个。 

if语句

if语句会计算一个表达式,并根据计算结果决定程序流程。在上文的例程中,根据ColorDialog.Execute的返回值,决定窗体的背景颜色。if保留字后跟随一个生成Boolean值True或False的表达式。一般用“=”作为关系运算符,比较产生一个布尔型值。当表达式为True时,执行then后的语句。否则执行else后的代码,if语句也可以不含else部分,表达式为False时自动跳到下一行程序。

if语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin…end。else保留字前不能加“;”,而且,编译器会将else语句视为属于最靠近的if语句。必要时,须使用begin…end保留字来强迫else部分属于某一级的if语句。

case语句

case语句适用于被判断的变量或属性是整形、字符型、枚举型或子界型时(LongInt除外)。用case语句进行逻辑跳转比编写复杂的if语句容易阅读,而且程序代码整形较快。

下面的例程显示一个使用case语句的窗体:

建立如下的事件处理过程: 

procedureTForm1.Button1Click(Sender:TObject);

var

Number:Integer;

begin

Number:=StrToInt(Edit1.Text);

caseNumberof

1,3,5,7,9:Label2.Caption:='奇数';

0,2,4,6,8:Label2.Caption:='偶数';

10..100:

begin

Label2.Caption:='在10到100之间';

Form1.Color:=clBlue;

end;

else

Label2.Caption:='大于100或为负数';

end;

end; 

执行程序,当Edit1部件接受到一个值,并按动“OK”按钮触发程序后,Number便被赋值为用户输入的数值。case语句根据Number的值判断该执行哪一条语句。象if语句一样。case语句也有可选择的else部分。case语句以end结尾。

循环语句

ObjectPascal的循环语句有三种:repeat、while和for语句。 

repeat语句 

repeat语句会重复执行一行或一段语句直到某一状态为真。语句以repeat开始,以until结束,其后跟随被判断的布尔表达式。参阅以下的例程: 

i:=0;

repeat

i:=i+1;

Writeln(i);

until=10; 

当此语句被执行时,窗体的下方会出现1到10的数字。布尔表达式i=10(注意,与其他语言不同的是,“=”是关系运算符,而不能进行赋值操作)直到repeat..until程序段的结尾才会被计算,这意味着repeat语句至少会被执行一次。

while语句

while语句和repeat语句的不同之处是,它的布尔表达式在循环的开头进行判断。while保留字后面必须跟一个布尔表达式。如果该表达式的结果为真,循环被执行,否则会退出循环,执行while语句后面的程序。

下面的例程达到和上面的repeat例程达到同样的效果: 

i:=0;

whilei0then

test2(A);{经前置说明,调用未执行的过程Test2}

writeln(A);

end;

procedureTest2(varA:Integer);{经前置说明的Test2的执行部分}

begin

A:=Adiv2;

ifA>0rhen

test1(A);{在Test2中调用已执行的过程Test1}

end; 

procedureTForm1.Button1Click(Sender:TObject);

begin

Alpha:=15;{给Alpha赋初值}

Test1(Alpha);{第一次调用Test1,递归开始}

end; 

按钮的OnClick事件处理过程给Alpha赋初值,并实现先减1再除2的循环递归调用,直到Alpha小于0为止。

程序函数

程序代码在调用一个过程或函数时,通常用参数传递数据到被调用的过程或函数中。最常用的参数有数值参数、变量参数和常量参数三种。由被调用过程或函数定义的参数为形参,而由调用过程或函数指明的参数叫实参。在NoValue函数中,说明函数体中的AnEditBox是形参,而调用时在ifNoValue(Edit1)…中,Edit1是实参。

数值参数在运行过程中只改变其形参的值,不改变其实参的值,即参数的值不能传递到过程的外面。试看下面的例程: 

procedureCalculate(CalNo:Integer);

begin

CalNo:=CalNo*10;

end; 

用以下例程调用Calculate函数:

Number:=StrToInt(Edit1.Text);

Calculate(Number);

Edit2.Text:=IntToStr(Number);

Number接受由编辑框1输入的数值,经Calculate过程运算。它是一个数值型实参。在进入Calculate函数后,会把Number实参拷贝给形参CalNo,在过程中CalNo增大十倍,但并未传递出来,因此Number值并未改变,在编辑框2中显示仍然是编辑框1中的输入值。形参和实参占用不同的内存地址,在过程或函数被调用时,将实参的值复制到形参占用的内存中。因此出了过程或函数后,形参和实参的数值是不同的,但实参的值并不发生变化。如果您想改变传入的参数值,就需要使用变量参数,即在被调用程序的参数表中的形参前加上保留字var。例如:procedureCalculate(varCalNo:Integer); 

则CalNo并不在内存中占据一个位置,而是指向实参Number。当一个变参被传递时,任何对形参所作的改变会反映到实参中。这是因为两个参数指向同一个地址。将上一个例程中过程头的形参CalNo前面加上var,再以同样的程序调用它,则在第二个编辑框中会显示计算的结果,把第一个编辑框中的数值放大十倍。这时形参CalNo和实参Number的值都是Nnmber初始值的10倍。

如果当过程或函数执行是要求不改变形参的值,最保险的办法是使用常量参数。在参数表的参数名称前加上保留字const可以使一个形参成为常量参数。使用常量参数代替数值参数可以保护您的参数,使您在不想改变参数值时不会意外地将新的值赋给这个参数。

枚举类型

一个枚举型的说明列出了所有这种类型可以包括的值: type

Tdays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); 

可以定义上述枚举类型的变量:

var

DayOfWeek:TDays; 

在枚举型中,括号中的每一个值都有一个由说明它的位置决定的整形值。例如Sunday有整形值0,Monday有整形值1等。您可以把DayOfWeek说明为一个整形变量,并将一星期的每一天赋一个整形值以达到相同的效果,但用枚举型会使得程序可读性好,编写容易。当您在枚举型中列出值时,您同时说明了这个值是一个标识符。例如您的程序中如果已经含有TDays类型且说明了DayOfWeeks变量,则程序中便不能使用Monday变量,因为它已经被说明为标识符了。

子界类型

子界型是下列这些类型中某范围内的值:整形、布尔量、字符型或枚举型。在您想限制一个变量的取值范围时,子界型是非常有用的。 

type

Thours=0..23;

TValidLetter='A'..'F';

TDays=(Sunday,Monday,Tuesday,Wednesday,Thursday,

Friday,Saturday);{枚举型}

TWorkDay=Monday..Friday;{一个TDays型的子界} 

子界型限定了变量的可能取值范围。当范围检查打开时,(在库单元的Implementation后面有{$R*.DFM}字样表示范围检查打开,否则您可以在Options|Project|ComplierOptions中选择RangeCheking来打开范围检查),如果变量取到子界以外的值,会出现一个范围检查错误。

数组类型

数组是某种数据类型的有序组合,其中每一个元素的值由其相对位置来指定,您可以在数组的某个位置上放置数据,并在需要时使用这些数据。下面的类型说明了一个Double型的数组变量:

var

Check:array[1..10]ofDouble; 

它表示Check指向一个含有10个Double型元素的数据串列,代表每一个元素的是1到10之间的数字,称为索引。数组的每一项由数组名称加上[]中的索引来表示。Check包含10个变量,Check[1]表示第一个变量。您也可以把数组定义成类型:

type

TCheck=array[1..10]ofDouble;

则变量说明改为:

var

Check:TCheck; 

您可以通过给数组赋值等方法来使用数组。下面的语句将0.0赋给Check数组中的所有元素: 

forJ:=1to10do

Check[J]:=0.0;,

数组也可以是多维的,下面的类型定义了一个20行、20列的数组。

type

Ttable=array[1..20,1..20]ofDouble;

var

table1:TTable; 

,;,;想将这一表格的所有数据初始化为0.0,您可以使用for循环: 

var

Col,Row:Integer;

forCol:=1to20do

forRow:=1to20do

Table1[Col,Row]:=0.0;

字符串类型

字符串类型事实上是一个一维的字符数组。当您说明一个字符串型的变量时,您应当指明这个字符串的大小,下面是说明字符串类型的例子:

type

MyString:string[15];

var

MyName:MyString; 

则变量MyName被说明成为最多可以包含15个字符。如果您没有说明字符串的大小,Delphi会认为字符串包含最大值255个字符。给字符串赋值可以直接使用单引号括起的字串赋值: 

MyName:='Frank.Smith';

或MyName:='张明'; 

因为MyName是一个可以包含15个字符的MyString型变量,上文的两个的变量都是有效的,一个汉字可以视作两个字符。当您给字符串型变量赋的值多于定义数值时,例如将MyName赋为‘FrankSmith.Franklin’,则Delphi只会接受前15个字符‘FrankSmith.Fran’。在内存中,字符串通常占用比所说明的大小多一个字节的空间,因为第一个位置是一个包含这个数组大小的字节。您可以使用索引值来访问字符串的字符,MyName[1]可以得到MyName的第一个字符'F'。

可以使用Delphi丰富的运算符、过程和函数来处理字符串型的变量和属性。下面介绍几个常用的运算符和Delphi过程或函数:

Concat和(+)功能相同,都可以将多个字符串组合在一起,建立一个较大的字符串;Copy会返回一个字符串中的子字符串;Delete在一个字符串中从一个指定位置起删除一定数目的字符;Insert在一个字符串中插入一个字符串;Length返回字符串的长度;Pos返回一个子字符串在一个字符串中的位置,即索引值。

集合类型

集合类型是一群相同类型元素的组合,这些类型必须是有限类型如整形、布尔型、字符型、枚举型和子界型。在检查一个值是否属于一个特定集合时,集合类型非常有用。下面的例程可以说明集合类型的用法:在窗体上加入一个编辑框和一个按钮,清除编辑框中的文字,在其上加上Caption为“输入元音”的标签Label,并在编辑框的下方加入一个空的标签,将按钮的Default属性改为True,建立按钮的事件处理过程如下: 

procedureTForm1.Button1Click(Sender:TObject);

type

Tvowels=setofChar;

var

Vowels:TVowels;

begin

Vowels:=['a','e','i','o','u'];

ifEdit1.Text[1]inVowelsthen

Lable2.Caption:='是元音';

else

Lable2.Caption:='请再试';

end; 

执行这个程序,在编辑框中输入字母,表达式Edit1.Text[1]inVowels的结果是布尔型的,in是运算符,用来判断字母是否存在于集合中。输入的判别结果会显示在编辑框的下方。以上就用到了集合类型TVowels。

记录类型

记录是您的程序可以成组访问的一群数据的集合。下面的例程说明了一个记录类型的用法: 

type

TEmployee=record

Name:string[20];

YearHired:1990..2000;

Salsry:Double;

Position:string[20];

end; 

记录包含可以保存数据的域,每一个域有一个数据类型。上文的记录TEmployee类型就含有四个域。您可以用以下的方式说明记录型的变量: 

var

NewEmployee,PromotedEmployee:TEmployee;

用如下的方法可以访问记录的单域:

NewEmployee.Salary:=1000;

编写如下的语句可以给整个记录赋值: 

withPromotedEmployeedo

begin

Name:='';

YearHired:=1993;

Salary:=2000.00

Position:='editor';

end; 

您的程序可以将记录当成单一实体来操作: 

PromptEmployee:=NewEmployee;

以上介绍了用户常用的自定义类型。在Delphi的编程中,对象是非常重要的用户自定义数据类型。象记录一样,对象是结构化的数据类型,它包含数据的域(Field),也包含作为方法的过程和函数。在Delphi中,当您向窗体中加入一个部件,也就是向窗体对象中加入了一个域;每一个部件也是对象,每当您建立一个事件处理过程使得部件可以响应一个事件时,您即自动地在窗体中加入了一个方法。

编程相关

对象编程

Delphi是基于面向对象编程的先进开发环境。面向对象的程序设计(OOP)是结构化语言的自然延伸。OOP的先进编程方法,会产生一个清晰而又容易扩展及维护的程序。一旦您为您的程序建立了一个对象,您和其他的程序员可以在其他的程序中使用这个对象,完全不必重新编制繁复的代码。对象的重复使用可以大大地节省开发时间,切实地提高您和其他人的工作效率。 

什么是对象  

一个对象是一个数据类型。对象就象记录一样,是一种数据结构。按最简单的理解,可以将对象理解成一个记录。但实际上,对象是一种定义不确切的术语,它常用来定义抽象的事务,是构成应用程序的项目,其内涵远比记录要丰富。在本书中,对象可被理解为可视化部件如按钮、标签、表等。了解对象,最关键的是掌握对象的特性。一个对象,其最突出的特征有三个:封装性、继承性、多态性。 

对象的封装性  

对对象最基本的理解是把数据和代码组合在同一个结构中,这就是对象的封装特性。将对象的数据域封闭在对象的内部,使得外部程序必需而且只能使用正确的方法才能对要读写的数据域进行访问。封装性意味着数据和代码一起出现在同一结构中,如果需要的话,可以在数据周围砌上“围墙”,只有用对象类的方法才能在“围墙”上打开缺口。 

对象的继承性

继承性的含义直接而且显然。它是指把一个新的对象定义成为已存在对象的后代;新对象继承了旧类的一切东西。在往新对象中添加任何新内容以前,父类的每一个字段和方法都已存在于子类中,父类是创建子类的基石。 

对象的多态性

多态性是在对象体系中把设想和实现分开的手段。如果说继承性是系统的布局手段,多态性就是其功能实现的方法。多态性意味着某种概括的动作可以由特定的方式来实现,这取决于执行该动作的对象。多态性允许以类似的方式处理类体系中类似的对象。根据特定的任务,一个应用程序被分解成许多对象,多态性把高级设计处理的设想如新对象的创建、对象在屏幕上的重显、程序运行的其它抽象描述等,留给知道该如何完美的处理它们的对象去实现。

数据继承

前面的TForm1类型是很简单的,因为它只含有域Button1和方法Button1Click。但是在这个窗体上,您可以改变窗体的大小、加入或删除窗体的最大最小化按钮,或设置这个窗体为MDI界面。对于一个只包含一个域和方法的对象来讲,您并没有看到显式的支持程序。在窗体上单击鼠标或用ObjectInspector的上端的ObjectSelector选中Form1对象,按动F1查阅它的在线帮助,您会在Properties和Method中找到它的继承到的全部属性和方法。这些是在TForm类型中说明的,TForm1是TForm的子类,直接继承了它所有的域、方法、属性和事件。例如窗体的颜色属性Color就是在TForm中说明的。当您在工程中加入一个新窗体时,就等于加入了一个基本模型。通过不断地在窗体中加入部件,您就自行定义了一个新的窗体。要自定义任何对象,您都将从已经存在的对象中继承域和方法,建立一个该种对象的子类。例如对象TForm1就被说明为对象TForm的子类,拥有一个窗体部件的基本属性或方法。只有当您在窗体中加入了部件或编写了事件处理过程时,Form1才成为您自己的类型。

一个比较特殊的对象是从一个范围较广或较一般的对象中继承下来的,它是这个特别对象的祖先,这个对象则称为祖先的后代。一个对象只能有一个直接的祖先,但是它可以有许多后代。TForm是TForm1类型的祖先,所有的窗体对象都是TForm的后代。

用F1查阅窗体的在线帮助时,您会发现TForm被称为component(部件)。这是因为所有的部件都是对象。

在这个结构中所有的部件都是对象。部件类型TComponent从TObject类型中继承数据和程序代码,并具有额外的可以用作特殊用途的属性、方法、事件,所以部件可以直接和用户打交道,记录它的状态并存贮到文件中等等。控制类型TControl从TComponent中继承而来,又增加了新的功能,如它可以显示一个对象。在上图中,虽然TCheckBox不是直接由TObject继承来的,但是它仍然有任何对象所拥有的属性,因为在VCL结构中,TCheckBox终究还是从TObject中继承了所有功能的特殊对象,但它还有些自行定义的独到的功能,如可以选择记录状态等。

对象范围

一个对象的范围决定了它的数据域、属性值、方法的活动范围和访问范围。在一个对象的说明部分说明的数据域、属性值、方法都只是在这个对象的范围中,而且只有这个对象和它的后代才能拥有它们。虽然这些方法的实际程序代码可能是在这个对象之外的程序库单元中,但这些方法仍然在这个对象的范围内,因为它们是在这个对象的说明部分中说明的。

当您在一个对象的事件处理过程中编写程序代码来访问这个对象的属性值、方法或域时,您不需要在这些标识符之前加上这个对象变量的名称。例如,如果您在一个新窗体上加入一个按钮和一个编辑框,并为这个按钮编写OnClick事件处理过程: 

procedureTForm1.Button1Click(Sender:Tobject);

begin

Color:=clFuchsia;

Edit1.Color:=clLime;

end; 

其中的第一行语句是为整个窗体Form1着色。可以编写如下:

Form1.Color:=clFuchsia; 

但您可以不必加上Form1.,因为Button1Click方法是在TForm1对象的范围里。当您在一个对象的范围中时,您可以省略所有这个对象中的属性值、方法、域之前的对象标识符。但是当您编写第二个语句改变编辑框的底色时,因为此时您想访问的是TEdit1对象的Color属性,而不是TForm1类型的,所以您需要通过在属性前面加?指明,Delphi会象第一个语句一样,将窗体的颜色变成绿色。因为Edit1部件是在窗体中的,它是窗体的一个数据域,所以您同样不必指明其从属关系。

如果Edit1是在其他窗体中,那么您需要在编辑框之前加上这个窗体对象的名称了。例如,如果Edit1是在Form2之中,那它是Form2说明的一个数据域,并位于Form2的范围中,那么您需要将第二句改为: 

Form2.Edit1.Color:=clLime; 

而且需要把Unit2加入Unit1的uses子句中。    

相关文章

手机页面
收藏网站 回到头部