《章Delphi的编程语言ObjectPascal》由会员分享,可在线阅读,更多相关《章Delphi的编程语言ObjectPascal(112页珍藏版)》请在金锄头文库上搜索。
1、第1章 Delphi的编程语言Object Pascal1.1 认识Delphi1.2 Object Pascal语言基础1.3 Delphi 中的程序调试及异常处理本章小结1.1 认识Delphi 感受Delphi编程Delphi的特点Delphi编程环境及其作用Delphi应用程序的文件组成Delphi中几个重要概念Delphi学习方法本节要点练习感受Delphi编程下面在Delphi的集成开发环境中编写一个最简单程序,并运行。让大家对Delphi的编程有一种感性认识,并体验Delphi快捷、方便、高效的编程环境。演示Delphi的特点Delphi最早是Borland公司于1994年底发布
2、的一种可视化编程语言。它以Object Pascal作为基本开发语言。目前已从Delphi 1.0发展到Delphi 7.0。它适用于Windows 9x, Windows xp,Windows 2000或更高的版本操作系统,同时也推出Lynux操作系统下的kylix版本。编程效率高、代码质量好领先的数据库技术强大的Internet应用开发功能与Office 的巧妙结合可视化编程语言编程语言的发展 机器语言汇编语言高级语言(结构化面向对象可视化)面向对象的程序设计(Object Oriented Programming)可视化(Visual)编程语言 Delphi,VFP,VB,VC 等,由组
3、件来构造应用程序。面向对象的程序设计对象:把要处理的数据和处理这些数据的方法组合成的一种数据类型。对象有如下三大特性: 封装性:把数据和处理数据的方法定义在同一数据类型(对象)中,一般只能用该对象中的方法来处理这些数据。 继承性:可以用已定义的对象来构造其子对象,并且子对象可以访问其父对象中的数据和方法。 多态性:为动作赋予一个可由对象序列共享的名称,对象序列中的每个对象均以适合于自身的方式实现该操作。事件驱动对象的多态性实例 implementation$R *.DFMtype TPerson=class Name:string; weight:integer; constructor Cr
4、eate(aName:string;aWeight:integer); function GetTitle:string; virtual; /父类中使用虚方法 function GetInformation:string; end;TStudent=class(TPerson) School:string; Constructor Create(aname:string;aWeight:integer;aSchool:string); function GetTitle:string; override;/子类中使用覆盖 end;constructor TPerson.Create(aNam
5、e:string;aWeight:integer);begin inherited create; name:=aname; weight:=aweight;end;function TPerson.GetTitle:string;begin result:=Name+ is a Person;end;对象的多态性实例(续)Constructor TStudent.Create(aname:string;aWeight:integer;aSchool:string);begin inherited create(aname,aweight); school:=aschool;end;funct
6、ion TStudent.GetTitle:string;begin result:=Name+ is a Student of +school;end;procedure showtitle(Person:TPerson);begin showmessage(person.getInformation);end;procedure TForm1.Button1Click(Sender: TObject);var aPerson:TPerson; aStudent:TStudent;begin aPerson:=TPerson.create(David,60); AStudent:=TStud
7、ent.create(Young,65,Tsinghua); showtitle(aperson); /显示某人相关的信息 showtitle(aStudent); /显示某学生相关的信息 aperson.free; astudent.free;end;Delphi编程环境及其作用菜单栏与工具栏组件(Component)栏对象树状列表(Object TreeView)对象监视器(Object Inspector)窗体设计器(Form Designer)代码编辑器(Code Editor)项目管理器(Project Manager)Delphi应用程序的文件组成Delphi应用程序的文件主要有:
8、 工程文件(.DPR);单元文件(.PAS);窗体文件(.DFM)等。Delphi中几个重要概念类(Class):Delphi中的对象类型数据,它由类的成员构成。对象:类数据类型的实例。组件:组成应用程序的构件,其类型一般为类类型。我们常用的是组件的属性、方法及事件。组件的事件:能够把发生于某一组件上的操作同一指定的方法进行关联。当该操作发生时会自动执行指定的方法。窗体或窗体上的组件接收事件,事件可由用户引发(例如键盘或鼠标操作),可由系统引发(例如定时器事件),也可由代码间接引发(例如当代码装载其他窗体时产生的Load事件)类的成员域(字段):类中的数据。方法:类中的过程或函数。属性:类似于
9、类中的域,但它本身并不占存储空间,对它进行存取操作,可以是直接存取,也可以是调用相应的方法,它可以是只读,只写或读写。Delphi学习方法转变编程思维方式重视上机应用为主多参考他人的编程经验和技巧(Delphi参考书,Delphi网站)Delphi网站Delphi 专家:Delphi 园地:Delphi程序员之家:5.Delphi学习方法本节要点 (1.1)熟悉Delphi集成开发环境主要组成部分及其作用:菜单栏与工具栏,组件栏,对象树状列表,对象监视器,窗体设计器,代码编辑器,项目管理器等。掌握Delphi应用程序的文件组成:项目文件(.DPR);单元文件(.PAS);窗体文件(.DFM)等
10、。了解几个重要概念:类,对象,组件,组件的属性、方法及事件等。练习(1.1)理论1. Delphi集成开发环境主要有哪几个部分组成,并说明各部分的作用。2.一个Delphi应用程序主要由哪些文件组成?3.预习Object Pascal上机实训教程1.1,1.21.2 Object pascal语言基础 标识符数据类型 变量和常量运算符和表达式语句过程和函数程序和单元本节要点练习标识符标识符必须由字母(AZ、az)、数字(09)或下划线组成,不区分字母的大小写。标识符的第一个字符必须是字母或下划线。标识符的长度不应超过255个字符,如果超过255字符就只有前255个有效。不能将保留字用作标识符,
11、如IF、AND、DO等。尽量不要重新定义已预定义的标识符,如一些标准的数学函数Sqrt、Sin等。数据类型 有序类型(ordinal) 实型(real)整型(integer)字符型(character)布尔型(Boolean)枚举(enumerated)子界(subrange)数组(array)记录(record)集合(set)文件(file)类(class)类引用(class reference)接口(interface)简单类型(simple)字符串类型(string)构造类型(structured)变体类型(variant)指针类型(pointer)过程类型(procedural)整型(
12、integer)常用整型:Integer-21474836482147483647有符号 4字节Cardinal04294967295 无符号 4字节基本整型:Shortint-128127有符号 1字节Smallint-3276832767有符号 2字节Longint-21474836482147483647有符号 4字节Int64263 263 -1有符号 8字节Byte0255 无符号 1字节Word065535 无符号 2字节Longword04294967295 无符号 4字节字符型(character)常用字符型:CharANSI字符集 1字节表示: a或#97 或#39 空格基本
13、字符型:AnsiChar ANSI字符集 1字节WideChar Unicode字符集(前256个是ANSI字符集) 2字节布尔型(Boolean)Boolean(1字节)False True Ord(False) = 0 Ord(True) = 1Pred(True) = False Succ(False) = TrueByteBool (1字节), WordBool (2字节), LongBool (4字节)False True Ord(False) = 0 Ord(True) 0Pred(False) = True Succ(False) = True枚举(enumerated)type
14、 类型名=(标识符1,标识符2, 标识符n);如:type TMyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange); Answer = (ansYes, ansNo, ansMaybe);其对应的序号为0,1,2子界(subrange)type SomeNumbers = -128.127; Caps = A.Z;type TColors = (Red, Blue, Green, Yellow, Orange, Purple, White, Black); TMyColors = Green.White;实型(real)常用实型Real
15、5.0 10-324 1.7 103088字节基本实型Real48 2.9 10-39 1.7 10386字节Single 1.5 10-45 3.4 1038 4字节Double 5.0 10-324 1.7 103088字节Etended 3.6 10-4951 1.1 10493210字节Comp -263+1 263 8字节Currency-922337203685477.5808 922337203685477.5807 8字节字符串类型(string)常用字符串String $H+ AnsiString , $H- ShortStringBORLAND BORLAND Youll
16、see Youll see 无字符Line 1#13#10Line 2中华人民共和国 基本字符串ShortString 255 个字符AnsiString 231 个字符WideString230个字符数组(array)type 类型名=array有序类型 of 基类型;如:type MyArray= array1.100 of Char;type TMatrix = array1.10, 1.50 of Real;记录(record)type 类型名 = record 域名:类型;. 域名:类型;end;如:type TDateRec = record Year: Integer; Mont
17、h: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Day: 1.31; end;集合(set)Type 类型名= set of 有序类型;如:type TIntSet = set of 1.250;set of Byte;set of (Club, Diamond, Heart, Spade);set of Char;集合值表示:1, 3, 5, 7, 9 ,a,b,c文件(file)type PhoneEntry = record FirstName, LastName: string20; PhoneNumbe
18、r: string15; Listed: Boolean; end; PhoneList = file of PhoneEntry;类(class)type TListColumns = class(TCollection) private FOwner: TCustomListView; function GetItem(Index: Integer): TListColumn; procedure SetItem(Index: Integer; Value: TListColumn); protected function GetOwner: TPersistent; override;
19、procedure Update(Item: TCollectionItem); override; public constructor Create(AOwner: TCustomListView); function Add: TListColumn; property Owner: TCustomListView read FOwner; property ItemsIndex: Integer: TListColumn read GetItem write SetItem; default; end; /类不能定义在函数或过程中类引用类型(class reference)Type 类
20、引用类型名=class of 类类型;如:type TClass = class of TObject;Var anyobj:Tclass;Anyobj变量可以引用任何其他类。类引用类型在用户要调用一个类的方法,但编译时又不知道该类的类型时非常有用。接口(interface)type 接口名 = interface (父接口) 各类中共同的方式或属性列表end;它体现的是多个互不相关的类之间的相同行为。变体类型(variant)变体类型与其他数据类型结合使用会产生类型的自动转换。var V1, V2, V3, V4, V5: Variant; I: Integer; D: Double; S:
21、 string;begin V1 := 1; integer value V2 := 1234.5678; real value V3 := Hello world!; string value I := V1; I = 1 (integer value) D := V2; D = 1234.5678 (real value) S := V3; S = Hello world! (string value) 指针类型(pointer)type 指针类型名= 类型对字符串类型和类类型,其内部实现方式均用指针。但为方便使用,Delphi把许多运用指针的地方隐藏起来,用户在编制程序时可以不把其当作指
22、针来处理,而让Delphi来处理容易出错的问题。过程类型type TIntegerFunction = function: Integer; TProcedure = procedure; TStrProc = procedure(const S: string); TMathFunc = function(X: Double): Double;变量和常量变量常量真常量类型常量变量var 变量名1,变量名2,变量名n:类型;如:(全局变量在说明时还可以给初值)var X, Y, Z: Double; I, J, K: Integer; Digit: 0.9; Okay: Boolean; Cr
23、tMode: Byte absolute $0040; s:string; /字符串变量访问 rd: TDateRec; /记录变量访问字符串变量访问(S:String)作为字符串来访问S:=abcde;作为单个字符来访问S1,s2,s3等访问单个字符,类似于数组中的每个元素。记录变量访问(rd:TDateRec)点域访问Rd.year:=2001; rd.month:=feb; rd.day:=12;With do访问With rd do year:=2001;type TDateRec = record Year: Integer; Month: (Jan, Feb, Mar, Apr,
24、May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Day: 1.31; end;真常量const 常量名=常量表达式;const Min = 10; Max = $100; Center = (Max - Min) div 2; Beta = Chr(225); NumChars = Ord(Z) - Ord(A) + 1; Message = Out of memory; ErrStr = Error: + Message + . ; ErrPos = 80 - Length(ErrStr) div 2; Ln10 = 2.302585092994045684
25、; Ln10R = 1 / Ln10; Numeric = 0.9; Alpha = A.Z, a.z; AlphaNum = Alpha + Numeric;类型常量const 常量名:类型=值;(兼容老版本,要加编译开关$j+;现在可以直接在全局变量中赋初值)Consti:integer=23;Digits1: array0.4 of Char=(0,1,2,3,4);Digits2: array0.4 of Char = 01234;type TCube=array0.1, 0.1, 0.1 of Integer;TMonth=(Jan,Feb,Mar,Apr,May,Jun,Jul,A
26、ug,Sep,Oct,Nov,Dec);TDate = record D: 1.31; M: TMonth; Y: 1900.1999; end;const Maze:TCube =(0, 1),(2, 3),(4, 5),(6,7);SomeDay: TDate = (D: 2; M: Dec; Y: 1960);运算符和表达式算术运算(Arithmetic operator)关系运算(Relational operator)布尔运算(Boolean operator)位运算(bitwise operator)字符串运算(String operator)集合运算(Set operator)指
27、针运算(Pointer operator)类运算(Class operator)取地址操作()运算符的优先级算术运算(Arithmetic operator)算术运算符:+, *, /, div(整除), mod(取余)运算量有整型、实型等, div和mod只能是整型,结果类型同运算量。例:5/2 2.55 div2 25 mod 2 15 mod 2 1-5 mod 2 -1-5 mod -2 -1关系运算(Relational operator)关系运算符有 =, , , =运算量有简单类型、字符串类型等,结果为布尔类型。例:60=30 true2.54-43.2 falseabcdefa
28、lse true布尔运算(Boolean operator)布尔运算符有 not, and, or, xor运算量和结果均只能为布尔类型。例:True and false falseFlase or (60=30) true位运算(bitwise operator)位运算符有 not, and, or, xor, shl, shr运算量和结果均只能为整型。例:Byte(Not $ff) $00Byte($10 and $11) $10Byte( $10 or $1b) $1bByte( $20 xor $21) $01Byte( $10 shl 2) $40Byte( $20 shr 1) $
29、10字符串运算(String operator)字符串运算符主要指连接两个字符串的运算符 +例:I am a+ student. I am a student.文件名:+abc.doc 文件名:abc.doc集合运算(Set operator)集合运算符有 +(并), - (差), * (交), = (包含), = (相等), (不等), in (成员检查)指针运算(Pointer operator)指针运算符有 +, -, =, , 类运算(Class operator)类运算符有 as, isAs:将一个类实例转换为另一个类型的类。如:Sender as TButtonIs:用来判断一个类
30、实例的类型,结果为布尔型。如:Sender is TComponet取地址操作()是单目运算符,其作用是返回变量的地址。运算符的优先级, not*, /, div, mod, and, shl, shr, as+, - or, xor=, , , =, in, is高低语句注释符单行注释符/;多行注释符或(*)说明语句对数据类型、变量、常量、标号、函数及过程等进行声明的语句,编译后不生成可执行代码。语句以分号结束。赋值语句和复合语句选择语句循环语句With语句赋值语句和复合语句赋值语句(变量名:=表达式)X := Y + Z;Done := (I = 1) and (I 100);I := S
31、qr(J) - I * K;SomeArrayI + 1 := P;TMyObject.SomeProperty := True;复合语句(把多个语句组合成一个语句)begin Z := X; X := Y; Y := Z;end;选择语句If语句Case语句Goto语句If语句if J = 0 then Exit /此处不能用;else Result := I/J;注:过程exit将终止子程序if J 0 thenbegin Result := I/J; Count := Count + 1;End /此处不能用;else if Count = Last then Done := True
32、/此处不能用;else Exit;if 布尔型表达式 then 语句1 else 语句2Case语句case 有序类型表达式 of 选择项1: 语句1; . 选择项n: 语句n;else 语句;End注:各选择项中的值要唯一。case I of 1.5: Caption := Low; 6.9: Caption := High; 0, 10.99: Caption := Out of range;else Caption := ;end;Goto语句label StartHere /说明一个标号.StartHere: Beep;goto StartHere;注:标号可以是标识符或09999的数
33、。循环语句For语句while语句Repeat语句For语句for 有序类型变量:=初值 to 终值 do 语句或for :=初值 downto 终值 do 语句注:有序类型变量的值增(to)减(downto)1,越过终值结束循环。max:=data1;for I := 2 to 12 do if DataI Max then Max := DataI;while语句while 布尔表达式 do 语句注:布尔表达式为false结束循环。max:=data1;I:=2;While I Max then Max := DataI; I:=I+1;End;Repeat语句repeat 语句1; .;
34、 语句2; until 布尔表达式;注:布尔表达式为true结束循环。max:=data1;I:=2;Repeat if DataI Max then Max := DataI; I:=I+1;Until I12;With语句访问记录中的数据域或类中的成员(域,属性或方法)。 with obj do 语句注:指类或记录类型变量的名字,下同。 with obj1, ., objn do 语句或with obj1 do with obj2 do . with objn do 语句注: obj1, ., objn等分别作用于与其对应的各自成员,可嵌套。举例With语句举例with edit1 do
35、begin text:=时间; /相当于edit1.text:=时间; enable:=false; /相当于edit1.enable:=false; end;with label1,edit1 do begin Caption:=label one; /相当于label1.Caption:=label one; Text:=text one; / 相当于edit1.Text:=text one; end;with form1,edit1 do Text:=text one; / 相当于form1.edit1.Text:=text one;过程和函数过程函数常用过程或函数过程procedure
36、 过程名(形参列表); 过程头类型声明常量声明变量声明过程声明函数声明begin 语句;end;注:作为语句来调用。举例说明部分语句部分过程体过程举例/把整型数转化为字符串procedure NumString(N: Integer; var S: string); var V: Integer;begin V := Abs(N); S := ; repeat S := Chr(V mod 10 + Ord(0) + S; V := V div 10; until V = 0; if N 0 do begin if Odd(I) then Result := Result * X; I :=
37、I div 2; X := Sqr(X); end;end; /p:=power(2.0,3)常用过程或函数(sysutils或system单元)Abs 求绝对值Sqr 求平方值Sqrt 求平方根Sin 求正弦Cos 求余弦Exp 求e的幂Ln 求自然对数Pi 3.1415926535897932385Date 取日期Time 取时间Length 求字符串的长度Pos 求子串的位置Delete 删除子串Copy 复制字符串Chr ASCII值对应的字符 Ord 取得序号Round 实型四舍五入为整型Trunc 实型取整Inttohex 整型变为十六进制数串Inttostr 整型变为字符串Str
38、toint 字符串变为整型Datetostr 日期变为字符串Upcase 转化为大写字母Uppercase 转化为大写字符串Lowercase 转化为小写字符串Random 产生一个随机数Odd 判定奇数程序和单元举例program 程序名; 程序头uses子句 引用单元类型声明常量声明变量声明过程声明函数声明begin 语句;End. 程序结束说明部分语句部分程序体程序举例program Editor; /程序对应的文件名(.dpr)必须与程序名相同。Uses Forms, REAbout in REABOUT.PAS AboutBox, REMain in REMain.pas MainF
39、orm; $R *.RES /编译指示begin Application.Title := Text Editor; Application.CreateForm(TMainForm, MainForm); Application.Run;end.单元unit 单元名; 单元头Interfaceuses子句 引用其它单元 接口部分implementation uses子句 引用其它单元 实现部分initialization 初始化代码finalization 结束代码end. 单元结束举例单元举例unit Unit1; /单元对应的文件名(.pas)必须与单元名相同interfaceuses
40、Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end;var Form1: TForm1;implementation$R *.DFMprocedure TForm1.Button1Click(Sender: TOb
41、ject);begin close;end;end.本节要点(1.2)会使用Delphi的帮助系统(Object Pascal Reference主题)查阅Object Pascal的各语法要素逐渐熟悉Object Pascal的常用数据类型、变量、常量、运算符和表达式,并掌握它们的用法。熟悉各语句的格式和用法,并使用本讲稿中的各示例编写完整程序,来验证各语句的用法。逐渐掌握过程和函数的编写和调用。熟悉程序和单元的结构。练习(1.2)理论教程P28-30选择题1-5,简答题2-3上机实训教程1.3,1.4补充:使用Delphi编写一实现排序功能的程序。演示1.3 Delphi 中的程序调试及异
42、常处理程序调试异常处理本节要点练习程序调试程序设计中的错误类型设置编译选项控制程序的执行使用监视列表窗口(Watch List, Ctrl+F5)使用求值/修改对话框(Evaluate/modify, Ctrl+F7)程序设计中的错误类型设计期错误编译期错误运行期错误逻辑错误 设计期错误 这一类型的错误较容易发现和纠正,因为DelPhi能对特定的值进行合法性检查,发现这类错误,DelPhi将显示一个警告窗口,以提示用户纠正错误。 这种错误类型发生在使用DelPhi进行可视化设计的时候,通常是因为给组件的某个属性输入了非法的值。例如按钮组件TBitBtn的NumGlyphs属性取值为 1.4,若
43、输入的值不在此范围,则发生错误。编译期错误 编译期错误也称为语法错误。在DelPhi中,通常是当程序代码违反了object Pascal语言的语法规则时发生这类错误。比较常见的语法错误有标识符未定义或拼写错误;语句的末尾漏掉分号;赋值语句中漏写昌号;begin与end末配对;括号末配对;引号末配对等。 如果程序代码中有语法错误,编译不能通过,代码编辑器的状态行将给出错误信息提示,并加亮有语法错误的代码行。运行期错误 程序虽然通过了编译,但运行失败,这种错误称为运行期错误,例如应用程序试图打开一个不存在的文件,或者运算时出现被零除等情况。 DelPhi能够检测出这类错误,并退出当前模块。此时,如
44、果不能确定错误发生在什么地方,可以用DelPhi内部集成的调试器查找错误的位置。例如可以用单步执行命令,让程序一条语句一条语句地执行,或者添加一个监视窗口,观察某个变量的变化情况。逻辑错误举例 逻辑错误是指程序通过了编译,也能执行,但执行的结果跟预期的不同。 逻辑错误有时比较难找,因为Delphi不能自动识别这类错误。这时就需要用到内部集成的调试器,通过控制程序的运行、监视程序的输出或观察变量的值,把错误逐步定位在一个较小的范围内。举例(逻辑错误)编程实现符号函数的功能 :var x,y:real;begin x:=-2; y:=0; if x=0 then if x0 then y:=1 e
45、lse y:=-1; showmessage(floattostr(y);end;设置编译选项 设置编译选项用来控制Delphi程序的编译方式。 可以使用如下二种方法进行设置:(1)使用Delphi菜单Project/Options-Compiler(2)在程序中加$Z+或$Z-设置或清除编译选项,其中Z为编译开关字母。 建议,在程序调试时,将所有检查性的选项设置上,优化特性清除,以利于调试;当程序调试通过后,应把那些加重程序时间、空间负担的编译开关清除,设置优化代码功能,再编译一次,以生成简练的可执行文件。编译选项1代码生成(Code generation)编译选项2运行时的错误(Runti
46、me errors) 信息(Messages) 编译选项3语法选项(Syntax options)编译选项4调试(Debugging) 举例举例(Range checking)$R+或$R-var a:array 1.3 of byte; i:integer;begin for i:=1 to 4 do begin ai:=i; showmessage(inttostr(ai); end;end;控制程序的执行设置断点(Toggle Breakpoint/F5)执行到光标处(Run to cursor/F4)单步执行(Trace Into/F7,Step Over/F8)举例举例(控制程序的执
47、行)编程实现符号函数的功能 :var x,y:real;begin x:=-2; y:=0; if x=0 then if x0 then y:=1 else y:=-1; showmessage(floattostr(y);end;异常处理Delphi对异常的自动处理编程人员对异常的处理Tryexcept语句Raise语句Tryfinally语句自定义异常类及其使用Delphi对异常的自动处理 Delphi为应用程序提供了一套缺省的自动异常处理机制,即当前模块发生错误后退出当前模块并给出错误信息,而并不立即引起应用程序的中止。 若程序在Delphi的集成开发环境中运行,在给出相应错误信息的同
48、时,还尽可能定位出错的位置。例如:var i:integer; r:real;begin i:=0; r:=8 / i; showmessage(floattostr(r);end;Tryexcept语句(格式1)格式1:Try 语句Except 语句End;功能: 若执行Try与Except之间的语句发生异常,则执行Except与End之间的语句对该异常作出处理,并清除异常,否则(没有异常)跳过Except与End之间的语句。举例举例(格式1)举例:var i:integer; r:real;begin i:=0; try r:=8/i; showmessage(floattostr(r);
49、 except showmessage(除数为零); end;end;Tryexcept语句(格式2)格式2:Try 语句Except on 标识符: 异常类 do 语句 on 标识符: 异常类 do 语句 End;功能: 当执行Try与Except之间的语句发生异常时,依次查找on后的异常类,直到发现某个匹配的异常类即执行其do后语句,并清除异常,然后跳过Try与Except结构,执行end后的语句。 若在on后没有找到匹配的异常类,则异常仍然存在。举例举例(格式2)var i,j:integer; r:real;begin j:=20; try i:=strtoint(edit1.Text
50、); j:=10 div i; r:=10/(i-1); showmessage(正常,j=+inttostr(j)+,r=+floattostr(r); except on E:EConvertError do showmessage(异常,非数值+#13+E.Message); on EDivByZero do showmessage(异常,整数被0除); on EZeroDivide do showmessage(异常,实数被0除); end;end;Tryexcept语句(格式3)格式3:Try 语句Except on 标识符: 异常类 do 语句 on 标识符: 异常类 do 语句
51、else 语句End;功能: 当执行Try与Except之间的语句发生异常时,依次查找on后的异常类,直到发现某个匹配的异常类即执行其do后语句,若在on后没有找到匹配的异常类,则执行else后的语句,并清除异常。举例举例(格式3)var i,j:integer; r:real;begin j:=20; try i:=strtoint(edit1.Text); j:=10 div i; r:=10/(i-1); showmessage(正常,j=+inttostr(j)+,r=+floattostr(r); /raise exception except on E:EConvertError
52、do showmessage(异常,非数值+#13+E.Message); else showmessage(异常,除数为0); end;end;Raise语句在Except后语句处理了异常,则清除异常,但可在其后使用Raise重新产生该异常,再提供给外层Try来处理。var i:integer; r:real;begin i:=0; try r:=8/i; showmessage(floattostr(r); except showmessage(除数为零); raise; end;Tryfinally语句格式:Try 语句Finally 语句End;功能: 不管执行Try与Finally之
53、间的语句是否发生异常,均可保证执行Finally后的语句,它不清除异常。 通常用于在使用某资源时失败后以保证能释放该资源。举例举例(Tryfinally语句)var f:textfile ;/定义文本类型的文件变量begin assignfile(f,c:msdos.sys); /文件变量f指向c:msdos.sys文件 Reset(F);/文本文件以只读方式打开 try write(f,One string);/写入一个字符串,由于不能写,发生异常 finally CloseFile(F); showmessage(文件已关闭); end;end;Delphi中的异常类Delphi提供的所有
54、异常类都是类Exception的子类。常用异常类 EDivByZerO:整数被零除 。EIntOverflow:整数超出其能表示的范围 。EZeroDivide:浮点数被零除Eoverflow:实数上溢出。Eunderflow:实数下溢出。ERangeError:访问数组时范围超出。常用异常类 EConvertError:在字符串与其他数据类型进行转化,或类调用Assign方法时产生错误。EInvalidCase:类之间的强行类型转换(使用as关键字)时产生错误。EAbstractError:试图调用一个空方法(Abstract 方法)。EInvalidPointer:错误的指针调用。EAcc
55、essViolation:试图非法访问内存。EOutofMemory:无可用内存分配。EStackOverflow:程序堆栈溢出。EDatabaseError:数据库操作出错。EDBEngineError:BDE(数据库引擎)出错。EInOutError:输入输出Eabort:哑异常,不产生任何错误信息,通常由Abort过程产生 。Exception类主要属性Message:异常发生时,显示在异常对话框中的提示信息。HelpContext:指定帮助内容的ID号。主要方法Create (const Msg: string):创建带简单信息的异常类。CreateFmt (const Msg: st
56、ring; const Args: array of const):创建带格式信息的异常类。自定义异常类及其使用定义异常类type MyError=class(Exception) end;在函数中创建自定义异常类function StrToIntRange(const S: string; Min, Max: Longint): Longint;begin Result := StrToInt(S); if (Result Max) then raise MyError.CreateFmt(%d is not within the valid range of %d.%d, Result,
57、Min, Max);end;使用自定义异常类procedure TForm1.Button5Click(Sender: TObject);begin try StrToIntRange(1234,1,100); except on e:MyError do showmessage(发生自定义异常#13+E.Message); end;end;本节要点(1.3)熟悉程序设计中的错误类型。掌握常用编译选项的含义及其设置。掌握程序调试方法(设置断点、执行到光标处、单步执行及使用监视列表窗口等)。掌握异常处理技术( Tryexcept语句, Tryfinally语句及常用异常类 等的使用)练习(1.3)理论教程P28-30选择题6-10,简答题4,6,11上机1.实训教程1.52.本节中的实例本章小结 本章通过编写最简单程序来介绍了Delphi的集成开发环境;简要全面地讲述了 Delphi 编程语言Object Pascal;最后介绍 Delphi 中的程序调试及异常处理机制。这些都是Delphi编程基础,特别是Object Pascal语言,一定要多编写程序,以达到快速熟悉其语法的目的;并且在后续编程中要自觉运用Delphi程序调试技术及异常处理方法。