能的 函数体,以Begin开始,End结束。在End后也 必须有一个“;”分号表示函数体的结束。 2.自定义函数的创建和使用 对于仅在本过程内部使用的函数,必须遵循 先创建在使用的原则。如果想让一个函数对其他 的单元也是可见的,则必须将函数首部定义在单 元的接口部分。则函数功能的实现和调用之间的 位置就不必遵循先创建再使用的规则。同样也需 要使用一个与函数的返回值类型相同的变量来接 受函数的返回值。
4.3 内部过程和函数
内部函数和过程是指定义在一个过程和函数 内部,只能由该过程和函数使用的函数和过程, 内部程序又称为程序嵌套。 1.嵌套层次 为了准确地表达嵌套层次, 通常将嵌套从外向内进行 编号,并把相应子程序的 层号称为子程序的嵌套深度。 一般单元文件为0层,其中的子程序从外向内依次 为1层、2层、3层、…。
Unit 0层 A1 1层 A2 2层
A3 3层
图4-3 嵌套层次关系图
运行界面图
有嵌套关系的子程序,若层号相差为1,称为相 邻层,并称层号小的为外层子程序,层号大的为 内层子程序;若层号相差大于1,则称为隔层。 子程序的嵌套要求外层子程序能够完全包含内层 子程序,不允许局部包含,即不允许交叉。 2.子程序的调用规则 Delphi中,子
程序调用必须遵循如下规则: (1)子程序可以调用其相邻内层的子程序,不能隔 层调用。如图4-4所示,A1可以调用A1B和A1C 但不能调用A3。 (2)内层子程序可以调用外层的
子程序而且允许
隔层调用。如A2B可以调用A2,A3调用A1 (3)同一层的子程序,允许后 定义的子程序调用先定义的 子程序,如A2C可以调用A2B 但是A2B不可以调用A2C。 (4)如果需要调用同层中后定 义的子程序,必须用保留字 forward(超前引用)对后面 的子程序提前说明。
Unit 0层 A1 1层 A1B 2层 A3 3层 A1C 2层 A2 1层 A2B 2层 A2C 2层
图4-4 子程序的调用规则
4.4 参数的传递
4.4.1 形式参数与实际参数 形式参数是指出现在过程或者函数首部“形 参表”中的变量名,表示用于接收数据的变量。 实际参数是指在调用过程或是函数时,传递给过 程或函数的常量、变量或表达式。 在过程或是函数的定义中,使用形式参数来 确定该过程或函数所需要的参数的个数、类型以 及参数之间的次序。在调用该过程或是函数时, 实际参数将替换形式参数,形参和实参之间的对 应关系为:第一个形参接受第一个实参的值,第 二个形参接受第二个实参的值,依次类推。
4.4.2 参数的传递方式 在Delphi中,有两种参数的传递方式,“按值 传递”和“按地址传递”。在过程或者函数的首 部“〈形参表〉”中的参数前面使用系统的保留 字Var或者Out的形参变量表示为“按地址传 递”,使用Const或没有任何保留字的形式参数, 将使用“按值传递”的方式。 声明为“按值传递”的参数仅负责得到实际 参数的值,不保留内部对该参数的改变,而声明 为“按地址传递”的参数将保留函数或过程内部 对实际参数值的改变,并在调用结束后返回该值。
“按地址传递”的参数实参和形参的类型必 须一致,而“按值传递”的实参和形参之间仅需 要赋值相容即可。 4.4.3 使用缺省参数 在声明函数或过程中,可以给形参指定一个 缺省的值,在调用时,如果没有给形参指定实参, 则系统自动使用缺省的值,如果赋值,则使用实 际参数的值。缺省参数声明的方法是在形参的类 型后面使用“=”等号,并给出具体的常量值。 但是需要注意的是,如果后面的参数没有使 用缺省参数,不允许仅对前面的参数使用缺省参 数。
4.4.4 赋值兼容与调用约定 赋值兼容是指变量可以进行赋值或进行参数 传递。当两个类型要进行赋值操作而又不满足赋 值兼容时,将产生编译错误。 Object Pascal 提供了五种过程和函数的调用 方式,分别为Register,Pascal,Cdecl, Stdcall,SafeCall。缺省的调