第4章Delphi过程与函数_第1页
第4章Delphi过程与函数_第2页
第4章Delphi过程与函数_第3页
第4章Delphi过程与函数_第4页
第4章Delphi过程与函数_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、青岛世隆创新软件科技有限公司- 平台开发部 学习培训文档第四章 过程与函数Pascal中的例程有两种形式:过程(Procedure)和函数(Function)。理论上说,过程是你要求计算机执行的操作,函数是能返回值的计算。两者突出的不同点在于:函数能返回计算结果,即有一个返回值,而过程没有。两种类型的例程都可以带多个给定类型的参数。例子(一过程两函数):(1)procedure Hello;begin ShowMessage ('Hello world!');end; (2)function Double (Value: Integer) : Integer;begin Dou

2、ble := Value * 2;end;/ or, as an alternative(3)function Double2 (Value: Integer) : Integer;begin Result := Value * 2;end;4.1 过程运行结束后没有返回值的子程序称为过程。在Delphi7中有三种类型的过程:即标准过程、事件过程和自定义过程。 其中标准过程和自定义过程又可以称为通用过程。即这两种过程可以独立于事件,被任何过程或函数调用。4.1.1 标准过程 标准过程是系统内部已经定义好的过程,不需要编写代码,也不能改变过程的名称和参数。标准过程的调用非常简单,在需要调用的位置

3、直接书写该过程即可 。4.1.2 事件过程当对象接受到某个动作时,Windows会通知Delphi产生一个事件(鼠标单击事件),而Delphi会自动执行该对象与该事件有关的一段程序,这就是该对象的一个事件过程。1事件过程的创建在窗体上(或在对象监视器中)选中该对象,然后在对象监视器的事件(Event)选项卡中选择相应的事件名,用鼠标双击其右侧的下拉列表框,Delphi将自动产生一个默认的事件过程框架,执行该事件的代码需要添加在框架内。Delphi产生的默认事件过程的名称遵循下面的命名原则:控件名称加上事件类型名(无On) 。2事件过程调用已经创建完成的事件过程可以被其他事件过程调用 。4.1.

4、3 自定义过程一般自定义过程定义在单元的implementation部分的中$R *.dfm后面。1自定义过程声明一般声明格式如下:procedure <过程名> ( <形参表> ) ;局部声明begin <过程语句序列> end;过程的声明必须以procedure开始,包括过程名,形参表,局部声明部分和以begin开始end结束的过程语句序列。第一行必须以“;”分号结束,是过程首部。其余部分为过程的实现部分,必须包括一个begin-end结构。End后面也必须以“;”分号结束,表示过程结束。<形参表>过程参数的一般书写形式为:( Var |Co

5、nst <参数名>:<类型>)Var和Const为系统的保留字,Var表示参数传递方式为地址传递,即形参值的改变将反映到实参中。Const表示在过程内部不能改变形参的值。不带这两个参数的形参传递方式为值传递,即过程内部对形参值的改变将不会反映到实参中。过程的定义可以有类似下面的两种形式:procedure GetSum(V1,V2:Integer;var Sum:Int64);procedure ProcNoPara;2自定义过程的创建和使用 一般可以创建两种自定义过程。一种是仅能本单元中使用,对其他的单元文件该过程不可见;另外一种就是还可以在其他单元中使用的公共过程。

6、要创建能在其他单元中使用的过程,必须将过程首部声明在单元的公共接口部分(Interface)中。如果是仅在本单元内部使用的自定义过程,则必须先创建才能被使用 。 4.2 函数函数是有返回值的子程序,一般通过函数名或一个系统预定义的隐含变量Result返回函数的值。在Delphi中有两种函数,内部函数和自定义函数。 4.2.1标准函数标准函数是系统内部已经定义好的函数。不能改变标准函数的参数以及返回值类型。其定义形式如下:function StrToInt(const S: string): Integer; 表明该函数接受一个常量参数,并返回一个整型值。4.2.2 自定义函数1函数的定义一般的

7、语法格式为:Function <函数名> (<形参表>):返回类型;局部声明Begin<语句序列>End ;自定义函数含有一个以Function开始的函数首部,包括函数名,函数的形参表和函数的返回值类型以及返回值类型前面的“:” 冒号和后面的“;”分号。一个函数可以没有形参表,但必须有函数返回值类型, 同样也可以没有局部声明,但必须有一个实现函数功能的函数体,以Begin开始,End结束。在End后也必须有一个“;”分号表示函数体的结束。2自定义函数的创建和使用对于仅在本过程内部使用的函数,必须遵循先创建在使用的原则。如果想让一个函数对其他的单元也是可见的,

8、则必须将函数首部定义在单元的接口部分。则函数功能的实现和调用之间的位置就不必遵循先创建再使用的规则。同样也需要使用一个与函数的返回值类型相同的变量来接受函数的返回值。4.3 内部过程和函数内部函数和过程是指定义在一个过程和函数内部,只能由该过程和函数使用的函数和过程,内部程序又称为程序嵌套。1嵌套层次为了准确地表达嵌套层次,通常将嵌套从外向内进行编号,并把相应子程序的层号称为子程序的嵌套深度。一般单元文件为0层,其中的子程序从外向内依次为1层、2层、3层、。 有嵌套关系的子程序,若层号相差为1,称为相邻层,并称层号小的为外层子程序,层号大的为内层子程序;若层号相差大于1,则称为隔层。 子程序的

9、嵌套要求外层子程序能够完全包含内层子程序,不允许局部包含,即不允许交叉。2子程序的调用规则Delphi中,子程序调用必须遵循如下规则: (1)子程序可以调用其相邻内层的子程序,不能隔层调用。如图4-4所示,A1可以调用A1B和A1C但不能调用A3。(2)内层子程序可以调用外层的子程序而且允许隔层调用。如A2B可以调用A2,A3调用A1(3)同一层的子程序,允许后定义的子程序调用先定义的子程序,如A2C可以调用A2B但是A2B不可以调用A2C。(4)如果需要调用同层中后定义的子程序,必须用保留字forward(超前引用)对后面的子程序提前说明。4.4 参数的传递4.4.1 形式参数与实际参数形式

10、参数是指出现在过程或者函数首部“形参表”中的变量名,表示用于接收数据的变量。实际参数是指在调用过程或是函数时,传递给过程或函数的常量、变量或表达式。在过程或是函数的定义中,使用形式参数来确定该过程或函数所需要的参数的个数、类型以及参数之间的次序。在调用该过程或是函数时,实际参数将替换形式参数,形参和实参之间的对应关系为:第一个形参接受第一个实参的值,第二个形参接受第二个实参的值,依次类推。4.4.2 参数的传递方式在Delphi中,有两种参数的传递方式,“按值传递”和“按地址传递”。在过程或者函数的首部“形参表”中的参数前面使用系统的保留字Var或者Out的形参变量表示为“按地址传递”,使用C

11、onst或没有任何保留字的形式参数,将使用“按值传递”的方式。声明为“按值传递”的参数仅负责得到实际参数的值,不保留内部对该参数的改变,而声明为“按地址传递”的参数将保留函数或过程内部对实际参数值的改变,并在调用结束后返回该值。“按地址传递”的参数实参和形参的类型必须一致,而“按值传递”的实参和形参之间仅需要赋值相容即可。4.4.3 使用缺省参数在声明函数或过程中,可以给形参指定一个缺省的值,在调用时,如果没有给形参指定实参,则系统自动使用缺省的值,如果赋值,则使用实际参数的值。缺省参数声明的方法是在形参的类型后面使用“=”等号,并给出具体的常量值。但是需要注意的是,如果后面的参数没有使用缺省

12、参数,不允许仅对前面的参数使用缺省参数。 procedure MessBox (Msg: string; Caption: string = 'Warning' Flags: LongInt = mb_OK or mb_IconHand);begin Application.MessageBox (PChar (Msg), PChar (Caption), Flags);end;使用这一定义,你就可以用下面任一种方式调用过程:MessBox ('Something wrong here!');MessBox ('Something wrong here!

13、', 'Attention');MessBox ('Hello', 'Message', mb_OK);从下图中可以看到,Delphi的代码参数提示条会用不同的风格显示确省值参数,这样你就很容易确定哪个参数是可以省略的。 4.4.4 赋值兼容与调用约定赋值兼容是指变量可以进行赋值或进行参数传递。当两个类型要进行赋值操作而又不满足赋值兼容时,将产生编译错误。Object Pascal 提供了五种过程和函数的调用方式,分别为Register,Pascal,Cdecl,Stdcall,SafeCall。缺省的调用方式是Register方式。 R

14、egister和Pascal调用方式传递参数是从左到右,而Cdecl, Stdcall和 Safecall 调用方式传递参数则是从右到左。 Register调用方式自动清除调用所使用的堆栈和寄存器,负责处理调用错误,同时也是速度最快的调用方式。 4.5 变量的作用域变量的作用域是指变量可以被识别的范围。4.5.1 公有变量和私有变量一般Delphi的单元具有下面的结构unit 单元名 /单元首部interface /单元接口部分implementation /单元实现部分 end. /单元结束 在单元的接口部分(Interface)声明的变量属于公有变量,不仅可以被本单元中的所有过程和函数使用,同时还可以被其他单元中的过程和函数使用。在单元的实现部分后声明的变量属于私有变量,不能被其他单元使用。 4.5.2 全局变量和局部变量局部变量是指在过程或函数的内部声明的变量;而定义在单元的实现部分的变量,对整个单元内部的过程和函数都是有效的,是全局变量。公有变量也是全局变量。当全局变量和局部变量的名称相同时,在过程和函数的内部,使用的是局部变量的值。4.5.3 变量的存储方式从空间上来讲,全局变量的作用范围是整个程序,局部变量仅在本程序段内部有效。从变量的存储时间上来看,全局变量是静态存储,局部变量是动态存储。所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论