- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安网站维护基地 来源:黑客防线网安网站维护基地 浏览次数:0本篇关键词:Delphi
|
2.1.8.2 过程和函数的标题
每一个过程或函数都以标题开始,其中包括过程或函数的名称和它使用的参数。过程以保留字procedure开始,函数以保留字function开始。参数位于括号里面,每一个参数以分号分隔。例如:
procedure validateDate(Day : Integer; month : Integer; Year : Integer);
您也可以将相同类型的参数组合在一起,则上述过程头写作:
procedure ValidateDate(Day, Month, Year : Integer);
函数在标题中还多了一项:返回值的类型。下面是一个返回值为Double型的函数标题:
function CalculateInterest(principal,InterestRate:Double):Double;
2.1.8.3 函数和过程中的类型说明
一个过程或函数程序模块也含有说明部分和语句部分。说明部分可以包括类型说明、变量说明、常量说明等。除了Object Pascal语言中已经定义的类型之外,Delphi的应用程序还可以建立新的数据类型。类型说明部分有保留字type开始。下面是一些类型的说明:
type
Tcount = Integer;
TPrimaryColor = (Red,Yellow,Blue);
TTestIndex = 1..100;
TTextValue = -99..99;
TTestList = array [TTestIndex] of TTestValue;
TCharVal = Ord('A')..Ord('Z') ;
Today = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,
Sunday) ;
在类型标识符后面,用“=”号定义了新的类型。类型界定了变量的取值范围,例如,TCount类型的变量必须是整形值;一个TPrimaryColor类型的变量只能是red、yellow或blue等等。每一个类型的名称都是由字母T开始,这并非必须的,但它是Delphi的惯例,在区别类型名和标识符时非常有用。类型说明可以是局部的,也可以是全局的。如果您把它放在implementation后面,则表明对于库单元来讲,它是全局的,所有的事件处理过程和其他的过程、函数都可以调用它。如果类型是在过程中被说明的,则是局部的,离开这一过程,该类型将失效。
一般来讲,在过程和函数中,任何类型说明都在变量说明之前,而任何变量说明都在常量之前。但是,只要遵从说明必须在过程与函数的标题之后,而且在程序代码之前,即是有效的。
2.1.8.4 过程和函数的语句部分
过程或函数的语句部分由begin开始,end结束。函数需要一个返回值。可以将返回值赋给函数名称,也可以将返回值赋给Result变量。下面的例程将返回值赋给函数名称:
function CalculateInterest(Principal,InterestRate: Double):Double;
begin
CalculateInterest := 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。下文的例程是一个递归调用的典型例子:
…
implementation
var
alpha:Integer;
procedure Test2(var A:Integer):forword;
{Test2被说明为前置过程}
procedure Test1(var A:Integer);
begin
A :=A-1;
if A>0 then
test2(A); {经前置说明,调用未执行的过程Test2}
writeln(A);
end;
procedure Test2(var A:Integer);{经前置说明的Test2的执行部分}
begin
A :=A div 2;
if A>0 rhen
test1(A); {在Test2中调用已执行的过程Test1}
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
Alpha := 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);
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中的输入值。形参和实参占用不同的内存地址,在过程或函数被调用时,将实参的值复制到形参占用的内存中。因此出了过程或函数后,形参和实参的数值是不同的,但实参的值并不发生变化。
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |