⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 book1.mdb

📁 不用说了!看看就明白了!
💻 MDB
📖 第 1 页 / 共 5 页
字号:
  常量像简单类型常量一样,集合类型常量用来定义一组常量的集合。例如:
type TDigits = set of 0..9;
TLetters = set of 'A'..'Z';
const EvenDigits: TDigits = [0, 2, 4, 6, 8];
Vowels: TLetters = ['A', 'E', 'I', 'O', 'U', 'Y'];
  上面的例子首先定义两个集合类型TDigits和Tletters,然后定义了两个集合常量,其中EvenDigits的值域是[0, 2, 4, 6, 8],它为TDigits的一个子集;Vowels的值域是 ['A', 'E', 'I', 'O', 'U', 'Y'],它为TLetters的一个子集。
3.记录类型
  记录是一系列相关的变量,这些变量被称为域,它们放在一起,作为一个整体使用。例如,一个雇员可能包含姓名、雇用时间、薪金等数据,这时你可以像下面那样定义一个雇员记录类型:
type TEmployee = record LastName: String[20];
FirstName:String[15];
YearHired:1990..2000; 
Salary:Double;
Position:string[20]; 
end;
  Pascal的记录类型跟数据库中的记录很相似,记录类型中的元素可以理解为数据库中的字段,事实上Pascal正是借用了数据库中的记录和字段的概念。
(1)记录类型的定义
  下面是声明记录类型的语法规则 
 记录可以一个字段也没有,即为空记录;一个记录可以有一个固定部分(fixed part),在固定部分,每个字段都有其确定的标识符和数据类型,它们在内存中分别占用不同的区域;一个记录也可以加入一个可变部分(variantpart)。声明记录变量与声明其它类型变量一样,下面是两个记录变量的说明:
 var NewEmployee,PromotedEmployee:TEmployee; 
 记录类型中的每个域都有一种数据类型,你既可以单独访问这些域,也可以把记录作为一个整体来使用。例如,你可以像下面那样访问NewEmployee记录中的Salary域或整个记录:
NewEmployee.Salary:=43211.00; 
PromotedEmployee:=NewEmployee;
  当你要访问记录内的域时,需要指定记录名,并在记录名后加(.),然后跟上域名。例如:
PromotedEmployee.Position
  如果要对多个域赋值,则每个域前都必须加记录名。例如: 
PromotedEmployee.LastName :='Gates'
PromotedEmployee.FirstName:='Bill'
PromotedEmployee.YearHired:=1990;
PromotedEmployee.Salary:=92339.00;
PromotedEmployee.Position:='Manager'
 ?Pascal提供了With语句,使你可以减少重复书写记录名的烦恼。With语句的语法是: With记录变量名Do ...
  每个可变部分由至少由一个常量(Constant)标识,所有常量必须是唯一的,并且类型为与tag field type指定类型相容的类型。Identifier用于记录可变部分的可选部分,称为识别字段标识符。如果定义了识别字段标识符,程序可以使用该标识符决定在给定的时间内哪个可变部分是活动的,如果没有定义识别字段标识符,程序必须根据其它规则选定记录可变部分。
  下面是带有可变部分的记录类型的例子:
type TPolygon = record X, Y: Real; 
case Kind: Figure of 
  TRectangle: (Height, Width: Real);
  TTriangle: (Side1, Side2, Angle: Real);
  TCircle: (Radius: Real); 
End;
 注意:记录可变部分的字段不能是长字符串类型和变体类型,也不能含有长字符串类型和变体类型分量的构造类型。 
(2)记录类型常量
  记录常量的每个字段都是类型常量,
  一个记录类型常量每个字段由一个标识符和类型常量组成,不同字段用分号隔开,字段部分用括号括起。像简单类型常量一样,记录类型常量用来定义一个记录常量,下面是一些例子。
type TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); 
TDate = record D: 1..31; 
M: Month; 
Y: 1900..1999;
end;
const
  SomeDay: TDate = (D: 2; M: Dec; Y: 1960);
  上面的例子首先定义一个记录类型TDate,然后定义了一个记录常量SomeDay。注意:记录类型常量中个字段的出现顺序必须与记录类型定义中的顺序一致。如果记录类型包括文件类型字段,则不能定义该记录的记录常量。如果记录类型包括可变部分,则只有被选择的可变部分可以定义常量。
4.文件类型
  文件是指相同类型元素的有序集合。Delphi处理文件有三种方式,一种是使用Object Pascal标准的文件处理技术;一种是使用Windows的文件处理函数;还有一种是使用文件流对象。
  Object Pascal标准的文件处理技术,有专门的数据类型和文件处理例程,并且与Windows的标准API不兼容,但对于熟悉Pascal的用户来说,仍然是操作文件的好选择。下面我们就对此进行介绍。
  声明一个文件类型的语法如下: type fileTypeName = file of type
  这里,fileTypeName是任何有效的标识符, type是一种大小固定的数据类型,称之为基类型。 基类型不能使用指针类型,不能包括动态数组、长字符串、类、对象、指针、可变类型以及其它文件类型。但可以是其它结构类型,例如:
type 
PhoneEntry = record FirstName, LastName: string[20];
PhoneNumber: string[15];
Listed: Boolean; 
end; 
PhoneList = file of PhoneEntry;
  这里,PhoneEntry是自定义的结构类型,PhoneList是以PhoneEntry为基类型的文件类型。在定义了文件类型后,就可以直接定义文件类型的变量了。例如:
  var List1: PhoneList;
  有时侯,我们也可以使用file of基类型的方式直接定义文件类型变量。例如下面的定义与上面的形式有同样的效果: 
  var List1: file of PhoneEntry;
  如果我们在声明文件类型时不指明其基类型。则这样的文件我们称之为无类型文件,如: 
  var DataFile: file;
  无类型文件主要用于直接访问磁盘文件的多层I/O操作。6.3.4 指针类型指针类型对程序员来说可能是最复杂和最灵活的数据类型。当你在Delphi中创建一个数据结构时,首先要分配内存空间。分配的内存空间用于存储数据结构中的数据。而指针就是指向分配空间的内存地址。使用指针,可以使程序不必每次需要时都去分配,只要申请一次即可,其它过程或函数使用同一块内存空间时,只要使用该内存空间的地址。例如,假设你的一个邻居问你怎样去百货店,你并不需要把整个百货店搬到邻居家里,只需要告诉它去百货店的路径即可,这个路径类似于一个指针。
1.指针类型的声明
  声明指针类型的语法规则见图6.10。
  其中基类型可以是简单类型,也可以是前面介绍的结构,或只是一个标识符。如果基类型是一个未定义的类型标识符的话,则该类型标识符必须在同一块内声明。
  下面是带有指针类型声明的例子:
type WordPtr =^Word;
RealPtr =^Real;
PersonType=Record LAstNAme:String; 
FirstNAme:String; Age:Integer;
end; 
PersonPointer = ^PersonType;
  上例中,声明了三个指针类型,一个是WordPtr,指向^Word,一个是RealPtr,指向^Real,还有一个是PersonPointer,指向一个标识符,而该标识符标识一个记录类型。
  声明了指针类型之后,就可以声明指针类型变量,
  例如:Var WP:WordPtr; 
      RP:RealPtr;
      Person:PersonPointer;
2.指针的使用
  Delphi提供专门的过程和函数操作指针,这些过程和函数是:New过程,@操作符,PTR函数,GetMem过程。下面分别介绍。
(1)New过程
  New过程是 Pascal中的标准例程(在System单元声明),用于在应用程序堆栈中为动态变量申请一块区域,并把该区域的地址赋予指针变量。New过程的语法为: 
  procedure New(var P: Pointer);
  其中P是一个指针变量。所分配区域的大小由指针变量P的基类型决定。如果在应用程序堆栈中没有足够的内存空间供分配,将触发EOutOfMemory异常。
  新分配的内存空间由P指向,P^即为类型的动态变量。应用程序不再需要该动态变量时,可以调用Dispose标准例程释放为该变量分配的内存空间。 
 下面是使用New过程的举例: 
type PListEntry = ^TListEntry;
TListEntry = record 
  Next: PListEntry;
  Text: string; 
 Count: Integer;
end;
var List, P: PListEntry;
begin
... 
New(P);
P^.Next := List; 
P^.Text := 'Hello world';
P^.Count := 1; 
List := P; 
Dispose(P);
... 
end;
  上例中,声明了一个指针类型 PListEntry,指向标识符 TListEntry,而该标识符标识一个记录类型 TlistEntry,然后定义了两个指针变量List和P。程序首先用New过程在应用程序堆栈中为动态变量申请一块区域,并把该区域的地址赋予指针变量P。P^即为记录类型TListEntry的动态变量。不再需要该动态变量后时,调用Dispose释放为该变量分配的内存空间。
(2)@操作符
  @操作符是个一元操作符,用于获得操作数的地址,其使用语法见图6.11。
  从图中可以知道,@后面的操作数可以是变量、过程、函数或类类型中的方法。
  程序示例如下:
procedure ChangeValue(X:Integer)
  Var IntPtr:^Integer;
begin 
 IntPtr:=@X; 
  Writeln(IntPtr^); 
  IntPtr^:=20;
end;
  假设主程序如下:
begin 
Param:=10; 
ChangeValue(param); 
Writeln(Param); {10} 
end;
  上例中,ChangeVAlue过程首先声明了一个指向整型数的指针Ptr,然后用@操作符取出X的地址赋予IntPtr指针,并显示Ptr指针指向的数,最后改变这个数。
(3)PTR函数
  Ptr函数是 Pascal中的标准例程(在System单元声明),用于把一个指定的地址转换为指针。Ptr函数的语法为: 
  function Ptr(Address: Integer): Pointer;
  其中Address是一个整数,用于表示一个32位地址,函数执行的结果是把32位地址转化为指针。
(4)GetMem过程
  GetMem过程也是Pascal中的标准例程(在System单元声明),类似于New,用于在应用程序堆栈中为动态变量申请一块指定大小的区域,并把该区域的地址赋予指针变量。GetMem函数的语法为:
  procedure GetMem(var P: Pointer; Size: Integer);
  其中P是一个指针变量,Size指定区域的字节数。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -