计算机等级考试二级Delphi辅导知识:Delphi面向对象的编程方法_第2页

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2012年12月27日
 2.1.5.2 while语句 
  while语句和repeat语句的不同之处是,它的布尔表达式在循环的开头进行判断。while保留字后面必须跟一个布尔表达式。如果该表达式的结果为真,循环被执行,否则会退出循环,执行while语句后面的程序。
  下面的例程达到和上面的repeat例程达到同样的效果: 
  i := 0;
  while i<10 do
  begin
  i := i+1;
  writeln(i);
  end;
  2.1.5.3 for语句 
  for语句的程序代码会执行一定的次数。它需要一个循环变量来控制循环次数。您需要说明一个变量,它的类型可以是整形、布尔型、字符型、枚举型或子界型。
  下面的程序段会显示1到5的数字,i为控制变量: 
  var
  i : integer;
  for i := 1 to 5 do
  writeln(i); 
  以上介绍了三种循环语句。如果您知道循环要执行多少次的话,可以使用for语句。for循环执行速度快,效率比较高。如果您不知道循环要执行多少次,但至少会执行一次的话,选用repeat..until语句比较合适;当您认为程序可能一次都不执行的话,最好选用while..do语句。 
  2.1.6 程序模块
  程序模块在Object Pascal中是很重要的概念。它们提供了应用程序的结构,决定了变量、属性值的范围及程序执行的过程。它由两个部分组成:可选择的说明部分和语句部分。如果有说明部分,则必在语句部分之前。说明部分包括变量说明、常量说明、类型说明、标号说明、程序,函数,方法的说明等。语句部分叙述了可执行的逻辑行动。来源:考
  在Delphi中,最常见的程序模块便是事件处理过程中的程序模块。下面的事件处理过程是含有变量说明部分的程序模块: 
  procedure TForm.Button1Click(Sender Tobject);
  var {程序模块的说明部分}
  Name : string;
  begin {程序模块的语句部分}
  Name := Edit1.Text;
  Edit2.Text := 'Welcome to Delphi'+Name;
  end; {程序模块结束} 
  库单元也是程序模块。库单元的interface部分含有库函数、类型、私有,公有域的说明,也可以含有常量、变量的说明。这一部分可以作为程序模块的说明部分。在库单元的implementation部分中通常含有各种事件处理过程,它们可以视为模块的语句部分,是事件处理模块。库单元模块结束于库单元结束的end.处。
  程序模块中可以包含其他的程序模块。上文库单元模块中含有事件处理模块。而库单元模块实际是在工程程序模块中。
  所有的Delphi应用程序都有相同的基本结构。当程序逐渐复杂时,在程序中加入模块即可。例如在库单元模块中加入事件处理模块,向工程中加入库单元模块等。模块化编程使得程序结构良好,并且对数据具有保护作用。 
  2.1.7 关于作用范围 
  2.1.7.1 标识符的作用范围 
  一个变量、常量、方法、类型或其他标识符的范围定义了这个标识符的活动区域。对于说明这个标识符的最小程序模块而言,此标识符是局部的。当您的应用程序在说明一个标识符的程序模块外执行时,该标识符就不在此范围内。这意味着此时执行的程序无法访问这个标识符,只有当程序再度进入说明这个标识符的程序模块时,才可以访问它。
  下面的示意图表示一个含有两个库单元的工程,每个库单元中又各有三个过程或事件处理过程。
  2.1.7.2 访问其他程序模块中的说明 
  您可以在当前的程序模块中访问其他程序模块中的说明。例如您在库单元中编写一个事件处理过程来计算利率,则其他的库单元可以访问这个事件处理过程。要访问不在当前库单元中的说明,应在这个说明之前加上其他应用程序的名称和一个点号(.)。例如,在库单元Unit1中有事件处理过程CalculateInterest过程,现在您想在库单元Unit2中调用这一过程,则可以在Unit2的uses子句中加入Unit1,并使用下面的说明: 
  Unit1.CalculateInterest(PrincipalInterestRate : Double); 
  应用程序的代码不能在一个模块外访问它说明的变量。事实上,当程序执行跳出一个模块后,这些变量就不存在于内存中了。这一点对于任何标识符都是一样的,不管事件处理过程、过程、函数还是方法,都具有这一性质。这样的标识符称为局部变量。 www.Examda.CoM考试就到考试大
  2.1.7.3 按照作用范围说明标识符
  您可以在应用程序的不同地方说明一个标识符,而只需保证它们的有效范围不同即可。编译器会自动访问最靠近当前范围的标识符。
  库单元的全局变量一般可以说明在保留字implementation后面。例如,下面的例程实现将两个编辑框中的整数相加,显示在第三个编辑框中。用到了一个整形的全局变量Count: 
  …implememntation 
  var
  Count : Integer; 
  procedure TForm1.AddClick(Sender:TObject);
  var
  FirstNumber,SecondNumber:Integer;
  begin
  Count := Count + 1;
  Counter.Text := IntToStr(Count);
  FirstNumber := StrToInt(Edit1.Text);
  SecondNumber := StrToInt(Edit2.Text);
  Edit3.Text := IntToStr(FirstNumber+SecondNumber);
  end;
  … 
  为了实现每按动一次按钮Count增加一次,必须对全程变量Count进行初始化处理。在程序库单元的结尾处,最后一个end.保留字之前,加入保留字initialization和初始化Count的代码: 
  …
  initialization
  Count := 0; 
  这样当事件处理过程AddClick被触发时,Count就会被增加一次,以表征计算次数。如果用面向对象编程,则Count可以说明成窗体的一个域,这在下一节中将有讲述。 
  2.1.8 编写一个过程或函数
  在您开发Delphi应用程序时,所需的大部分代码都编写在事件处理过程中,但有时仍然需要编写不是事件处理过程的函数或过程。例如,您可以把在多个事件处理过程中用得到语句编写成过程,然后任何事件处理过程、过程、函数都可以象调用已经存在的过程或函数一样直接调用它。好处是您只需编写一次代码,而且程序代码会比较清楚。
  2.1.8.1 一个自行编写的函数例程 
  在上文两个数相加的程序中,如果编辑框中无值,则会使得程序出错中断。为避免这种情况,编写下面的函数,检查编辑框中是否有值,如无值,则提醒用户输入: 
  function NoValue(AnEditBox:TEdit):Boolean;
  begin
  if AnEditBox.Text='' then
  begin
  AnEditBox.Color := clRed;
  AnEditBox.Text := '请输入整数值';
  Result := True;
  end
  else
  begin
  AnEditBox.Color := clWindow;
  Result := False;
  end;
  end; 
  NoValue函数会检查编辑框是否为空,如果是,编辑框颜色变红,并提醒用户输入一个整数,然后函数返回真值;Result保留字在Delphi中用来专指函数返回值。在上文的例程中加入NoValue函数: 
  procedure TForm1.AddClick(Sender: TObject);
  var
  FirstNumber,SecondNumber : Integer;
  begin
  if NoValue(Edit1)or NoValue(Edit2) then
  exit;
  Count := Count + 1;
  Counter.Text := IntToStr(Count);
  FirstNumber := StrToInt(Edit1.Text);
  SecondNumber := StrToInt(Edit2.Text);
  Edit3.Text := IntToStr(FirstNumber+SecondNumber);
  end; 
  如果其中的任何一个返回真值,则表示有编辑框空,会执行exit过程,使得当前的程序模块停止执行,并使得编辑框出现输值提示。当新值被输入后,再执行程序时,红色提示被隐去,恢复正常的计算状态。 
  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为止。

相关文章