白涛老师Delp课件第二章_第1页
白涛老师Delp课件第二章_第2页
白涛老师Delp课件第二章_第3页
白涛老师Delp课件第二章_第4页
白涛老师Delp课件第二章_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi程序设计教程授课教师:白涛jsjbt@新疆农业大学计算机与信息工程学院信息系统教研室第2章Delphi的语法基础2.1保留字与标识符

2.1.1保留字

2.1.2标识符

2.1.3指令符2.2数据类型

2.2.1数值型数据

2.2.2字符数据2.2.3布尔型数据2.3常量与变量

2.3.1常量

2.3.2变量2.4运算符与表达式

2.4.1算术运算符

2.4.2位运算符

2.4.3字符串运算符2.5常用函数与过程

2.5.1数学运算函数

2.5.2字符处理函数

2.5.3日期时间函数

2.5.4顺序类型函数2.6语句

2.6.1语句的书写规则

2.6.2语句格式中的符号约定

2.6.3赋值语句

2.6.4注释语句习题2

2.1保留字与标识符2.1.1保留字和指令字ObjectPascal语言中定义了65个保留字(ReservedWords),它们具有特殊的含义,不可以用来作为标识符。也就是说它们是由系统定义的具有特定意义的单词,用户不可以在编程时重新定义或做他用。具体单词如下:此外,ObjectPascal语言中还定义了39个指令字(Directives),它们也具有特殊的含义,只是当用户重新定义了这些指令字后,在作用域内它们就失去了原来的意义了。具体如下:说明:尽管private、protected、public、published和automated是指令字,但是要将它们当作保留字来看待,不要定义与它们同名的标识符。同样,at和on也具有特殊的含义,也不要定义与它们同名的标识符。此外,ObjectPascal是不区分大小写的。当然,在Delphi集成开发环境的代码编辑器中,将以黑体显示保留字和指令字。所以,我们在定义标识符的时候注意不要与这些以黑体字显示的单词一样。2.1.2标识符ObjectPascal语言使用的是ASCII码字符集,包括字母A~Z、a~z、数字0~9和其他的一些标准字符。下面的单个字符作为特殊符号存在:#$&'()*+,?./:;<=>@[]^{}另外,有些字符对也作为单个的特殊符号存在,具体有:(*(.*).)..//:=<=>=<>其中,左中括号“[”等价于“(.”,右中括号“]”等价于“.)”,左大括号“{”等价于“(*”,右大括号“)”等价于“*}”。在Pascal语言中,标识符(Identifiers)用来标志常量、变量、类型、属性、对象、过程、函数、程序、单元、库和组件库等。标识符分为标准标识符和自定义标识符两类。1.标准标识符标准标识符是ObjectPascal语言系统预先分配给标准函数、标准过程、标准类型、标准变量以及标准文件使用的标识符,如:False(标准常量)、Char(标准类型)、Eof(标准函数)、Get(标准过程)、Input(标准文件)等。2.自定义标识符自定义标识符是程序员根据程序设计的需要为自己定义的常量、变量、类型、函数、过程以及所编写的程序所取的名字。说明:标识符可以由任意长的一个不带空格的字符串组成,但是只有前面的255个字符有效。标识符的第一个字符必须是字母或下划线,其余字符可以是字母、数字或下划线。自定义标识符不能与保留字相同,同时应尽量避免与标准标识符同名,以免发生混淆。自定义标识符必须先定义或说明,然后才能在程序中使用。3.限定标识符由于ObjectPascal程序中可以引用多个单元,而各个单元中的全程变量、函数、过程等可能会同名,所以在程序中引用它们时需要使用限定标识符来区分它们。也就是使用在另一个地方定义的标识符,需要限定标识符。限定标识符的格式为: 标识符1.标识符2其中标识符1限定标识符2。限定符可以嵌套,如Form1.Button1.Click表示调用Form1窗体Button1的Click方法。一般标识符可以由一个或多个具有适当意义的英文单词组成。ObjectPascal语言对于字母的大小写不敏感。当然,字符串中的大小写字母是需要分清的。在编写程序的时候要保持一定的风格,不要有时候全部大写标识符,另一些时候又实行大小写混写。建议同学将标识符中每个英文单词的首位字母大写,其余字母小写。2.1.3注释ObjectPascal语言中的注释有下面三种形式:•组合符号“{”与“}”的成对使用表示它们之间的内容为注释部分。•组合符号“(*”与“*)”的成对使用表示它们之间的内容为注释部分。•符号“//”的单个使用表示所在行的该符号之后的内容为注释。注意:•注释符“{”与“}”、“(*”与“*)”在使用时不支持注释的嵌套,而且必须成对使用。•建议对于单行和少量几行的注释使用符号“//”,对于大块注释使用“{”和“}”或“(*”和“*)”。•有时可以利用注释在代码中形成一个醒目的标志。比如利用注释符号形成一个矩形方框,在其中可以添加一些重要的说明文字。在注释符“{”或“(*”后紧接着的是一个美元符号“$”时,表示该句是一个编译器指令,它与普通的注释不同,通常用来对编译过程进行设置。

例如:programProject1;{$APPTYPECONSOLE}//编译器指令//////////////////////////////////////本例程用来说明注释符的使用//////////////////////////////////////begin{下面的这条语句将字符串1和字符串2紧接着在屏幕上输出}Writeln('String0'(*字符串1*)+'String1');//字符串2Writeln('按下回车键<Enter>退出。');Readln;end.运行结果如下:String0String1上面的注释文字“(*字符串1*)”实际上位于语句Writeln(‘String0’+’String1’);之间,但是对编译结果没有影响。因为在编译的时候,编译器首先会将所有的注释去除,然后再进行语法分析。

2.2数据类型

描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序加工处理的符号的集合称为数据。数据的一个重要特征就是其所属的数据类型,数据类型不仅确定了该类型数据的表示形式和取值范围,而且还确定了数据所能参加的各种运算。ObjectPascal语言的数据类型比较丰富,图2-1中列举了一些预定义好的数据类型。此外,还可以通过数据类型声明语句在预定义数据类型的基础上定义新的数据类型。1.简单数据类型简单数据类型(Simple)包括有序数据类型(ordinal)和实数数据类型(real)。有序数据类型包括下面的一些数据类型:(1)整数类型整数类型(integer)包括了表2-1中的各种类型。(2)字符类型基本的字符类型(character)包括AnsiChar和WideChar两种。AnsiChar类型的数据具有一个字节,与扩展的ANSI字符集对应。WideChar类型的数据为双字节,与Unicode字符集对应。通用的字符类型为Char,与AnsiChar类型相同。与其相关的函数:在获取字符类型数据的字节数时使用SizeOf函数。此外,可以使用函数Chr返回一个整型数对应的字符,也可以使用Ord返回一个字符的序数。(3)布尔类型布尔类型(Boolean)包括以下四种:Boolean、ByteBool、WordBool和LongBool。ObjectPascal语言预定义了两个常量标识符False和True,可以为Boolean类型的数据赋值为False或True,对应的序数值为0和1。当ByteBool、WordBool和LongBool类型的数据为0时,可以认为是False;当不为0时,可以认为是True。(4)枚举类型

枚举类型(enumerated)是由一组有序的标识符组成的,它是通过枚举表示其值的标识符来定义的有序集合。形式如下:

typetypeName=(val1,...,valn)例如:

typeccolor=(red,blue,green,yellow,white,black);VarC:cclolor;枚举类型的性质:

属有序类型,序号从0开始,序号小的元素小于序号大的。但首元素无前趋,末元素无后继。

同一枚举元素不能在多个枚举类型中出现。例:type//错:两个枚举类型定义中都有carriagevehicle=(bike,carriage,motor);

car=(bus,carriage,lorry);枚举类型只能进行赋值运算和关系运算。枚举变量的值只能用赋值语句获得,不能读写,也不能直接输出,要用序号和选择语句相配合来输出。例:VarYColor:(red,green,blue);……caseord(Ycolor)of0:memo1.lines.add('Red');1:memo1.lines.add('Green');2:memo1.lines.add('blue');end(5)子界类型子界类型(subrange)为某个有序类型的子集。定义的语法:<常量1>..<常量2>例:type//定义子界类型Month和DayMonth=1..12;//宿主类型为整型Day=Sun..Sat;//宿主为已定义的枚举类型注意:

1.子界类型适合于其宿主类型的所有运算,但受其上下界的限制。2.类型定义和变量定义可合二为一:Typesomeletter=‘a’..‘d’;VarCh1,Ch2:someletter;可合写为:VarCh1,Ch2:‘a’..‘d’;

实数类型适用于实数类型的运算符有:算术运算:+、-、*、/关系运算:=、<>、<、>、<=、>=2.字符串类型字符串类型(String)主要包括表2-3中的3种类型:字符串类型说明的语法格式为:

VAR<类型标识符>:String[长度]注意:程序中一般是用String,而很少直接用ShortString或ANSIString来说明字符串变量。String类型与ANSIString类型完全等价3.结构类型结构类型(Struct)包括集合类型(set)、数组类型(array)、记录类型(record)、文件类型(file)、类类型(class)、类引用类型(classreference)和接口类型(interface)等。(1)集合类型

集合类型(set)由有序类型的一些数值组成,这个有序类型就是集合的基类型。集合类型定义的语法格式为:

Type <类型名>=Setof<基类型>注意:在ObjectPascal中集合的元素个数不能超过256个。集合中的元素没有先后顺序的关系,相同的元素也不能出现在同一个集合中。通常先定义一个子界型,用来声明集合类型。例:type SomeInts=77..277;TintSet=setofSomeInts;也可一步写成:TintSet=Setof77..277;

VarASet,BSet:TintSet;集合类型的声明和变量的声明也可合二为一:VarYaoSet:Setof'a'..'z';也可用枚举类型来声明集合例如:TypeColor=(Red,Green,Blue);ColorSet=SetofColor;VarYaoColorSet:ColorSet;变量YaoColorSet的可能取值为:[];(空集)[Red];[Green];[Blue];[Red,Green];[Red,Blue];[Green,Blue];[Red,Green,Blue];

Pascal中,一个集合类型变量的取值,可是基类型所有元素按不同组合而成的子集,也可是全集。若有n个元素的集合,则可取2n个不同组合的子集。(2)数组类型

数组类型(array)的数据为某一类相同类型的元素按一定的顺序组成的序列,包括静态数组和动态数组两种。现在Delphi支持动态数组,也就是说数组可以动态分配存储空间。

1.静态数组所谓静态数组就是定义后,其大小不再改变的数组,定义的语法形式为:

Type

<数组标识符>=ARRAY[下标类型]OF<元素类型>例如:

typeMyArray=array[1..100]ofChar;//一维数组typeTMatrix=array[1..10]ofarray[1..50]ofReal;//两维数组

TypeTMatrix=array[1..10,1..50]ofReal;//与上面的两维数组相同说明:其中“下标类型”指定了数组类型变量的分量个数、分量的排列次序及其下标的数据类型,它可以是任何顺序类型,如整数型、字符型、布尔型和枚举型等;“元素类型”是数组中各个元素的类型,它可以是任何类型。数组可以是多维的,每一维的下标类型指明了元素的数目。数组可以在每一维中用所有下标类型的数值来存取其中的元素。多维数组各个下标可以是不同的基类型。2.动态数组动态数组没有固定的大小和长度,在为数组的元素赋值或调用标准函数SetLength时,系统才为数组分配内存。定义的语法形式为:

Type<数组类型标识符>=ARRAYOF<基类型>动态数组的下标都是整数,并且是从0开始的。

多维动态数组用嵌套的ARRAYOF结构来定义:例如:varMyFlexibleArray:arrayofReal;//定义动态数组varms:arrayofarrayofstring;//定义二维动态数组可以通过过程SetLength来为动态数组指定空间大小:例如:SetLength(MyFlexibleArray,20);//为动态数组指定空间大小其中数组MyFlexibleArray的索引值为0~19。(3)记录类型

记录类型(record)是一组不同类型元素的集合,用来表示一个具体的实物。其中的元素称为域。在记录类型中为每个域指定了一个名称和数据类型(数据类型可以是对象Pascal语言中预定义的类型,也可以是程序员自定义的类型)。

定义记录类型的语法格式为:RECORD<标识符1>:<类型1>;<标识符2>:<类型2>;......END;要引用记录中的一个字段,可以使用限定标识符的格式。也就是在记录名与字段名(该字段说明的变量标识符)间用原点符号连接。类和对象可以看作是记录类型的扩展。Delphi库趋向于用类替代记录类型,不过WindowsAPI中定义了许多记录类型。记录类型中允许包含variant域,它表示多个域能公用同一内存区,而且域可以是不同类型。variant记录类型的应用不符合类型安全原则,因此不提倡在编程中使用,初学者更是如此。(4)文件类型文件类型的定义中并没有定义其元素的个数,语法格式为:Type

<标识符>=FILEOF<类型标识符>;注意:若省略了OF和类型标识符,则这个类型代表无类型的文件。定义了文件类型后,就能打开一个与这个结构相应的物理文件、向文件中写入整数、或者从文件中读取当前的值。

(5)类类型

类类型也称类或对象类型。类是包括了继承权(即类继承)、字段(即记录或对象中的元素)、方法和属性等内容的结构。类的实例称为对象,类的字段、方法即属性称为类的成员。4.指针类型指针类型变量用于保存内存地址,在说明时必须说明所指向的变量的类型。声明的语法格式为:TYPE<指针类型名>=^<类型名>其中<类型名>是指针所指向的数据类型。在声明了指针变量后,系统并未为其分配内存,指针变量也未初始化。使用标准函数new可以解决该问题。Dispose函数是new函数的逆过程,通过使用new函数获得的内存空间必须使用dispose函数来释放。注意:1.@运算符放在变量的前面可以获取变量的地址2.^运算符放在数据类型的前面表示定义该类型的一个指针类型;如果放在一个指针的后面,则获取该指针指向的地址空间的内容3.无类型指针的定义P:Pointer;无类型指针仅包含一个内存地址,可以指向任何类型的数据。5.过程与函数类型(procedure)

Pascal中的例程有两种形式:过程和函数。理论上说,过程是你要求计算机执行的操作,函数是能返回值的计算。两者突出的不同点在于:函数能返回计算结果,即有一个返回值,而过程没有。两种类型的例程都可以带多个给定类型的参数。6.可变类型(variant)可变类型(variant)主要用于实际操作类型变化或编译时类型不能确定的情况。定义的语法格式为:

<变量名>:VARIANT可变类型的变量在创建后,总被初始化为Unassigned的值,表示还没有赋值。可变类型可以包含除Int64、结构类型和指针类型之外的所有类型,但其自身不能包含自身。在表达式和赋值语句中,可变类型的变量可以和整数、实数、字符串、布尔类型以及其它的可变类型等混合使用,编译器将自动进行类型转换。本次课导读常量和变量运算符和表达式常用函数和过程语句三种程序结构结合例程讲解控件

2.3常量与变量在程序的执行过程中其值保持不变,称为常量;在程序的执行过程中其值可以被改变的称为变量。2.3.1常量1.常量和常量表达式常量在程序中有两种形式,第一种就是值本身(直接常量),第二种是用常量名表示的常量(符号常量),这需要在程序中定义。在ObjectPascal中还允许使用常量表达式,也就是在编译时就可以计算的表达式。2.定义符号常量

定义符号常量有两种类型:纯常量(TrueConstants)和类型常量(TypedConstants)。⑴纯常量的定义纯常量的值在定义之后就不再变化,定义纯常量的语法格式为:

CONST<常量标识符>=<常量或常量表达式>关键字CONST可以定义多个常量。例如:Constpi=3.1415926⑵类型常量的定义类型常量可以保存数组、记录、过程以及指针等类型的值。定义类型常量的语法格式为:

CONST<常量标识符>:<类型>=<值>例如:constPi:Double=3.1415926;类型常量的用法同变量完全一样,可以对类型常量重新赋值。2.3.2变量1.标准数据类型变量的定义变量定义的格式为:

VAR<变量名列表>:<类型>;变量名之间用(,)分隔。一个VAR语句可以定义多个不同类型的变量。不同的位置变量的作用范围不同。var

s,t,r:string;I,j:integer;flag:Boolean;2.自定义类型变量的定义对自定义类型的变量,必须先有类型的定义,然后才能定义变量。如:在程序的说明部分中定义枚举类型Color的定义: TypeColor=(Red,Blue,Green,Yellow,Orange);则可以利用Color类型定义变量: VARFirstColor:Color;3.变量的初始化在函数或过程内部定义的变量称为局部变量,其余的称为全局变量。全局变量在定义时就可以进行初始化,其语法是:

VAR<变量名列表>:<类型>=<常量表达式>;同时定义多个全局变量时,不能进行初始化,另外对文件类型和可变类型的变量也不能初始化。没有初始化的全局变量在编译时被赋值0,而局部变量(不能初始化)的值在赋值前是随机的。

2.4运算符和表达式ObjectPascal语言中的运算符(Operators)有:

@、not、^、*、/、div、mod、and、shl、shr、as、+、-、or、xor、=、>、<、<>、<=、>=、in和is等。按照操作数数目的多少来分,运算符分为下面两类:单目运算符(UnaryOperator)和双目运算符(BinaryOperator)。1.算术运算符算术运算符对浮点数和整数进行加、减、乘、除和取模运算,如表2-5所示。注意:其中+和-运算符还可以作为单目运算符,放在在浮点数或整数前,分别表示正数和负数。此外,+运算符还可以用在字符串的运算表达式中,可以将两个字符串接在一起。+、-和*运算符还可以用在集合运算表达式中。2.逻辑运算符逻辑运算符对逻辑类型的操作数进行运算,数据结果也为逻辑类型,如表2-6所示。3.位运算符位运算符对整型的数据进行按位操作,所得结果也为整型数据,如表2-7所示。4.字符串运算符加号(+)还可以作为字符串运算符,它可以将两个字符串联接在一起。如果两个字符串都是短字符串,那么在结果字符串长度超过255个字符的情况下,只有前面255个字符有效。

在复杂的表达式中,各种运算符的优先级分别如下:•第一级(最高):@、not•第二级:*、/、div、mod、and、shl、shr、as•第三级:+、-、or、xor•第四级(最低):=、<>、<、>、<=、>=、in、is

2.5语句语句由保留字、属性、函数、运算符以及能够生成Delphi编辑器可识别指令的符号组成。2.5.1语句的书写规则ObjectPascal程序语句的书写比较自由,可以把多个语句放在一行程序中,也可以一个语句分多行写,只要遵守一个规则:每个语句必须以分号“;”结束即可。最简单的语句是一个什么也不做的“空语句”:2.5.2几种常见的语句在ObjectPascal语言中,我们先了解一下几种类型的语句:1.声明语句1)常量的声明形式如下列所示:

constPI=3.1415926535897932385;2)在基本数据类型的基础上,还可以利用保留字type自定义一些数据类型,例如:typeMyType=Array[1..100]ofreal;3)利用保留字var可以声明已存在数据类型的变量,例如:varX,Y:Integer;M:MyType;2.赋值语句赋值语句的形式如下:

variable:=expression例如:Done:=(I>=1)and(I<100);//将逻辑表达式的结果赋值为一个变量Hue1:=[Blue,Succ(C)];//将一个子集赋值为一个变量I:=Sqr(J)-I*K;//将一个表达式的结果赋值为一个变量Shortint(MyChar):=122;//给类型转换后的变量赋值MyString[I]:='A';//给数组的一个元素赋值TMyObject.SomeProperty:=True;//给对象的属性赋值

Delphi组件属性的赋值⑴属性赋值给属性赋值的语法格式为:<对象.属性>:=<属性值>⑵组件属性的重要类别有些对象本身就是对象,如Font属性,设置这些对象属性可以使用下列的方法:

Edit1.Font.Size:=24;{设置字体的大小} Edit1.Font.Color:=ClRed;{设置字体的颜色}⑶同时设置一个对象的多个属性若要同时设置一个对象的多个属性时,可使用With语句。语法格式:

withlabel1do

begincaption:=‘欢迎使用!';font.Color:=clred;

end;3.复合语句首尾使用begin和end括起来一组语句称为复合语句。复合语句可以嵌套使用,也允许空的复合语句出现,也就是在begin和end之间没有其他语句。例如:beginZ:=X;X:=Y;Y:=Z;beginend;end;

2.6标准函数例举

ObjectPascal把常用的一些运算定义为系统标准函数。2.5.2

数学运算函数1.绝对值函数绝对值函数定义:functionAbs(x);2.平方与平方根函数平方函数的定义:functionSqr(x:Extended):Extended;平方根函数的定义:functionSqrt(x:Extended):Extended;3.三角函数functionSin(x:Extended):Extended;functionCos(x:Extended):Extended;functionArcTan(x:Extended):Extended;4.整数部分与小数部分

取整数函数的定义:functionInt(x:Extended):Extended;

取小数函数的定义:functionFrac(x:Extended):Extended;6.指数函数和对数函数指数函数的定义:functionExp(x:Real):Real;对数函数的定义:functionLn(x:Real):Real;7.随机函数

随机函数的定义:functionRandom[(Range:Integer)];8.π函数函数定义为:functionPi:Extended;2.5.2字符处理函数1.大小写转换函数其函数定义分别为:functionLowerCase(constS:string):string;functionUpperCase(constS:string):string;2.比较先后顺序函数其函数定义分别为:functionCompareStr(constS1,S2:string):Integer;functionCompareText(constS1,S2:string):Integer;3.合并字符串其过程定义为:procedureAppendStr(varDest:string;constS:string);其函数定义为:functionConcat(s1[,s2,...,sn]:string):string;4.查找字符串函数其函数定义为:functionPos(Substr:string;S:string):Integer;5.求字符串长度函数其函数定义为:functionLength(S):Integer;6.截取子字符串函数其函数定义为:functionCopy(S;Index,Count:Integer):string;7.删除子字符串过程其过程定义为:procedureDelete(varS:string;Index,Count:Integer);8.插入子字符串过程其过程定义为:procedureInsert(Source:string;varS:string;Index:Integer);9.数值与字符串转换(1)过程Str用来将数值型数据转换成字符串,其过程定义为:procedureStr(X[:Width[:Decimals]];varS);(2)过程Val用来将字符串转换成数值型数据,其过程定义为:procedureVal(S;varV;varCode:Integer);(3)

函数IntToStr用来将整型数据转换成字符串,其函数定义为:functionIntToStr(Value:Integer):string;overload;(4)函数FloatToStr用来将实型数据转换成字符串,其函数定义为:functionFloatToStr(Value:Extended):string;

(5)函数StrToInt用来将数字字符串转换成整型数值,其函数定义为:functionStrToInt(constS:string):Integer;

(6)函数StrToFloat用来将数字字符串转换成实型数值,其函数定义为:functionStrToFloat(constS:string):Extended;(7)函数IntToHex用来将10进制整数转换成或16进制格式,其函数定义为:functionIntToHex(Value:Integer;Digits:Integer):string;10.ASCII转换为字符函数Chr用来将ASCII码值转换成字符,其函数定义为:functionChr(X:Byte):Char;11.格式化函数函数Format用来将字符串按照指定的格式返回,故称格式化函数。其函数定义为:functionFormat(constFormat:string;constArgs:arrayofconst):string;类型和格式信息由字符“%”开头,格式如下:%[〈参数位置〉:][-][〈所占宽度〉][.〈小数位数〉]〈类型〉2.5.3日期时间函数1.日期与时间函数

函数Now用来返回系统当前的日期和时间,其函数定义为:functionNow:TDateTime;2.日期函数

函数Date用来返回系统当前的日期,其函数定义为:functionDate:TDateTime;3.时间函数函数Time用来返回系统当前的时间,其函数定义为:functionTime:TDateTime;4.转换函数(1)函数DateToStr、TimeToStr、DateTimeToStr可以分别将日期和时间(TdateTime类型)转换成字符串,其函数定义分别为:functionDateToStr(Date:TDateTime):string;functionTimeToStr(Time:TDateTime):string;functionDateTimeToStr(DateTime:TDateTime):string;(2)函数EncodeDate与过程DecodeDate可以在TdateTime类型的日期值与整型的年、月、日之间互相转换,其定义分别为:functionEncodeDate(Year,Month,Day:Word):TDateTime;procedureDecodeDate(Date:TdateTime,varYear,Month,Day:Word);

(3)函数EncodeTime与过程DecodeTime可以在TdateTime类型的时间值与整型的小时、分、秒、毫秒之间互相转换,其定义分别为:functionEncodeTime(Hour,Min,Sec,MSec:Word):TDateTime;procedureDecodeTime(Time:TdateTime,varHour,Min,Sec,MSec:Word);5.星期函数函数DayOfWeek用来返回日期所对应的星期数,其函数定义为:functionDayOfWeek(Date:TDateTime):Integer;6.日期与时间的格式函数FormatDateTime用来处理日期与时间的格式。其函数定义为:functionFormatDateTime(constFormat:String;DateTime:TDateTime):String;2.5.4顺序类型函数1.顺序类型2.顺序函数(1)序数函数Ord返回数据的序数,其定义为:functionOrd(X):Longint;(2)前趋函数Pred返回数据的前趋值,其定义为:functionPred(X);(3)后继函数Succ返回数据的后继值,其定义为:functionSucc(X);(4)首序数函数Low返回顺序型数据取值集合中的第一个值(序数最小),其定义为:functionLow(X);(5)末序数函数High返回顺序型数据取值集合中的最末一个值(序数最大),其定义为:functionHigh(X);

2.7顺序结构顺序结构是程序设计中最简单、最常用的基本结构。在个结构中,各操作块(简称块,对于程序中的“程序段”)按照出现的先后顺序以此执行。它是任何程序的基本结构,即使在选择结构或循环结构中,也常以顺序结构为其子结构。

2.8选择结构选择结构是根据所给定的条件成立(真)与否(假),而决定从各实际可能的不同分支中选择执行某一分支的相应操作的结构。在Delphi中,实现选择结构的是IF语句和Case语句。这两种语句又称为条件语句,条件语句的功能就是根据表达式的值有选择地执行一组语句。2.8.1IF语句

1.单分支的条件语句单分支条件语句的语法格式为:

IFe1THEN<语句1>;其中e1为Boolean表达式。单分支的条件语句的含义为当e1的值为真时,执行<语句1>,当e1的值为假时,则执行<语句1>下面的语句。2.双分支的条件语句双分支条件语句的语法格式为:

IFe1THEN<语句1>ELSE<语句2>;其中e1为Boolean表达式。双分支的条件语句的含义为当e1的值为真时,执行<语句1>,当e1的值为假时,则执行<语句2>。3.嵌套形式的条件语句嵌套形式条件语句的语法格式为:IFe1THEN<语句1>ELSEIFe2THEN<语句2>......ELSEIFenTHEN<语句n>ELSE<语句0>;2.8.2CASE语句CASE语句在很多情况下可以代替嵌套IF语句,去实现不同情况的选择,其语法格式为:CASEe1OFx1:<语句1>;x2:<语句2>;......xn:<语句n>;[ELSE<语句>;]END;注意:e1可以是任何返回值为有序类型(整型、字符型、布尔型、枚举型、子界型)的表达式,而x1~xn可以是一个数、一个定义过的变量或其它常量表达式,但必须是与e1兼容的有序类型。CASE语句的含义为,当e1的值与x1,x2,...,xn相同时,就执行它后面的语句,否则执行ELSE后面的<语句>。

2.9循环结构在程序设计中,从某处开始有规律地反复执行某一程序块的现象称为“循环”,完成这一功能的程序结构称为“循环结构”,而其中重复执行的程序块称为“循环体”。ObjectPascal提供的循环结构语句有3钟,它们分别是:While语句、Repeat语句以及For语句。2.9.1While(当型循环)语句当需要多次执行某一个(或一组)语句或一个程序段时,ObjectPascal提供三种可供选用的重复语句:WHILE、REPEAT和FOR语句。While语句的语法格式为:

WHILE<e1>DO[<语句>];当条件为真时,执行循环<语句>。1.Break(强制退出循环)语句Break语句用于从For语句、While语句或Repeat语句中强行退出。2.Continue(强制缩短循环)语句Continue语句用于从For语句、While语句或Repeat语句中强行结束本次循环,开始下一次循环。2.9.2Repeat(直到型循环)语句Repeat语句就是重复一个代码块的执行,直到满足条件为止。这种循环的执行次数是不确定的,其语法格式为:REPEAT<语句>;UNTIL<条件表达式>;<语句>被称为循环体。由于REPEAT语句是先执行循环体,再对表达式求值,所以REPEAT语句至少执行循环体一次。2.9.3For(计数型循环)语句1.FOR语句的一般形式For语句的语法格式为:

FORvar1:=exp1TO/DOWNTOexp2DO[<语句>];

这里exp1为初值表达式,exp2为终值表达式。在执行FOR语句的过程中,初值表达式和终值表达式只计算一次,FOR语句执行规定次数的循环。2.FOR语句的嵌套FOR语句的循环体还可以是一个FOR语句,从而构成多重循环。3.使用FOR语句的注意事项(1)在循环体内不能改变循环变量的值(2)循环变量的值在循环结束后不再确定4.三种循环语句的关系对已知循环次数的情形,可以使用FOR语句;对循环次数未知,而只知道循环的执行条件时,可以使用REPEAT语句或WHILE语句。若至少执行一次循环体,则用REPEAT语句,否则使用WHILE语句。实际上FOR语句也可以表示为REPEAT语句或WHILE语句。过程与函数过程的分类、创建、调用函数的创建、调用参数传递函数与过程的重载嵌套与递归变量的作用域

2.10过程与函数过程和函数都是能够完成某个(或某些)特定功能的程序段,它们在语法功能上相当于一个简单语句,也就是说在简单语句出现的地方,都可以使用过程或函数。过程和函数统称为例程,它们都是可以在程序中调用的实现特定功能的独立语句块,其区别在于函数可返回值,而过程则没有。Delphi本身提供了大量的内部例程,可以在程序中直接使用;用户也可以自定义例程或直接调用WindowsAPI函数。2.10.1过程Delphi的过程分为标准过程与自定义过程两种。标准过程是指系统内部定义的过程,无需编写代码,即可直接调用。而自定义过程则由用户自行编写代码以完成指定的操作,它包括事件过程与通用过程两类。事件过程依附与对象,是Delphi应用程序的主体,当该对象响应指定事件时被执行。通用过程告诉应用程序如何完成一项指定的任务。1.事件过程的创建和调用(1)事件过程的创建在对象观察器(ObjectInspector)中选择指定对象(控件),然后在事件(Events)选项卡中选择指定的事件名称,并用鼠标双击其右边的空白区域,Delphi将自动产生一个默认的事件过程。一个事件过程也可以被多个对象、多个事件共享。其方法是:首先为其中的一个对象事件建立事件过程,然后在创建其他对象的事件过程时,从事件名称右边的下拉列表中选择已经建立的事件过程名即可。(2)事件过程的调用我们可以在过程代码中调用已经创建的事件过程。如为按钮Button3创建独立的OnClick事件过程来调用已经存在的Button1Click事件过程:ProcedureTEorml.Button3Click(Sender:Tobject);beginForml.ButtonlClick(Sender);end;上述调用语句中的实际参数Sender还可以改为Forml.Button3,即:Forml.ButtonlClick(Forml.Button3);2.通用过程的语法格式通用过程在调用之前必须首先定义,定义一个通用过程也称为过程声明。过程声明要按照Delphi的语法,通用过程的语法格式与事件过程相仿,其一般形式为:Procedure<过程名>[(<形参表>)][<局部声明>]begin[<语句列>];end;以保留字Procedure开头的第一行,称为过程首部,其余部分称为过程体。(1)过程首部<过程名>使用与变量名相同的命名规则。一个过程只能有一个唯一的过程名。<行参表>由若干个形式参数组成,它指明了从调用过程传递给过程的实参(实际参数)个数和类型。所有的形式参数必须说明类型(有点像变量说明),相同类型的行参之间用逗号隔开,不同类型的行参之间用分号隔开。形参说明的格式为:

[Var|Const]<行参名>:<类型>I.变量参数若要将一个值从过程传递给调用者,则必须在定义它们时使用变量参数。在被调用的过程的形参表中的有关形参前加上保留字VAR定义变量参数。变量参数按传址方式传递参数,形参在过程中所作的改变,推出程序后将影响实参的值II.值参数值参数可以像过程的本地变量一样使用,其初值来自过程调用时的实参数,对值参数的修改并不影响实参数。值参数是按传值方式传递参数的,形参在过程中所作的改变,推出程序后不影响实参的值。III.常量参数常量参数可以像局部的只读变量来使用,其初值来自过程调用时的实参数,实参数必须是一个表达式,且表达式的类型不能是文件类型或包含文件的其它结构类型。在被调用的过程的形参表中的有关形参前加上保留字CONST。不允许在过程中给常量参数赋值,并且常量参数不能作为实参数传递给另一个过程或函数。(2)过程体过程体是一个程序段,由<局部声明>部分与可执行部分组成。<局部声明>部分用来声明该过程中所使用的类型、常量、变量,这些类型、常量、变量的作用范围只限于该过程内部,与过程体外的同名对象无关。在<局部声明>部分还可以包含另一个过程或函数声明(称为内嵌的过程或函数)。可执行部分由begin开始,以end结束,end后面要紧根一个分号。

3.通用过程的调用通用过程的调用通过过程语句来完成,过程语句的格式如下:

过程名(<实参表>);

如果过程没有形参时,过程语句的格式如下:

过程名;或

过程名();通用过程只能在其作用域内进行调用。通用过程的作用域在其声明之后。2.10.2函数

函数是子程序的另一种形式,当子程序的执行返回一个值时,使用函数就比较简单。Delphi提供了许多内部函数,如Sqrt、Cos或Format。当在程序中需要多次用到某一公式或要处理某一函数关系,而又没有现成的内部函数可以使用时,Delphi允许编写用户自定义的函数。

1.函数的语法格式与过程一样,函数也是一个独立的程序段,可读取参数、执行一系列语句并改变其参数的值。与过程不同的是,函数具有返回值。函数的语法格式为:

Function<函数名>[(<形参表>)]:<返回类型>;[<局部声明>]begin[<语法列>];end;以保留字Function开头的第一行,称为函数首部,其余部分称为函数体。

2.函数的调用函数的调用比较简单,可以像使用Delphi内部函数一样来调用函数,即在与函数返回值兼容的表达式中按下述格式调用:

<函数名>(<实参表>)与通用过程相同,函数只能在其作用域内进行调用,函数的作用域在其声明之后。函数可以没有参数,在调用无参函数时不发生虚实结合,调用无参函数得到一个固定的值。

2.10.3几个概念1.形式参数与实际参数过程定义头语句:

Procedure过程名(形式参数)函数定义头语句:

Function函数名(形式参数):函数类型过程调用:过程名(实参数)函数调用:函数名(实参数)【注】写在表达式中例:定义过程:Proceduretestsub(r:Integer,aa:Real,re:Boolean,cc:String,x:Int64)调用过程:testsub(18,cj,rr,“Test”,bm)2.参数传递方式(1)变量参数使用保留字var,传递方式为“按地址传递”,如果在过程或函数中改变形参变量的值,将同时影响实参变量的值。

(2)常量参数使用保留字Const,无论实参是否变量,常量参数在过程中总是被当作常量,其值不能被改变。

(3)值参数参数前面如果没有保留字,传递方式为“按值传递”,如果在过程或函数中改变形参变量的值,则所作变动不会影响实参变量。

(4)外部参数使用保留字out,传递方式为“按地址传递”,当调用含有外部参数的过程或函数时,所引用的实参变量的值将被舍弃,形参变量仅被用来作为一个容器来存储过程或函数执行的中间结果。

3.使用缺省参数

在声明过程或函数时,可以给形参指定一个缺省值,指定缺省值的方法是:在形参的类型后面使用“=”,并给出一个具体的值(常量)。如:ProcedureMyprocedure(x:Real,y:Real=10);begin…end;对上述过程,下面的两个调用语句是等效的:Myprocedure(a,10);Myprocedure(a);应该注意的是,在过程或函数定义中,不能让前面的形参有缺省值,而后面的形参没有。4.函数与过程的重载

在Delphi中,允许有名字相同而参数不同的过程或函数,这就是过程和函数的重载(Overload)。注意:在定义有默认参数的重载函数和过程时,必须让系统能从参数中区分出应该调用哪一个函数或过程,否则该定义是非法的。

5.嵌套与递归(1)过程或函数的嵌套在过程或函数的定义中,过程体或函数体的开始部分可以包含局部变量的定义,主要用于定义在本过程或函数中用到的局部变量,若在其中定义了其它的过程或函数,则称为过程或函数的嵌套。嵌套必须是完全包容的,不允许部分嵌套或交叉嵌套。嵌套可以是多层的,但只有同一层的过程或函数才能相互调用,另外外层的过程或函数也可以调用内层的过程或函数。(2)过程或函数的递归在过程或函数中调用自身称为递归调用,如果一个过程或函数直接调用自身,称为直接递归;内层过程或函数调用外层或同层之间的相互调用称为间接递归。6.变量的作用域

(1)公有变量与私有变量在单元的接口部分声明的变量属于公有变量,可以被其他单元引用。在单元的实现(implementation)部分声明的变量属于私有变量,不能被其他单元引用。(2)全程变量与局部变量在单元中的过程或函数中声明的变量,其有效范围仅限于该子程序本身,属于局部变量。而在子程序之前,implementation之后声明的变量可以为本单元中的所有子程序(过程或函数)引用,因此又属于全程变量。

全程变量在程序的TYPE区域定义,在整个程序中有效。变量作用域的实际情况要复杂得多,大体上有下列几种情况:1.在一个单元的Private部分定义的任何数据和方法在其它单元中看不到,也不能使用;2.在一个单元的interface部分定义的任何数据和方法都可被其它单元使用;3.在一个单元的Public部分定义的任何数据和方法都可被其它单元使用;访问其它单元中公共方法的格式为: 窗体名.公共方法名4.在一个单元的Implemantation定义的数据(和方法)是本单元的公有部分;5.在一个函数或者过程内部定义的数据(和方法)只能在其内部使用。

2.11Delphi的程序结构

一个Delphi应用程序对应一个工程,从程序结构的角度来看,它由一个主程序与若干个单元组成。

2.11.1主程序在Delphi的集成开发环境中,通过项目的方式对应用程序开发过程中的各类文件进行组织和管理。与所开发的应用程序有关的文件都组织在一个项目中,项目中的一些文件是在设计阶段产生的,另一些是在项目编译和连接后产生的。

工程文件是一个项目的主程序。在工程文件中,列出了该项目所使用的所有单元文件。通过单元文件的列表,编译器将分别编译每个单元文件,最后连接成可执行的文件(.EXE)或动态连接库(.DLL)工程文件.Dpr窗体.dfm,单元.pas等文件编译可执行文件.EXE动态链接库.DLL主程序的结构:

programProject1;{说明工程名}uses {指定工程中使用的单元,含无窗体单元}Forms,Unit1in'UNIT1.PAS'{Form1};{$R*.RES} {连接资源文件}begin {主程序块开始}Application.Initialize;{初始化}Application.CreateForm(TForm1,Form1); {生成窗体}Application.Run; {运行程序}end.{主程序块结束}2.11.2单元文件一个Delphi程序包括几个程序单元。其一为主程序单元(如标准工程的工程文件),其它为子程序单元。窗体都有相应单元,但单元未必对应窗体。单元构成:名称:默认为Unit1、Unit2,……;接口部分:单元间可互访该部分实现部分:包括了Pascal代码可选部分:Initialization和finalization,分别在程序启 动和终止时执行。Unit

单元名;Interface//接口部分Uses

需要访问的其它单元,包括定义类和组件的标准单元以及其它自定义单元

;Type

类、类型的定义;(类中有许多不同的成员,包括过程、函数、全局变量、数据类型等)Var

变量的定义;Implementation//实现部分{编译伪

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论