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

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2012年12月27日

第二章 Delphi面向对象的编程方法

  Delphi的编程语言是以Pascal为基础的。Pascal语言具有可读性好、编写容易的特点,这使得它很适合作为基础的开发语言。同时,使用编译器创建的应用程序只生成单个可执行文件(.EXE),正是这种结合,使得Pascal成为Delphi这种先进开发环境的编程语言。
  本章中,我们将讨论Object Pascal的主要特点,并讲解如何在事件处理过程和其他应用程序中,使用它来编制程序代码。本章将讲解Delphi应用程序中最常用的Object Pascal语法,而不是Pascal语言的一切细节。如果您完全不熟悉Pascal编程,请参阅一些基础的Pascal教程。如果您具有编程经验,并能熟练地使用其他流行程序语言,您将在本章的Object Pascal中发现一些相同的概念。如果您已经熟悉了Borland Pascal,就可以快速浏览或跳过本章。 
  2.1 编写Object Pascal程序代码 
  在前边的章节中,我们通过例程,已经编写了几行简单的代码。在本章中,我们将从熟悉Pascal编程的角度,配合实例,讲解Object Pascal编程的基本方法。
  在编写自己的Object Pascal程序时,要注意程序的可读性。Pascal语言是英式结构语言,在程序中选择合适的缩排、大小写风格,并在需要时将程序代码分行,会使得程序代码能够很容易地被自己和他人读懂。一般的程序员都有这样的体验:如果不给程序加上适当的注解,一段时间后,自己也难以理清程序的流程。给程序及时地加上注释是良好的编程习惯。Delphi的注释需要加注在{}之间,编辑器会把它们处理成为空白。Delphi保留了Borland Pascal编辑器的风格,关键字采用黑体字,被注释的部分会变暗,这使得编程风格良好,易读易写。 
  2.1.1 编写赋值语句 
  在事件处理过程中,最常用到的工作就是把一个新值赋给一个属性或变量。在设计用户界面时,可以使用Object Inspector(Object Inspector)来改变其属性;但有时需要在程序执行时改变属性的值,而且有些属性只能在执行时改变,这些属性在Delphi的在线帮助的“Proprety”主题中被标为执行期属性。进行这种改变,就必须使用赋值语句。考试大论坛
  下文的赋值语句表征一个OnClick事件。当按钮按动后,将编辑框部件Edit1的Color属性置为clRed:
  procedure TForm1.Button1Click(Sender: TObject);
  begin
  Edit1.Color := clRed;
  end; 
  当按动按钮后赋值语句被执行,编辑框变成红色。
  在语句中,部件的名称在属性前,中间用“.”表示属性的所属关系。这样就准确地指定了要将clRed值赋给哪一部件的哪一属性。赋值号为“:=”,不论给属性还是给变量赋值,都是将右边的值赋给左边的属性或变量。
  当将一个属性值、变量、常量或文本数据赋给属性或变量时,所赋值的类型和接受此值的属性或变量的类型应相同或兼容。一个属性或变量的类型定义了此属性或变量的可能值集合,也定义了程序代码可以执行的运算。在前边的例程中,编辑框部件的Color属性和clRed的类型都是TColor。可以在在线帮助中找到一个属性的类型;另外一种方法是在Object Inspector中选定该属性值段,并按下F1键,则类型将在属性说明的结尾处列出,例如Color属性列出下边的语句: 
  Property Color : TColor; 
  有些属性是只读(Read Only)的,它们只能被读取,不能被改变。请查阅在线帮助,在Delphi中这些只读属性都有注解。 
  2.1.2 标识符的说明与使用 
  标识符是Delphi应用程序中一些量的名称,这些量包括变量(var)、常量(const)、类型(type)、过程(procedure)、方法(Method)及其他,Object Pascal 在应用标识符时,必须首先说明它们。Object Pascal是强类型语言,它的编译器可以检查确保赋给变量或属性的值是正确的类型,以便于您改正错误。因为Object Pascal是编译语言,所以Delphi的执行速度要比使用解释语言快得多。在使用标识符前说明它们,可以减少程序错误并增加代码的效率。 
  2.1.2.1 变量
  变量是程序代码中代表一个内存地址的标识符,而此地址的内存内容在程序代码执行时可以被改变。在使用变量前必须对它进行说明,即对它进行命名,并说明它的类型。在所有变量说明以前加上保留字var。变量说明左边是变量的名称,右边则是该变量的类型,中间用(:)隔开。 
  var
  Value ,Sum : Integer;
  Line : String; 
  在窗体中加入一个名称为Edit1的编辑框,再加入一个名称(属性Name)为Add的按钮部件,并建立如下的事件处理过程:
  procedure TForm1.addClick(Sender: TObject);
  var
  X , Y: Integer;
  begin
  X := 100;
  Y := 20;
  Edit1.Text := IntToStr(X + Y);
  end; 
  在本例中,当按动ADD按钮时,编辑框中显示值120。在Object Pascal中,必须确保变量或属性被赋予类型相同或兼容的值。您可以尝试将赋给X的值改为100.0,或去掉IntToStr函数,在编译时会出现类型不匹配的错误,这也说明了Object Pascal强类型语言的特点。 
  2.1.2.2 预定义类型 
  Object Pascal有多个预定义的数据类型,您可以说明任何这些类型的变量:
  整形:Integer的范围是-32768到32767,占2字节的内存;Shortint从-128到127,占1字节内存;Longint从-2147443648到2147483647 占4字节内存;Byte从0到255,占1字节;Word从0到65535,占2字节内存。它们都是没有小数部分的数字。
  实型:Single可以包含7到8位有效小数部分,占用4字节的内存;Double类可以包含15到16位有效小数部分,占用8字节的内存;Extended类型包含19到20位有效小数部分,占用10字节内存;Comp可以包含19到20位有效小数部分,占用8字节内存。以上实数类型只有在8087/80287选项[N+]打开才可以使用。Real可以包含11到12位有效小数部分,占用6字节内存。它只有在和以前Borland Pascal兼容的情况下才使用,否则应使用Double或Extended。
  布尔型:Boolean,只包含true或False两个值,占用1字节内存。
  字符型:Char,一个ASCII字符;字符串类型String一串最长可达255个ASCII字符。
  指针型:Pointer,可以指向任何特定类型。
  字符串型:PChar,是一个指向以零结尾的字符串的指针。
  除了预定义类型外,Delphi还有自行定义的类型。上述例程的TColor就是这种类型。此外,用户还可以定义自己的数据类型,这部分内容将在下文中详细讲述。
  整型类别和实型类别都各有五种类型,同一类别中,所有的类型与其他同类别的都相容,您可以将一种类型的值赋给相同类别中不同类型的变量或属性,而只需要这个值的范围在被赋值的变量或属性的可能值范围内。例如,对于一个Shortint型的变量,可以接受在-128到127范围内的任意整数,例如Shortint类型的7;您不能将300赋给它,因为300已经超出了Shortint的范围了。将范围检查功能打开(选用Options|Project,并在Compiler Options Page中选择Range Checking),将会检查出一个范围错误;如果Range Checking没有被打开,那么程序代码将可以执行,但被赋值的值将不是您期望的值。
  在一些情况下,您可以进行不同类型的变量或属性的赋值。一般来说,可以将一个较小范围的值赋给一个较大范围的值。例如,您可以将整型值10赋给一个接受实型值的Double属性而使得值成为10.0,但如果将一个Double类型的值赋给整形变量,则会出现类型错误。如果您不清楚类型的兼容性,可以参阅Delphi的在线帮助中“Type Compatibility and Assignment Compatibility”主题。 
  2.1.2.3 常量 
  常量在说明时就被赋予了一个值,在程序执行过程中是不可改变的。下面的例子说明了三个常量: 
  const
  Pi = 3.14159;
  Answer = 342;
  ProductName = "Delphi"; 
  象变量一样,常量也有类型。不同的是,常量假设其类型就是常量说明中其所代表的值的类型。上文的三个常量的类型分别是real型、整形、字符串型。常量用“= " 表示两边的值是相等的。 
  2.1.3 过程与函数 
  过程与函数是程序中执行特定工作的模块化部分。Delphi的运行库包含许多过程与函数以供您的应用程序调用。您不必了解过程与函数的逻辑,但要知道过程与函数的用途。在对象中说明的过程和函数称为方法(Method)。所有的事件处理过程都是过程,以保留字procedure开头。每一个事件处理过程只包含了当这一事件发生时需要执行的程序代码。在事件处理过程中使用Delphi已经存在的过程与函数,只需在程序代码中调用它们即可。 
  2.1.3.1 一个调用Delphi方法的简单例程 
  下文将通过对一个Memo部件的文本进行剪切、拷贝、粘贴、清除等编辑的应用程序编制,介绍使用Delphi过程和函数的调用方法。
  Memo(备注)部件有一个CutToClipboard方法,实现将用户在memo中选择的文本移到剪贴板上去。由于这个功能已经被建立在此方法中了,所以您只需知道这个方法做什么以及如何使用它即可。
  下面的语句表明如何调用一个名为Memo1的memo部件的CutToClipboard方法: 
  Memo1.CutToClipboard; 
  通过指定Memo1的名称,说明调用哪一个部件的CutToClipboard方法。如果不指明对象名称,Delphi会显示Unknown identifier错误。当该事件处理过程被触发,程序会执行CutToclipboard中的语句,将Memo1中的文本剪贴到剪贴板上去。
  下文的例程展示了如何调用Delphi的方法,实现将备注部件的文本信息剪切、拷贝到剪贴板上;将剪贴板上的标记文本粘贴到备注中,清除备注部件中的全部文本等四个功能。
  打开一个新的空窗体,加入一个memo部件和四个按钮,并排列整齐。改变按钮部件的Name属性,分别命名为Cut,Copy,Paste,Clear。您会发现,当Name属性发生改变时,Caption属性将发生相应的变化。在Caption属性前加标“&”号设立加速键
  将memo部件的ScrollBars属性设为ScVertical,以便加上滚行条。将WordWrap属性设置为True,这样当用户输入文本到达Memo部件的右边缘时会自动回行。将Line属性第一行的Memo1文本删除,使得memo部件在初始显示时为空的。
  为每一个按钮建立如下的事件处理过程: 
  procedure TForm1.CutClick(Sender: TObject);
  begin
  Memo1.CutToClipboard;
  end; 
  procedure TForm1.CopyClick(Sender: TObject);
  begin
  Memo1.CopyToClipboard;
  end; 
  procedure TForm1.PasteClick(Sender: TObject);
  begin
  Memo1.PasteFromClipboard;
  end; 
  procedure TForm1.ClearClick(Sender: TObject);
  begin
  Memo1.clear;
  end; 
  执行此程序。您可以在备注部件中输入文本,在进行了文本的标记后,可以任意地进行剪切、拷贝、粘贴和清除。当按钮被按动时,就调用相应的过程进行处理。用户可以通过查阅在线帮助进行Memo部件的Topic Search,在Memo Component项中查阅Method,会得到以上过程的详细说明。 
  2.1.3.2 调用Delphi的含参过程 
  有些过程要求用户指明参数。被调用的过程会在执行时使用传入的参数值,这些值在过程中被认为是已经被说明的变量。例如,LoadFromFile方法在TString对象中被说明为: 
  Procedure LoadFromFile(const FileName: String); 
  在调用这一过程时,应指明FileName参数是要装入的文件名称。下面的程序将先打开Open对话框,当您选择了一个文件后,Delphi将把该文件读入一个Memo部件: 
  begin
  OpenDialog.Execute;
  Memo1.lines.LoadFromFile(OpenDialog.FileName);
  end; 
  2.1.3.3 使用Delphi函数 
  与过程一样,函数的程序代码也执行特定的工作。它和过程的差别为:函数执行时会返回一个值,而过程则没有返回值。函数可以用来赋给一个属性或变量;也可以使用返回值来决定程序的流程。
  前文中我们实际上已经接触过了函数。在讲述变量时,曾用到过下面的程序段: Edit1.Text := IntToStr(X + Y);其中,IntToStr(Value)把一个LongInt类型的数值转化为字符串的值,Value是IntToStr唯一的参数,它可以是一个整形的值、变量、属性或产生整形值的表达式。调用函数,必须把返回值赋给和此返回值类型兼容的变量或属性。
  有些函数返回一个True或False的布尔量,用户的程序可以根据返回值来决定跳转。下文的例程讲述了函数返回值为Boolean的判断用法:
  在窗体中加入一个ColorDialog对象和一个Name属性为ChangeColor的按钮。为按钮的OnClick事件建立事件处理过程如下: 
  procedure TForm1.ChangeColorClick(Sender: TObject);
  begin
  if ColorDialog1.Execute then
  Form1.Color := ColorDialog1.Color
  else
  Form1.Color := clRed;
  end; 
  此事件处理过程使用一个返回Boolean值的Execute方法。按动按钮,并在颜色对话框中选择一个颜色。如果按动OK按钮,ColorDialog.Execute方法将返回True,则Form1.Color将被赋值为ColorDialog1.Color,窗体显现您选用的颜色;如果按动颜色对话框的Cancel按钮,方法将返回False值,窗体将变为红色。
  2.1.4 跳转语句 
  Object Pascal的跳转语句有if和case两个。 
  2.1.4.1 if语句 
  if语句会计算一个表达式,并根据计算结果决定程序流程。在上文的例程中,根据ColorDialog.Execute的返回值,决定窗体的背景颜色。if保留字后跟随一个生成Boolean值True或False的表达式。一般用“=”作为关系运算符,比较产生一个布尔型值。当表达式为True时,执行then后的语句。否则执行else后的代码,if语句也可以不含else部分,表达式为False时自动跳到下一行程序。
  if语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin…end。else保留字前不能加“;”,而且,编译器会将else语句视为属于最靠近的if语句。必要时,须使用begin…end保留字来强迫else部分属于某一级的if语句。 
  2.1.4.2 case语句 
  case语句适用于被判断的变量或属性是整形、字符型、枚举型或子界型时(LongInt除外)。用case语句进行逻辑跳转比编写复杂的if语句容易阅读,而且程序代码整形较快。
  下面的例程显示一个使用case语句的窗体:
  建立如下的事件处理过程: 
  procedure TForm1.Button1Click(Sender: TObject);
  var
  Number : Integer;
  begin
  Number := StrToInt(Edit1.Text);
  case Number of
  1,3,5,7,9: Label2.Caption := '奇数';
  0,2,4,6,8: Label2.Caption := '偶数';
  10..100:
  begin
  Label2.Caption := '在10到100之间';
  Form1.Color := clBlue;
  end;
  else
  Label2.Caption := '大于100或为负数';
  end;
  end; 
  执行程序,当Edit1部件接受到一个值,并按动“OK”按钮触发程序后,Number便被赋值为用户输入的数值。case语句根据Number的值判断该执行哪一条语句。象if语句一样。case语句也有可选择的else部分。case语句以end结尾。 
  2.1.5 循环语句 
  Object Pascal的循环语句有三种:repeat、while和for语句。 
  2.1.5.1 repeat语句 
  repeat语句会重复执行一行或一段语句直到某一状态为真。语句以repeat开始,以until结束,其后跟随被判断的布尔表达式。参阅以下的例程: 
  i := 0;
  repeat
  i := i+1;
  Writen(i);
  until i=10; 
  当此语句被执行时,窗体的下方会出现1到10的数字。布尔表达式 i=10 (注意,与其他语言不同的是,“=”是关系运算符,而不能进行赋值操作)直到repeat..until程序段的结尾才会被计算,这意味着repeat语句至少会被执行一次。


首页 1 2 3 4 尾页

相关文章