1、程序设计基础
1.1 注释
{
注释内容
}
(*
注释内容
*)
//注释内容
1.2 命名
组件命名
一般加前缀,例:
窗体Form类一般加frm前缀,frmLogin.frm
按钮类一般加b**tn
文本框组件一般加前缀edt等
数据模块窗体的命名
数据模块窗体的命名一般加后缀DM,如:
员工管理中的数据模块窗体可命名为:EmployeesDM.frm
单元文件的命名
如果单元文件有与它对应的窗体文件,单元文件一般应与窗体的文件名相同,如果是共用单元文件,除了要能 表达单元文件的功能外,还要加前缀u。
类命名
类名一般在前面加T,接口类型加I,异常类名前面加E。
1.3 标识符
- 必须是字母或下划线开头,不能以数字开头
- 标识符不能与保留字相同
- 默认状态下,Delphi7只能认为前255个字符是有意义的,超出的部分将自动舍去。
1.4 常量
声明方法
Const
常量名 = 常量值
//如:
Const
Pi = 3.1415926 ;
Hours = 24 ;
必须使用保留字Const,且常量声明使用“=”而不是“:=”,不能在程序中给常量另外赋值。
1.5 变量
它是内存中程序员给定的具有唯一名字的地址,它的值可以在改地址中进行存取。
声明变量
Var
变量名 : 类型名 ;
//例:
Var
MyName : string ;
MyAge : integer ;
2 基本数据类型
2.1 整数类型
Shortint(短整型) | -128~127 | 有符号8位 |
---|---|---|
Smallint(小整型) | -32768~72767 | 有符号16位 |
Longint(长整型) | -2147483648~2147483647 | 有符号32位 |
Int64(64位整型) | -2^63~2^63 | 有符号64位 |
Byte(字节型) | 0~255 | 无符号8位 |
Word(字型) | 0~65535 | 无符号16位 |
Longword(长字型) | 0~4294967295 | 无符号32位 |
顺序类行包括以以下几个标准函数
- Ord:取得序数类型的唯一对应值
- Pred:取得前续的数值
- Succ:取得后续的数值
- Low:返回可取值的最小一个
- High:返回可取值的最大一个
2.2 字符类型
AnsiChar | 8位 | 根据Ansi字符表排列 |
---|---|---|
WideChar | 16位 | 根据Unicode码排列 |
Char | 16位 | 通用字符类型,相当于WideChar |
2.3 布尔类型
Boolean、ByteBool、WordBool、LongBool
2.4 枚举类型
枚举类型通过枚举表示其值的标识符来定义一个有序集合。它们的次序根据标识符的位置而定。
语法:
Type
枚举类型名称 = (值1,值2,值3...值n);
//例(定义)
Type
WeekDays = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
//使用前除了定义还要声明
Var
WeekDay : WeekDays ;//WeekDays类型的变量WeekDay
//或者不用预先定义,直接声明+定义
Var
WeekDay : (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
2.5 子界类型
语法:
Type
子界类型名称 = 值域下界..值域上界 ;
例如
Type
Months = 1..12 ;
Caps = 'A'..'Z' ;
Const
A = 1 ;
B = 12 ;
Type
Months = A..B ;
子界的上界和下界必须是顺序类型,也必须位同一顺序类型。
2.6 集合类型
集合类型是多个具有相同类型元素的集合。集合中的元素是无序的,集合中的元素不能重复出现。
声明方法:
Type
集合类型名 = set of 集合元素类型
声明方法实例:
Type
Numbers = set of byte ;
集合类型的使用与枚举类型相同,使用时首先要声明:
Var
Number : Numbers ;
也可以直接声明集合类型变量:
Var
Number : set of Byte ;
3 高级数据类型
3.1 数组类型
数组时由同一类型的数据元素构成的数据结构,数组中的每一个元素都由一个唯一的索引号与它相对应,它们被顺序的安排在内存中的一段连续的存储区中。根据内存的分配方式不同可以分为静态数组和动态数组,根据数组的维度可以把数组分为一维数组、二维数组和多维数组。
3.1.1 静态数组
静态数组的大小与类型必须是确定的,在程序初始化的时候要为静态数组分配足够的内存空间。
静态数组声明:
Type
数组类型名 = Array[下标类型] of 基类型
示例:
Type
CompanyName = Array[1..20] of string ;//数组类型名 = Array[下标类型] of 基类型
Var
MyCompany : CompanyName ;
二维静态数组
Type
数组类型名 = Array[下标类型,下标类型] of 基类型
或
Type
数组类型名 = Array[下标类型] of Array[下标类型] of 基类型
3.1.2 动态数组
动态数组声明:
Type
数组类型名 = Array of 基类型
示例:
TyPe
CompanyName = Array of string ;
var
MyCompany : CompanyName ;
//另一种直接声明的方法
Var
变量名: Array of string ;
Var
MyCompany : Array of string ;
3.2 记录类型
由不同类型、数量固定的元素组成的数据集合。许多数据可以使用记录类型来表示和处理,如要描述一个学生的姓名、年龄、班级、住址等星系久可以用记录类型。
Type
Student = record
Name:String;
Age:integer;
Grade:String;
Addr:String;
end;
其中Student为记录类型名。record、end为保留字。
在record和end之间的为记录Student的域表,域表中的每一项称为记录的一个域,每个域的定义与变量的定义基本相同,由域名标识符(如Age)和类型说明(如integer)组成。
记录类型的声明格式:
Type
类型记录名 = record
域1 : 类型1 ;
域2 : 类型3 ;
域n : 类型n ;
end;
3.3 类类型
类是对具有相似特征和行为的事务的一种抽象。它定义了一个由域、属性、方法组成的数据结构。
声明格式:
Type
类名 = Class(父类名)
域
属性
方法
end;
示例:
Type
TPerson = class(Tobject)
Name : string ;
Age : integer ;
Addr : string ;
Procedure SetAge(Value : integer);
Function GetAge : integer ;
end ;
关于类类型声明说明如下:
- 类名可以是任何合法的标识符,一般以T开头。
- Class是保留字,它表明声明的类型是类类型。
- Class后括号内的是父类名,表明当前声明的类是从父类名指定的类派生。
- 类成员由域、方法、属性等组成,它与记录类型中的域相似,表示类的每个实例中的数据。
- 如果一个类的声明中含有域成员,那么域成员必须先于属性和方法声明。
- 声明了类后,与声明其他类型一样,可以创建这些类的多个实例。
- 不能在函数体或过程中声明类。
3.4 文件类型
文件类型有3种,分别是Text、File和用户自定义类型。其中Text和File为预定义类型,Text**对应的是以文本文件的格式(.txt)保存的外部文件,File类型文件**又称无类型文件,以这种类型定义的文件变量既可以用来实现对磁盘上文本文件的I/O操作,也可以实现对二进制文件的I/O操作,它主要用来实现计算机内部的底层文件的I/O操作。
用户自定义的文件类型声明一般形式为:
Type
文件类型名 = file of 基类型;
文件类型名可以是任何合法的标识符。file of 为保留字,用以指明当前定义的数据类型为文件类型。基类型决定文件中允许存放的数据类型,它必须是占固定存储空间的类型。
示例:
Type
TMingRiFile = file of integer ;
3.5 指针类型
指针类型一般的声明格式:
Type
指针类型名 = ^类型 ;
示例:
var
s1,s2 : ^string ;
s3 : string ;
begin
new(s1);
new(s2); //在内存中分配两个适用于存储字符串的数据存储单元并把单元地址写入指针s1,s2
s1^ := 'MingRiSoft';
s2^ := 'kaihongliu'; //在指针所指向的内存中存入两个字符串
s1 := s2 ; //把s1指向s2所指向的内容。即s1、s2都指向s2所指向的内容
s2^ := 'welcome you!'; //s2所指向的地址种内容改变
s3 : ='new memory';
s2 := @s3 ; //将s3的地址赋值给s2
s1^ := s2^ ; //将s2地址中的值,赋值给s1所指向的地址中
s3 := 'is right';
end;
s1^ := s2^ ; 将s2地址中的值,赋值给s1所指向的地址中,s1、s2所指向的地方不变,里面的值都变为s2中的值
s1 := s2 ; 将s2的地址赋值给s1,即s1指向s2所指向的地方,两个指向同一个地方。
3.6 过程类型
任何一个过程或函数去掉保留字Procedure或Function后面的过程名或函数名**就构成了过程类型。
Function GetAdd( x,y : integer ) : integer;
begin
result = x+y ;
end;
去掉函数名称“GetAdd”,则Function(x,y : integer) : integer ;就构成了一个过程类型变量。
声明过程变量的方法为:
Var
MyFunc : Function(x,y : integer):integer;
示例:
function numadd(x,y : integer):integer;
begin
result := x + y ;
end;
function numdec(x,y : integer):integer;
begin
result := x - y ;
end;
procedure TForm1.button1Click(Sender:TObject);
var
myf:function(x,y : integer):integer; //定义一个过程类
begin
myf := numadd; //将过程类型赋值为numadd
edit1.Text := inttostr(myf(5,3)); //结果为8
myf := numdec; //将过程类型赋值为numdec
edit2.Text := inttostr(myf(5,3)); //结果为2
end ;
3.7 变体类型
声明方法:
Var
MyVariant:Varient;
声明了Varient类型后,可以赋值给它除了Int64和结构类型以外的所有类型的值。
示例:
MyVarient := 200;
MyVarient := 'MingRiSoft';
MyVarient := 123.456;
使用Varient类型可以不用过多考虑数据类型,但是这样做浪费了大量的系统资源,程序执行的速度受很大影响。
3.8 类型转换
隐式转换:即从小向大转换。
强制类型转化:也叫显示转化,指从类型A到类型B的转换只能在某些情况下进行,转化的规则比较复杂,应该进行某种类型的处理。
将实数类型转化为整数类型时可以使用Trunc和Round
示例:
var
i:real;
j,k:integer;
begin
i:=1234.56;
j:=Trunc(i); //1234 即舍去后面的
k:=Round(i); //1235 即四舍五入
分支语句
语法:
case 条件表达式 of
条件1: 语句1;
条件2: 语句2;
条件3: 语句3;
......
条件n: 语句n;
else
其他语句;
end;
条件可以是一段内容,如:10~20,A~M等,也可数值与一段内容混合使用
function GetValue(itemp:integer):integer;
begin
case itemp of
1:result:=10;
2:result:=100;
3,5..10:result:=1000;
15:result:=10000;
else
result:=0;
end;
end;
4 过程与函数
根据完成功能和调用方法的不同,将小的程序段分成两类:过程和函数。
4.1 过程函数
过程的定义:过程是构成程序的一个基本单位,实现某一特定功能或若干功能的代码段。
优点:便于调试;可以实现代码复用。
定义:
procedure 过程标识符 (形式参数);
函数的定义:函数是子程序的另一种形式,也是编写程序时定义的一个语句序列。
与过程不同的是:函数不以实现某种操作为目的,而只是为了获得一个计算结果的值。该值是最终通过函数名返回给调用者,因此函数名具有值类型。
定义:
function 函数标识符():函数返回值类型标识符;
参数值问题
function GetNum(x:integer):integer;//参数值,x为被传入的参数复制一份的值
function FileExists(const FileName : string):Boolean; //常量参数,FileName不能被改变
function GetNum(var x: integer):integer; //变量参数,传入的x即为实际的x
function GetNum(out x: integer):integer; //外部参数,形参被赋值的时候,初始值被抛弃,x变为空【p66】
function GetNum(x:integer = 20 ; y:integer = 30 ; z:integer = 40):integer;//默认参数
begin
result := x+y+z ;
end;
//iSum := getnum(); 结果为90
//iSum := getnum(10); 结果为80
//iSum := getnum(10,20); 结果为70
//iSum := getnum(10,20,30); 结果为60
默认参数需要注意的几个问题:
- 给参数指定的默认值与参数的数值类型相兼容。
- 默认值必须是常数或常数表达式。
- 只有过程或函数值的类型参数和常量类型参数才可以具有默认参数。
- 在参数表中,默认参数后的其他参数也必须为默认参数,即默认参数只能出现在最后。
- 将两个或多个相同类型的参数定义成默认参数,必须给每个参数单独指定默认值,不能一起指定。
函数重载的两个规则:
- 每个函数或过程后面都必须加overload指令符。
- 参数数量或类型(或二者)必须不同,返回值的类型能用来区分不同的函数或过程。
单元文件:
unit Unitl; //单元首部
interface //接口部分。接口部分声明的过程或函数在整个单元内有效。
当其他单元引用该单元时,这些过程和函数可以被其他客户单元使用
implementation //实现部分。实现部分的隐含声明部分声明的过程或函数在单元内有效,但不能在单元外使用,
即使其他单元引用该单元,也不饿能使用这些过程或函数。
end. //单元结束
5 属性
一个类种属性定义了由这个类产生的对象的特征,这种特征能影响对象的可视化行为或者对它的操作。
属性与数据成员的区别在于
- 数据成员只表示存储对象种的数据的位置,而属性伴随着读或写数据的方法。
- 属性可以可视化的进行访问,而数据成员被封装在对象种,不能可视化的进行访问,只能在程序种通过对象方法访问他们。
属性声明格式:
property 属性名: 属性类型 read 数据成员名/方法名 write 数据成员名/方法名;
property:保留字,表示声明的是一个属性。
属性名:可以为任何合法的标识符。
属性类型:用来说明属性的数据类型。
read、write:与后面的数据成员名/方法名一起说明属性的读写。
类型判断操作符“is”
对象变量名 is 类名 ;
用来测定对象变量的类型与给定的对象变量是否相容,is是用来判断对象的类而不是对象本身,即该对象的类是否是右操作数的同类或派生类。
类型强制转换符“as”
对象变量 as 类名;
as操作符强制把一个对象变量的类型转换为另一个类的类型,或者把一个接口变量转换为另一个接口的类型,表达式的类型是as运算符右边的类和接口的类型。
想要转换的对象所声明的类必须是目标类的后代或祖先,否则类的类型不兼容将导致转换失败。as进行类型强制转换时首先测试然后进行转换,如果转换不成功会引发异常。为了安全起见,优势要使用is操作符来判断对象的类型,这样可以避免转换时出现异常。
隐含参数“self”
在普通方法种,self变量的值是对象的引用,在一个类的方法种,self变量的值是类的引用。
动态创建对象
语法:
var
对象名:对象类;
begin
对象名 := 对象类.create(self); (或对象名 := 对象类.create(nil); )
end;
对象名:delphi种合法的标识符
对象类:Delphi种的对象或用户自定义的类
create:create方法用来创建对象