📄 008.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基础教程-->第二章 Delphi面向对象的编程方法(三)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基础教程 第二章 Delphi面向对象的编程方法(三)">
<META NAME="description" CONTENT=" - DELPHI基础教程 - 第二章 Delphi面向对象的编程方法(三)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" bgcolor="#e0e0e0"><strong><A HREF="009.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="007.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">第二章 Delphi面向对象的编程方法(三)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p>2.1.8.4 <font face="宋体" lang="ZH-CN">过程和函数的语句部分 </p>
</font><p><font face="宋体" lang="ZH-CN">
过程或函数的语句部分由</font>begin<font
face="宋体" lang="ZH-CN">开始,</font>end<font face="宋体" lang="ZH-CN">结束。函数需要一个返回值。可以将返回值赋给函数名称,也可以将返回值赋给</font>Result<font
face="宋体" lang="ZH-CN">变量。下面的例程将返回值赋给函数名称: </p>
</font><p>function CalculateInterest(Principal,InterestRate: Double):Double;</p>
<p>begin</p>
<p>CalculateInterest := Principal * InterestRate;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">
将返回值赋给</font>Result<font
face="宋体" lang="ZH-CN">变量也是可以的,则上面的程序改为: </p>
</font><p>Result := Principal*InterestRate; </p>
<p><font face="宋体" lang="ZH-CN">下面是这个函数的调用方法:</font></p>
<p>InterestEarned :=CalculateInterest(2000,0.012);</p>
<p><font face="宋体" lang="ZH-CN"> 在</font>Implementation<font
face="宋体" lang="ZH-CN">后面的过程和函数,可以且只能被此库单元的事件处理过程使用。要让过程和函数可以被其他的程序库单元使用,则需要将过程或函数的标题部分放在库单元中的</font>interface<font
face="宋体" lang="ZH-CN">部分,而把含标题的整个过程或函数放在库单元的</font>inplementation<font
face="宋体" lang="ZH-CN">部分,并在要访问这个过程或函数的库单元的</font>uses<font
face="宋体" lang="ZH-CN">子句中加入说明这个过程或函数的库单元名称。 </p>
</font><p>2.1.8.5 <font face="宋体" lang="ZH-CN">函数的递归调用 </p>
</font><p><font face="宋体" lang="ZH-CN"> 在</font>Object
Pascal<font face="宋体" lang="ZH-CN">中,过程或函数必须先说明再调用。上文的</font>NoValue<font
face="宋体" lang="ZH-CN">函数必须在使用它的事件处理过程之前说明和执行,否则程序会报告一个未知标识符的错误。</font></p>
<p><font face="宋体" lang="ZH-CN">
以上规则在递归调用时是例外情况。所谓递归调用,是指函数</font>A<font
face="宋体" lang="ZH-CN">调用函数</font>B<font face="宋体" lang="ZH-CN">,而函数</font>B<font
face="宋体" lang="ZH-CN">又调用函数</font>A<font face="宋体" lang="ZH-CN">的情况。在递归调用中,函数要进行前置,即在函数或过程的标题部分最后加上保留字</font>forword<font
face="宋体" lang="ZH-CN">。下文的例程是一个递归调用的典型例子: </p>
</font><p><font face="宋体" lang="ZH-CN">…</font></p>
<p>implementation</p>
<p>var</p>
<p>alpha:Integer; </p>
<p>procedure Test2(var A:Integer):forword;</p>
<p>{Test2<font face="宋体" lang="ZH-CN">被说明为前置过程}</font></p>
<p>procedure Test1(var A:Integer);</p>
<p>begin</p>
<p>A :=A-1;</p>
<p>if A>0 then</p>
<p>test2(A); {<font face="宋体" lang="ZH-CN">经前置说明,调用未执行的过程</font>Test2}</p>
<p>writeln(A);</p>
<p>end; </p>
<p>procedure Test2(var A:Integer);{<font face="宋体" lang="ZH-CN">经前置说明的</font>Test2<font
face="宋体" lang="ZH-CN">的执行部分}</font></p>
<p>begin</p>
<p>A :=A div 2;</p>
<p>if A>0 rhen</p>
<p>test1(A); {<font face="宋体" lang="ZH-CN">在</font>Test2<font face="宋体"
lang="ZH-CN">中调用已执行的过程</font>Test1} </p>
<p>end; </p>
<p>procedure TForm1.Button1Click(Sender:TObject);</p>
<p>begin</p>
<p>Alpha := 15; {<font face="宋体" lang="ZH-CN">给</font>Alpha<font face="宋体"
lang="ZH-CN">赋初值}</font></p>
<p>Test1(Alpha); { <font face="宋体" lang="ZH-CN">第一次调用</font>Test1,<font
face="宋体" lang="ZH-CN">递归开始}</font></p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">
按钮的</font>OnClick<font
face="宋体" lang="ZH-CN">事件处理过程给</font>Alpha<font face="宋体"
lang="ZH-CN">赋初值,并实现先减</font>1<font face="宋体" lang="ZH-CN">再除</font>2<font
face="宋体" lang="ZH-CN">的循环递归调用,直到</font>Alpha<font face="宋体"
lang="ZH-CN">小于</font>0<font face="宋体" lang="ZH-CN">为止。 </p>
</font><p>2.1.8.6 <font face="宋体" lang="ZH-CN">过程和函数的参数 </p>
</font><p><font face="宋体" lang="ZH-CN">
当您的程序代码在调用一个过程或函数时,通常用参数传递数据到被调用的过程或函数中。最常用的参数有数值参数、变量参数和常量参数三种。</font></p>
<p><font face="宋体" lang="ZH-CN">
由被调用过程或函数定义的参数为形参,而由调用过程或函数指明的参数叫实参。在</font>NoValue<font
face="宋体" lang="ZH-CN">函数中,说明函数体中的</font>AnEditBox<font
face="宋体" lang="ZH-CN">是形参,而调用时在</font>if NoValue(Edit1)<font
face="宋体" lang="ZH-CN">…中,</font>Edit1<font face="宋体" lang="ZH-CN">是实参。</font></p>
<p><font face="宋体" lang="ZH-CN">
数值参数在运行过程中只改变其形参的值,不改变其实参的值,即参数的值不能传递到过程的外面。试看下面的例程: </p>
</font><p>procedure Calculate(CalNo:Integer);</p>
<p>begin</p>
<p>CalNo := CalNo*10;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">
用以下例程调用</font>Calculate<font
face="宋体" lang="ZH-CN">函数:</font></p>
<p><font face="宋体" lang="ZH-CN">…</font></p>
<p>Number := StrToInt(Edit1.Text);</p>
<p>Calculate(Number);</p>
<p>Edit2.Text := IntToStr(Number); </p>
<p><font face="宋体" lang="ZH-CN">… </p>
</font><p> Number<font
face="宋体" lang="ZH-CN">接受由编辑框</font>1<font face="宋体" lang="ZH-CN">输入的数值,经</font>Calculate<font
face="宋体" lang="ZH-CN">过程运算。它是一个数值型实参。在进入</font>Calculate<font
face="宋体" lang="ZH-CN">函数后,会把</font>Number<font face="宋体" lang="ZH-CN">实参拷贝给形参</font>CalNo<font
face="宋体" lang="ZH-CN">,在过程中</font>CalNo<font face="宋体" lang="ZH-CN">增大十倍,但并未传递出来,因此</font>Number<font
face="宋体" lang="ZH-CN">值并未改变,在编辑框</font>2<font face="宋体"
lang="ZH-CN">中显示仍然是编辑框</font>1<font face="宋体" lang="ZH-CN">中的输入值。形参和实参占用不同的内存地址,在过程或函数被调用时,将实参的值复制到形参占用的内存中。因此出了过程或函数后,形参和实参的数值是不同的,但实参的值并不发生变化。</font></p>
<p><font face="宋体" lang="ZH-CN">如果您想改变传入的参数值,就需要使用变量参数,即在被调用程序的参数表中的形参前加上保留字</font>var<font
face="宋体" lang="ZH-CN">。例如: </p>
</font><p>procedure Calculate(var CalNo : Integer); </p>
<p><font face="宋体" lang="ZH-CN">
则</font>CalNo<font face="宋体"
lang="ZH-CN">并不在内存中占据一个位置,而是指向实参</font>Number<font
face="宋体" lang="ZH-CN">。当一个变参被传递时,任何对形参所作的改变会反映到实参中。这是因为两个参数指向同一个地址。将上一个例程中过程头的形参</font>CalNo<font
face="宋体" lang="ZH-CN">前面加上</font>var<font face="宋体" lang="ZH-CN">,再以同样的程序调用它,则在第二个编辑框中会显示计算的结果,把第一个编辑框中的数值放大十倍。这时形参</font>CalNo<font
face="宋体" lang="ZH-CN">和实参</font>Number<font face="宋体" lang="ZH-CN">的值都是</font>Nnmber<font
face="宋体" lang="ZH-CN">初始值的</font>10<font face="宋体" lang="ZH-CN">倍。</font></p>
<p><font face="宋体" lang="ZH-CN">
如果当过程或函数执行是要求不改变形参的值,最保险的办法是使用常量参数。在参数表的参数名称前加上保留字</font>const<font
face="宋体" lang="ZH-CN">可以使一个形参成为常量参数。使用常量参数代替数值参数可以保护您的参数,使您在不想改变参数值时不会意外地将新的值赋给这个参数。</p>
</font><p>2.1.9 <font face="宋体" lang="ZH-CN">定义新的数据类型 </p>
</font><p> Object Pascal<font
face="宋体" lang="ZH-CN">有一些系统预定义的数据类型,在</font>2.1.2<font
face="宋体" lang="ZH-CN">中已经对它们作了介绍。您可以利用这些数据类型以建立新的数据类型来满足程序的特定需要。下面简单地叙述了您能建立的主要数据类型,如枚举型、子界型、数组型、集合型、记录型、对象型等。 </p>
</font><p>2.1.9.1 <font face="宋体" lang="ZH-CN">枚举类型 </p>
</font><p><font face="宋体" lang="ZH-CN">
一个枚举型的说明列出了所有这种类型可以包括的值: </p>
</font><p>type</p>
<p>Tdays=( Sunday ,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); </p>
<p><font face="宋体" lang="ZH-CN">
可以定义上述枚举类型的变量:</font></p>
<p>var</p>
<p>DayOfWeek:TDays; </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -