




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章 Delphi面向对象的编程方法(三)2.1.8.4 过程和函数的语句部分 过程或函数的语句部分由begin开始,end结束。函数需要一个返回值。可以将返回值赋给函数名称,也可以将返回值赋给Result变量。下面的例程将返回值赋给函数名称:function CalculateInterest(Principal,InterestRate: Double):Double;beginCalculateInterest := Principal * InterestRate;end; 将返回值赋给Result变量也是可以的,则上面的程序改为:Result := Principal*InterestRate; 下面是这个函数的调用方法:InterestEarned :=CalculateInterest(2000,0.012); 在Implementation后面的过程和函数,可以且只能被此库单元的事件处理过程使用。要让过程和函数可以被其他的程序库单元使用,则需要将过程或函数的标题部分放在库单元中的interface部分,而把含标题的整个过程或函数放在库单元的inplementation部分,并在要访问这个过程或函数的库单元的uses子句中加入说明这个过程或函数的库单元名称。2.1.8.5 函数的递归调用 在Object Pascal中,过程或函数必须先说明再调用。上文的NoValue函数必须在使用它的事件处理过程之前说明和执行,否则程序会报告一个未知标识符的错误。 以上规则在递归调用时是例外情况。所谓递归调用,是指函数A调用函数B,而函数B又调用函数A的情况。在递归调用中,函数要进行前置,即在函数或过程的标题部分最后加上保留字forword。下文的例程是一个递归调用的典型例子:implementationvaralpha:Integer; procedure Test2(var A:Integer):forword;Test2被说明为前置过程procedure Test1(var A:Integer);beginA :=A-1;if A0 thentest2(A); 经前置说明,调用未执行的过程Test2writeln(A);end; procedure Test2(var A:Integer);经前置说明的Test2的执行部分beginA :=A div 2;if A0 rhentest1(A); 在Test2中调用已执行的过程Test1 end;procedure TForm1.Button1Click(Sender:TObject);beginAlpha := 15; 给Alpha赋初值Test1(Alpha); 第一次调用Test1,递归开始end; 按钮的OnClick事件处理过程给Alpha赋初值,并实现先减1再除2的循环递归调用,直到Alpha小于0为止。2.1.8.6 过程和函数的参数 当您的程序代码在调用一个过程或函数时,通常用参数传递数据到被调用的过程或函数中。最常用的参数有数值参数、变量参数和常量参数三种。 由被调用过程或函数定义的参数为形参,而由调用过程或函数指明的参数叫实参。在NoValue函数中,说明函数体中的AnEditBox是形参,而调用时在if NoValue(Edit1)中,Edit1是实参。 数值参数在运行过程中只改变其形参的值,不改变其实参的值,即参数的值不能传递到过程的外面。试看下面的例程:procedure Calculate(CalNo:Integer);beginCalNo := 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。例如:procedure Calculate(var CalNo : Integer); 则CalNo并不在内存中占据一个位置,而是指向实参Number。当一个变参被传递时,任何对形参所作的改变会反映到实参中。这是因为两个参数指向同一个地址。将上一个例程中过程头的形参CalNo前面加上var,再以同样的程序调用它,则在第二个编辑框中会显示计算的结果,把第一个编辑框中的数值放大十倍。这时形参CalNo和实参Number的值都是Nnmber初始值的10倍。 如果当过程或函数执行是要求不改变形参的值,最保险的办法是使用常量参数。在参数表的参数名称前加上保留字const可以使一个形参成为常量参数。使用常量参数代替数值参数可以保护您的参数,使您在不想改变参数值时不会意外地将新的值赋给这个参数。2.1.9 定义新的数据类型 Object Pascal有一些系统预定义的数据类型,在2.1.2中已经对它们作了介绍。您可以利用这些数据类型以建立新的数据类型来满足程序的特定需要。下面简单地叙述了您能建立的主要数据类型,如枚举型、子界型、数组型、集合型、记录型、对象型等。2.1.9.1 枚举类型 一个枚举型的说明列出了所有这种类型可以包括的值:typeTdays=( Sunday ,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); 可以定义上述枚举类型的变量:varDayOfWeek:TDays; 在枚举型中,括号中的每一个值都有一个由说明它的位置决定的整形值。例如Sunday有整形值0,Monday有整形值1等。您可以把DayOfWeek说明为一个整形变量,并将一星期的每一天赋一个整形值以达到相同的效果,但用枚举型会使得程序可读性好,编写容易。当您在枚举型中列出值时,您同时说明了这个值是一个标识符。例如您的程序中如果已经含有TDays类型且说明了DayOfWeeks变量,则程序中便不能使用Monday变量,因为它已经被说明为标识符了。 2.1.9.2 子界类型 子界型是下列这些类型中某范围内的值:整形、布尔量、字符型或枚举型。在您想限制一个变量的取值范围时,子界型是非常有用的。type Thours = 0.23;TValidLetter = A . F;TDays = ( Sunday ,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); 枚举型TWorkDay = Monday.Friday; 一个TDays型的子界 子界型限定了变量的可能取值范围。当范围检查打开时,(在库单元的Implementation后面有$R*.DFM字样表示范围检查打开,否则您可以在Options|Project|Complier Options中选择Range Cheking来打开范围检查),如果变量取到子界以外的值,会出现一个范围检查错误。2.1.9.3 数组类型 数组是某种数据类型的有序组合,其中每一个元素的值由其相对位置来指定,您可以在数组的某个位置上放置数据,并在需要时使用这些数据。下面的类型说明了一个Double型的数组变量:varCheck : array 1.10 of Double; 它表示Check指向一个含有10个Double型元素的数据串列,代表每一个元素的是1到10之间的数字,称为索引。数组的每一项由数组名称加上中的索引来表示。Check包含10个变量,Check1表示第一个变量。您也可以把数组定义成类型:typeTCheck = array1.10 of Double;则变量说明改为:varCheck :TCheck; 您可以通过给数组赋值等方法来使用数组。下面的语句将0.0赋给Check数组中的所有元素:for J := 1 to 10 doCheckJ := 0.0; 数组也可以是多维的,下面的类型定义了一个20行、20列的数组。typeTtable = array1.20,1.20 of Double;vartable1:TTable; 想将这一表格的所有数据初始化为0.0,您可以使用for循环:varCol,Row:Integer;for Col :=1 to 20 dofor Row := 1 to 20 doTable1Col,Row := 0.0;2.1.9.4 字符串类型 字符串类型事实上是一个一维的字符数组。当您说明一个字符串型的变量时,您应当指明这个字符串的大小,下面是说明字符串类型的例子:typeMyString: string15;varMyName: MyString; 则变量MyName被说明成为最多可以包含15个字符。如果您没有说明字符串的大小,Delphi会认为字符串包含最大值255个字符。给字符串赋值可以直接使用单引号括起的字串赋值:MyName := Frank.Smith;或MyName := 张明; 因为MyName是一个可以包含15个字符的MyString型变量,上文的两个的变量都是有效的,一个汉字可以视作两个字符。当您给字符串型变量赋的值多于定义数值时,例如将MyName赋为FrankSmith.Franklin,则Delphi只会接受前15个字符FrankSmith.Fran。在内存中,字符串通常占用比所说明的大小多一个字节的空间,因为第一个位置是一个包含这个数组大小的字节。您可以使用索引值来访问字符串的字符,MyName1可以得到MyName的第一个字符F。 您可以使用Delphi丰富的运算符、过程和函数来处理字符串型的变量和属性。下面介绍几个常用的运算符和Delphi过程或函数: Concat和(+)功能相同,都可以将多个字符串组合在一起,建立一个较大的字符串;Copy会返回一个字符串中的子字符串;Delete在一个字符串中从一个指定位置起删除一定数目的字符;Insert在一个字符串中插入一个字符串;Length返回字符串的长度;Pos返回一个子字符串在一个字符串中的位置,即索引值。2.1.9.5 集合类型 集合类型是一群相同类型元素的组合,这些类型必须是有限类型如整形、布尔型、字符型、枚举型和子界型。在检查一个值是否属于一个特定集合时,集合类型非常有用。下面的例程可以说明集合类型的用法: 在窗体上加入一个编辑框和一个按钮,清除编辑框中的文字,在其上加上Caption为“输入元音”的标签Label,并在编辑框的下方加入一个空的标签,将按钮的Default属性改为True,建立按钮的事件处理过程如下:procedure TForm1.Button1Click(Sender:TObject);typeTvowels=set of Char;varVowels:TVowels;beginVowels := a,e,i,o,u;if Edit1.Text1 in Vowels thenLable2.Caption := 是元音;elseLable2.Caption := 请再试;end; 执行这个程序,在编辑框中输入字母,表达式Edit1.Text1 in Vowels的结果是布尔型的,in是运算符,用来判断字母是否存在于集合中。输入的判别结果会显示在编辑框的下方。以上就用到了集合类型TVowels。2.1.9.6 记录类型 记录是您的程序可以成组访问的一群数据的集合。下面的例程说明了一个记录类型的用法:typeTEmployee=recordName : string20;YearHired:1990.2000;Salsry: Double;Position: string20;end; 记录包含可以保存数据的域,每一个域有一个数据类型。上文的记录TEmployee类型就含有四个域。您可以用以下的方式说明记录型的变量:varNewEmployee,PromotedEmployee:TEmployee; 用如下的方法可以访问记录的单域:NewEmployee.Salary := 1000;编写如下的语句可以给整个记录赋值:with PromotedEmployee dobeginName :=;YearHired := 1993;Salary := 2000.00Position := editor;end; 您的程序可以将记录当成单一实体来操作:PromptEmployee := NewEmployee; 以上介绍了用户常用的自定义类型。在Delphi的编程中,对象是非常重要的用户自定义数据类型。象记录一样,对象是结构化的数据类型,它包含数据的域(Field),也包含作为方法的过程和函数。在Delphi中,当您向窗体中加入一个部件,也就是向窗体对象中加入了一个域;每一个部件也是对象,每当您建立一个事件处理过程使得部件可以响应一个事件时,您即自动地在窗体中加入了一个方法。在本章第2节中,将详细讲述Delphi面向对象编程的方法和技巧。2.1.10 Object Pascal的库单元Unit Units是常量、变量、数据类型、过程和函数的集合,而且能够被多个应用程序所共享。Delphi已经拥有许多预定义的程序库单元可供您建立您的程序库单元使用。Delphi的Visual Component Library由多个程序库单元组成,它们说明了对象、部件以供您的应用程序用来设计用户界面。例如,当您在窗体中加入一个Check Box时,Delphi自动在您的程序库单元中加入了Stdctrls库单元,因为TCheckBox部件是在StdCtrls库单元中说明的。 当您设计您的窗体时,Delphi自动建立一个和您的窗体有关的库单元。您的库单元不必都和窗体有关,也可以使用预定义的只包含数学运算函数的库单元,或是自行编写数学函数库单元。在一个库单元中所有的说明都相互有关系,例如,CDialogs程序库单元包含了在您的应用程序中使用的普通对话框的所有说明。2.1.10.1 Object Pascal程序库单元的结构 不管一个库单元是否和一个窗体有关,库单元的结构都是相同的。其结构如下:unit interfaceuses 公有说明implementationuses 私有说明过程和函数的执行部分 initialization 选择性的选择性的初始化程序end.2.1.10.2 程序库单元的接口部分 interface是库单元的接口部分,它决定了本库单元对其他任何库单元或程序的可见(可访问)部分。您可以在接口部分说明变量、常量、数据类型、过程和函数等等。Delphi在您设计窗体的库单元中,将窗体数据类型、窗体变量和事件处理过程都说明在这一部分。 interface标志库单元接口部分的开始。在interface中的说明对要使用这些说明的其他库单元或应用程序是可见的。一个库单元可以使用其他Unit的说明,只需要在uses子句中指明那些库单元即可。例如,您在库单元A中编写程序代码,且您想调用UnitB于interface部分说明的程序。您可以把库单元B的名称加入到A的interface部分的uses子句中,则任何A中的程序都可以调用B中说明的程序。而且,如果B中interface部分的uses子句中出现C库单元,尽管A中未曾出现C,A同样可以调用B、C库单元在interface中说明的程序。但如果B出现在A的interface部分的uses子句中,那么库单元A便不能出现在B的interface的uses子句中。因为这样会产生对库单元的循环访问。当试图编译时,会产生出现错误信息。2.1.10.3 程序库单元的实现部分 实现部分implementation中包含interface中说明的过程、函数、事件处理过程的具体实现程序代码。这一部分可以有自己的额外说明,但这些说明是私有的,外部程序不能调用这些说明。在interface中说明的函数实体必须在implementation部分出现,可以使用标题简写:只输入procedure或function保留字,后面跟过程或函数的名称即可,其后则是程序的实现部分了。如果您在implementation部分说明任何常式,其标题并未出现在interface部分,则必须写全其标题部分。 在implementation部分的uses子句中指定的库单元,只供给本库单元的程序使用其interface中说明的程序。其他使用本库单元的库单元,不能访问这些在implementation的udes子句中库单元的说明,因为在implementation后进行的库单元包含是私有的。所以上例中,如果C出现在B的implementation部分,则A不能使用C的公有部分,除非C出现在A的uses子句中。在implementation中出现的循环访问是Delphi所允许的,如果A的implemetation的uses子句中出现B,则B的implementation部分也可以出现A。2.1.10.4 程序库单元的初始化部分 初始化当前库单元所使用的数据,或是通过interface部分将数据提供给其他应用程序、库单元使用时,您可以在库单元中加入一个initia
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 揭阳职业技术学院《电磁场与天线A》2023-2024学年第二学期期末试卷
- 2025至2031年中国户外硅橡胶绝缘子跌落式熔断器行业投资前景及策略咨询研究报告
- 《美容护肤与造型》课件
- 2025至2031年中国亚克力标准板行业投资前景及策略咨询研究报告
- 2025至2030年中国黄樟精油数据监测研究报告
- 小区红色物业施工方案
- 2025至2030年中国铂铱管数据监测研究报告
- 2025至2030年中国软宝数据监测研究报告
- 2025至2030年中国芳纶数据监测研究报告
- 2025至2030年中国淀粉过滤机数据监测研究报告
- 2023年高考真题-语文(天津卷) 含答案
- 小学二年级-心理健康教育-10-我能坚持-教学课件
- 2024光伏发电工程施工质量验收规程
- 电池制造工(电池(组)装配工)行业职业技能竞赛理论考试题库及答案
- 国家职业技术技能标准 4-01-06-01 电子商务师S 人社厅发202233号
- 山东省自然科学基金申报书-面上项目
- 鞣制化学题库
- 基于“三新”背景下的2025届新高考物理复习备考策略-课件
- 2024人防工程设计指南医疗救护工程分册
- 2024年海洋知识竞赛题库及答案(共70题)
- 应急管理数据标准化与共享
评论
0/150
提交评论