




已阅读5页,还剩84页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Marcos Delphi Books Essential Pascal - Web Site Essential Pascal - Local Index PASCAL精要 第一章 Pascal历史回顾 Delphi中使用的面向对象pascal编程语言并不是borland公司1995年发布可视化开发环境Delphi时才有的,它只是已有borland pascal产品的简单扩展。 Borland没有发明pascal,但它推广并扩展了pascal。这一章对pascal语言的历史背景及其发展历程作一简短回顾。沃斯的pascal Pascal 语言最初由瑞士苏黎士理工学院的尼古拉斯-沃斯(Niklaus Wirth)教授在1971年设计, 作为Algol语言(1960年设计)简化本用于教学目的。设计Pascal时,许多编程语言业已存在,但只有FORTRAN、C、Assembler、COBOL等少数语言在广泛应用。Pascal这种新语言的灵魂是其语言规则,Pascal语言规则的管理是通过强健的数据类型概念、强制性的数据类型声明与程序结构化控制来实现的,当时设计Pascal的初衷是想把这种语言用作程序设计课程的教学工具。Turbo Pascal 1983年Borland公司推出了世界闻名的Pascal编译器 - Turbo Pascal,实现了詹森和沃斯(Jensen & Wirth)在 “Pascal User Manual and Report” 中提出的思想 。由于既简洁功能又强,Turbo Pascal成为当时最畅销的编译器之一,而且在PC平台上非常流行。Turbo Pascal中增添了集成开发环境(IDE),在这种开发环境中,你可在与WordStar 兼容的文字编辑器中编辑代码,可以运行编译器,查看编译错误并直接跳回到包含错误的行中。现在听起来上述功能似乎微不足道,但在Turbo Pascal之前你不得不退出代码编辑器返回到DOS,然后运行命令行编译器,记下错误行,再打开编辑器跳至错误行,非常烦琐。此外,Borland公司的Turbo Pascal 售价只49美元 ,而Microsoft公司的 Pascal 编译器售价几百美元。 Turbo Pascal 取得多年的成功应归功于Microsoft最终放弃了Pascal 编译器产品。Delphi中的Pascal 随着Turbo Pascal 编译器从第一版发布到第九版,Pascal语言得到了不断的发展,1995年Borland发布了Delphi ,使Pascal成为一种可视化编程语言。Delphi 在很多方面扩展了Pascal语言,其中包括许多面向对象的扩展,这些扩展的风格与Object Pascal有所不同,同时Delphi 也提高了Borland Pascal with Objects 编译器的性能。下一章: 编写 Pascal 代码 Copyright Marco Cant, Wintech Italia Srl 1995-2000 Marcos Delphi Books Essential Pascal - Web Site Essential Pascal - Local Index PASCAL精要 第二章 编写Pascal代码 进入正题前先谈一下Pascal代码编写风格的问题。“除了遵循语法规则外,你应该怎样来写代码呢?” 关于这个问题各人答案会有不同,因为各人喜欢的风格不同。总的来说,任何编码风格的目标都是使代码清楚、明晰,采用某种风格和格式只是一种简略方法,用于更清楚地表达你的代码要干什么。实现代码清楚明晰的基本原则是保持代码的一致性,也就是无论选用哪种风格,在整个工程中要始终保持同一风格。注释 在Pascal中,注释括在大括号中或带星号的圆括号中。Delphi 也认可C+ 风格的注释,即把注释放在双斜线后。例如this is a comment(* this is another comment *)/ this is a comment up to the end of the line第一种注释方式较简略,使用也较为普遍;第二种方式在欧洲使用较广 ,因为欧洲的键盘缺少大括号;第三种方式的注释是从C+借用来的,只在32位版本的Delphi中可用,它在给一行代码加短注释时非常有用。在这本书中我用斜体表示注释,用粗体表示关键词,以此与默认的Delphi语法风格表示一致。上述三种不同的注释方式有益于进行嵌套注释。例如你要注销一段代码,而代码行中又包含真正的注释行,这时采用同一种注释方式是不对的: . codecomment, creating problems. code 正确的方法是插入第二种注释方式: . code/this comment is OK. code 注意:如果左大括号或圆括号-星号后面跟美元符号($),那么其中的内容就成了编译指令,如 $X+。实际上,编译指令仍是注释。例如,$X+ This is a comment 是合法的。这既是有效的编译指令又是一条注释,尽管明智的程序员很可能会注意把编译指令和注释分开。使用大写字母 Pascal 编译器(不象其他语言的编译器)不考虑字符的大小写,因此标识符Myname、 MyName、 myname、 myName、 和MYNAME是完全相同的。总体上来说,这是Pascal的一大优点,因为在大小写敏感的语言中,许多语法错误是由不正确的大写引起的。注意:Pascal语言的大小写不敏感特性有一个例外:控件包中的Register 过程必须以大写字母R开始,因为需要与C+Builder 兼容。然而大小写不敏感也有不便之处:第一,你必须注意大小写不一致的标识符实际上是相同的,以避免把他们当成不同的元素使用;第二,你必须尽量保持大写使用的一致性,以提高代码的可读性。大写使用的一致性不是编译器强制要求的,但是保持大写使用的一致性是值得提倡的好习惯。一个常用的方法是将每个标识符的第一个字母大写,标识符若由几个词组合而成(中间不能插入空格),每个词的第一个字母应大写:MyLongIdentifierMyVeryLongAndAlmostStupidIdentifier此外,编译器不编译代码中的空格、空行和Tab键空格,这些元素通称为空白,它们只用来提高代码的可读性,不影响编译过程。不同于BASIC, Pascal 语句允许分行书写,即将一条长指令分割成两个或更多的代码行。允许语句分行的缺点(至少对许多BASIC程序员)是:语句结束时不能忘了加分号,更确切地说,必须记着把语句和紧接它的语句分开。语句分行唯一的限制是字符串不能跨行。关于空格和语句分行的使用没有既定的规则,以下是几点经验: Delphi 代码编辑器中有一条竖线叫右边线(Right Margin),你可以把右边线设置在60或70个字符处。如果以这条线为基准,代码不超过这条界限,那么打印到纸上的代码看起来会很好看。否则,打印时长语句会被随意分行,甚至在一个词的中间断开。 当一个函数或过程有多个参数,通常的做法是把各参数放在不同的行上。 你可以在注释行前留一行空白,或把长的代码句分成较小的部分,这样能提高代码的可读性。 用空格隔开函数调用的参数,表达式中的运算符也最好用空格隔开。一些程序员可能会对这些提议不以为然,但我坚持认为:空格是免费的,你不必为使用空格付费,何乐而不为呢? 优化版面 关于代码编写风格的最后一条建议是:尽量使用空白优化版面。这一条很容易做到,只需要在写复合句时,以上一句为参照,下一句向右缩进两个空格,复合句内嵌的复合句缩进四个空格,依此类推。例如:if . then statement;if . thenbegin statement1; statement2;end;if . thenbegin if . then statement1; statement2;end;相似的缩进格式常用于变量或数据类型声名区,也可用于语句的续行:type Letters = set of Char;var Name: string;begin long comment and long statement, going on in the following line and indented two spaces MessageDlg (This is a message, mtInformation, mbOk, 0);提出以上代码编写格式只是向你建个议而已,这样代码能更加易读,其实代码格式并不影响编译结果。在本书的例子和代码段中我始终坚持使用上述代码风格,Delphi 中的源代码、手册和帮助例子均采用了相似的格式化风格。突出Pascal元素 为了使Pascal 代码更易读写,Delphi 编辑器中增加了Pascal 元素的色彩设置功能,也就是编辑器会用不同的颜色表示不同的Pascal 元素。缺省情况下,关键字以粗体表示,字符串和注释用蓝色表示(并且常常是斜体)。用不同色彩显示不同的Pascal 元素对保留字、注释和字符串十分有利,因为着色后你一眼就可以看出拼错的关键字、没有正常结束的字符串及多行注释。使用编辑器环境选项对话框中的色彩(Color)页,很容易就能定制各种Pascal 元素的色彩(见图2.1)。如果独自工作,那么你可随意选择喜欢的颜色。如果是与其他程序员合作,那么应该使用大家统一的标准颜色。我感觉在同一台计算机上使用我不习惯的色彩配置确实很难受。图2.1 编辑环境设置对话框 注意:本书中我选用了一种色彩方案来显示源代码清单,希望能使代码更易读。 使用代码模板 Delphi 3 中增加了用于代码编辑的新功能“代码模板”。由于写Pascal 语句时,常常会重复键入相同的一组关键字,为此Borland 公司开发了名为“代码模板”的新功能,代码模板中存放了能与代码缩略形式对应的完整代码,你输入缩略代码,然后按Ctrl+J,完整的代码就出现了。例如,你输入arrayd,然后按Ctrl+J,Delphi 编辑器会把你的文本扩展为:array 0. of ;由于同一种代码结构在预定义的代码模板中通常有多种样式,所以模板中的缩略形式一般加有一个后缀字母,以便你选用。此外,你也可以只输入缩略形式的头几个字母,如你输ar,然后按Ctrl+J,那么,编辑器中会弹出一个菜单,菜单中列出了代码缩略形式选项,见图2.2所示。图2.2 代码模板选项 代码模板可以定制,就是你可以修改已有的模板也可以添加自己常用的代码段。用代码模板输入的代码文本中通常会出现|字符,它表示输入模板代码后光标应跳到的位置,就是说你应该从这个光标位置开始输入,写完这句代码。编程语句 标识符一经定义 ,你就可以在语句及组成语句的表达式中使用它们。Pascal 提供了许多语句和表达式,首先来看看关键字、表达式和运算符。关键字 关键字是Object Pascal 的保留标识符,在语言中有着特殊含义。保留字不能用作标识符,指令字也同样不应该用作标识符,即使编译器允许也最好不用。在实际中你不应该把任何关键字用作标识符。表2.1是面向对象 Pascal 语言(Delphi 4)中特殊标识符的完整列表,其中包括关键字及保留字。表2.1:面向对象Pascal语言中的关键字及保留字 关键字 作用absolute 指令 (变量)abstract 指令 (方法)and 运算符 (布尔)array 类型as 运算符 (RTTI)asm 语句assembler 向后兼容 (汇编)at 语句 (异常处理)automated 访问类别符 (类)begin 块标记case 语句cdecl 函数调用协定class 类型const 声明或指令(参数)constructor 特殊方法contains 运算符 (集合)default 指令 (属性)destructor 特殊方法dispid dispinterface 界面类别符dispinterface类型div 运算符do 语句downto 语句 (for)dynamic 指令 (方法)else 语句 (if 或 case)end 块标记except 语句 (异常处理)export 向后兼容 (类)exports 声明external 指令 (函数)far 向后兼容 (类)file 类型finalization单元结构finally 语句 (异常处理)for 语句forward 函数指令function 声明goto 语句if 语句implementation单元结构implements 指令 (属性)in 运算符 (集合) - 工程结构index 指令 (dipinterface界面)inherited 语句initialization单元结构inline 向后兼容 (见 asm)interface 类型is 运算符 (RTTI)label 声明library 程序结构message 指令 (方法)mod 运算符 (数学)name 指令 (函数)near 向后兼容 (类)nil 数值nodefault 指令 (属性)not 运算符 (布尔)object 向后兼容 (类)of 语句 (case)on 语句 (异常处理)or 运算符 (布尔)out 指令 (参数)overload 函数指令override 函数指令package 程序结构 (控件包)packed 指令 (记录)pascal 函数调用协定private 访问类别符 (class)procedure 声明program 程序结构property 声明protected 访问类别符 (类)public 访问类别符 (类)published 访问类别符 (类)raise 语句 (异常处理)read 属性类别符readonly dispatch 界面类别符record 类型register 函数调用协定reintroduce 函数指令repeat 语句requires 程序结构 (控件包)resident 指令 (函数)resourcestring类型safecall 函数调用协定set 类型shl 运算符 (数学)shr 运算符 (数学)stdcall 函数调用协定stored 指令 (属性)string 类型then 语句 (if)threadvar 声明to 语句 (for)try 语句 (异常处理)type 声明unit 单元结构until 语句uses 单元结构var 声明virtual 指令 (方法)while 语句with 语句write 属性类别符writeonly dispatch 界面类别符xor 运算符 (布尔)表达式和运算符 建立表达式没有通用的方法,因为要取决于所用的运算符,Pascal包括有逻辑运算符、算术运算符、布尔运算符、关系运算符和集合运算符等等。表达式可用于确定赋给一个变量的值、计算函数或过程的参数、或者判断一个条件,表达式也可以包含函数调用。表达式是对一个标识符的值而不是标识符本身进行运算。所有编程语言中的表达式都是常量、变量、数值、运算符和函数值的合法组合。表达式可以传递给过程或函数的值参,但不能传递给过程或函数中的引用参数。运算符及其优先级 如果你以前写过程序,那么你已经知道表达式是什么了。这里我专门讲一下Pascal 运算符的特殊部分:运算符的优先级。表2.2中按优先级分组列出了Pascal语言的运算符。与大多数编程语言相反,Pascal语言中and和or运算符的优先级比关系运算符高。因此,如果你的代码为a b and c d,编译器首先会编译and运算符,由此导致编译出错。为此你应该把每个 表达式用小括号括起来: (a b) and (c d)。 同一种运算符用于不同数据类型时它的作用不同。例如,运算符 + 可以计算两个数字的和、连接两个字符串、求两个集合的并集、甚至给PChar 指针加一个偏移量。然而,你不能象在C语言中那样将两个字符相加。另一个特殊的运算符是 div。在Pascal 中,你能用 / 计算两个数字(实数或整数)的商,而且你总能得到一个实型结果。如果计算两个整数的商并想要一个整型结果,那么就需要用 div 运算符。表 2.2: Pascal语言中的运算符及其优先级 单目运算符 (最高优先级)取变量或函数的地址(返回一个指针)not逻辑取反或按位取反乘除及按位运算符*相乘或集合交集/浮点相除div整数相除mod取模 (整数相除的余数)as程序运行阶段类型转换 (RTTI运算符)and逻辑或按位求和shl按位左移shr按位右移加减运算符+相加、集合并集、字符串连接或指针增加一个偏移量-相减、集合差集或指针减少一个偏移量or逻辑或按位或运算xor逻辑或按位异或运算关系及比较运算符(最低优先级)=判断是否相等判断是否不相等判断是否大于=判断是否大于或等于,或是否是一个集合的父集in判断是否是集合成员is判断对象是否类型兼容 (又一个RTTI运算符)集合运算符 集合运算符包括并(+)、差(-)、交(*)、成员检测(in),及一些关系运算符。要把一个元素添加到集合中,你可以采用集合并运算。下面是一个选择字体的Delphi 例子:Style := Style + fsBold;Style := Style + fsBold, fsItalic - fsUnderline;另一种方法是利用标准过程Include 和Exclude,它们效率更高(但不能用于控件的集合类型属性,因为只能操纵一个元素):Include (Style, fsBold);结束语 从上面内容我们已经了解了Pascal 程序的基本布局,下面开始探究它的细节。先从预定义和自定义数据类型开始,然后是利用关键词组织编程语句。下一章: 类型、变量及常量 Copyright Marco Cant, Wintech Italia Srl 1995-2000 Marcos Delphi Books Essential Pascal - Web Site Essential Pascal - Local Index PASCAL精要 第三章类型、变量及常量 最初的Pascal 语言是以一些简单的概念为基础建立起来的,这些概念现在普遍出现在编程语言中。最重要的概念当属数据类型,数据类型决定了变量可取的值,以及可在这些值上进行的操作。Pascal 数据类型的概念强于C语言及早期的BASIC语言,在C语言中算术数据类型是可以互换的,而早期的BASIC语言中根本没有与数据类型相似的概念。变量 Pascal 变量在使用前必须声明,声明变量时必须指定一种数据类型。下面是变量声明的例子:var Value: Integer; IsCorrect: Boolean; A, B: Char;关键字var可以在许多地方使用,例如放在函数或过程的开始部分,用来声明函数或过程的局部变量;也可以放在单元中,用于声明全程变量。var关键字之后是一组变量名列表,每个变量名后跟一个冒号和数据类型名,一行中可以声明多个变量,如上例中最后一句。一旦变量的类型被指定,你只能对变量执行该变量类型支持的操作。例如,在判断操作中用布尔值,在数字表达式中用整型值,你不能将布尔值和整型值混用(在C语言中可以这样)。使用简单的赋值语句,可写出下面的代码:Value := 10;IsCorrect := True;但下面的语句是不正确的,因为两个变量数据类型不同:Value := IsCorrect; / error在Delphi中编译这句代码,会出现错误信息:Incompatible types: Integer and Boolean.(类型不兼容:整型和布尔型)。象这样的错误通常是编程错误,因为把一个 True 或 False 的值赋给一个整型变量没有什么意义。你不该责怪Delphi 提示这样的错误信息,代码中有不对的地方Delphi当然要提出警告。把变量的值从一种类型转换到另一种类型往往不难做到,有些情况下类型转换会自动实现,不过一般情况下需要调用特殊的系统函数,通过改变数据内部表示来实现类型转换。在Delphi 中,当你声明全程变量时,你可以赋给它一个初值。例如,你可以这样写:var Value: Integer = 10; Correct: Boolean = True;这种初始化方法只能用于全程变量,不能用于过程或方法的变量。常量 对于在程序运行期间保持不变的值,Pascal 允许通过常量来声明。声明常量不必特定数据类型,但需要赋一个初值。编译器会根据所赋初值自动选用合适的数据类型。例如:const Thousand = 1000; Pi = 3.14; AuthorName = Marco Cant;Delphi 根据常量的值来决定它的数据类型。上例中的Thousand 变量,Delphi会选用SmallInt数据类型 (短整型-能容纳Thousand变量的最小整数类型)。如果你想告诉Delphi 采用特定的类型,你可在声明中加入类型名,方法如下:const Thousand: Integer = 1000;对于声名的常量,编译器有两种编译选择:第一种为常量分配内存,并把常量的值放入内存;第二种在常量每次使用时复制常量值。第二种方法比较适合简单常量。注意:16位的Delphi 允许你在程序运行期间改变已定义的常量值,就象一个变量一样。32位的Delphi为了向后兼容仍容许这种操作,只要你附加 $J 编译指令,或选择工程选项对话框中Compiler (编译器) 页的Assignable typed constants复选框就行。尽管如此,这里我还是要强烈建议万不得以不要使用上述操作,因为把新值赋给常量将使编译器不能对常量进行优化,与其如此不如直接声明一个变量。资源串常量 当定义字符串常量时,你可这样写:const AuthorName = Marco Cant;从Delphi 3 开始,你可以用另一种方式写:resourcestring AuthorName = Marco Cant;上面两个语句都定义了一个常量,也就是定义了一个在程序运行期间保持不变的值,但两者的实现过程却不同,用resourcestring 指令定义的字符串变量将被保存到程序资源的字符串表中。从例子ResStr你可了解资源串的实际作用,例子中设置了一个按钮, 相应代码如下:resourcestring AuthorName = Marco Cant; BookName = Essential Pascal;procedure TForm1.Button1Click(Sender: TObject);begin ShowMessage (BookName + #13 + AuthorName);end;以上代码中的两个字符串将分两行输出显示,因为字符串被分行符 #13 隔开。有趣的是,当你用资源编辑器打开执行文件时,你会在程序资源中看到你所定义的字符串。这意味着字符串并没有进入编译代码,而是保存在执行文件 (EXE文件) 的一个单独区域。注意:简而言之,采用资源的好处一方面可让Windows 来完成有效的内存处理,另一方面不用更改源代码就可实现程序的本地化 (把字符串翻译成不同的语言)。数据类型 Pascal 中有多种预定义的数据类型,它们可分为三大类:有序数据类型,实数类型和字符串类型。下面我们先讨论有序类型和实数类型,字符串类型放在以后讨论。同时这一节还将介绍几种Delphi 库中定义的类型 (不是编译器预定义的类型),这些类型也可看作是预定义的类型。Delphi 还包括一种无类型的可变数据类型,称作variant,在本书的第十章将讨论这一类型。variant是一种无需类型检测的数据类型,它在Delphi 2 中引入,用于处理OLE Automation(OLE 自动化)。有序类型 有序类型是建立在概念“顺序”或“序列”基础上的数据类型。你不仅可比较两个有序值的大小,而且可以求取给定有序值的前驱及后继,或者计算它们的最大或最小值。三种最重要的预定义有序类型是整数类型、布尔类型和字符类型(Integer,Boolean,Char)。各种类型根据其内部表示和取值范围不同又可进一步细分。表3.1列出了表示数字的有序数据类型。表 3.1: 表示数字的有序数据类型 大小有符号值域无符号值域8 bitsShortInt-128 to 127Byte0 to 25516 bitsSmallInt-32768 to 32767Word0 to 65,53532 bitsLongInt-2,147,483,648 to 2,147,483,647LongWord (从 Delphi 4)0 to 4,294,967,29564 bitsInt6416/32 bitsIntegerCardinal从表中可看到,不同数据类型与不同的数据表示法相对应,这要取决于数据值的数位和符号位。有符号类型的数值可正可负,但取值范围较小,因为符号位占一个数位。下一节在例Range中说明了每种类型的实际取值范围。表中最后一组类型标志着16/32,它表明其数值表示方法在16位和32位Delphi中不同,该组的Integer及Cardinal 类型比较常用,因为它们与CPU内部的数字表示法相对应。Delphi 4中的整数类型 在 Delphi 3中,Cardinal类型所表示的32位无符号值实际占31位,取值最高为20亿。Delphi 4新增了一种无符号数字类型-LongWord,它是真正的32位值,取值最高达40亿。现在Cardinal 类型已成了LongWord类型的别名,只是LongWord能容纳大于20亿的无符号数,而且它的数值表示法与CPU内部数值表示法一致。Delphi 4 中新增的另一个数据类型是Int64 类型,这一类型能表示长达18个数字的整数。系统中的有序类型例程(如High 和Low)、数字例程(如Inc 和 Dec)及字符串转换例程(如IntToStr)都支持这一新类型。反过来,有两个新增的专用函数StrToInt64 和 StrToInt64Def支持从字符串向数字的转换。布尔类型 布尔值不同于布尔类型,平时很少用到。ByteBool、 WordBool 和LongBool这三种布尔类型的布尔值比较特殊,只在Windows API 函数中才用到它们。在Delphi 3 中,为了与Visual Basic 和 OLE Automation兼容,修改了ByteBool、 WordBool 和LongBool的布尔值,将TRUE值设置为1,FALSE值仍为0;Boolean类型布尔值保持不变(TRUE为1,FALSE为0)。如果在Delphi 2代码中使用了布尔值显式类型转换 ,那么在以后的Delphi中可能会出错。字符类型 字符有两种不同的表示法:: ANSIChar 和 WideChar。第一种类型代表 8 位的字符,与Windows一直沿用的ANSI(美国国家标准协会)字符集相应;第二种类型代表 16 位的字符,与Windows NT、Windows 95 和 98支持的双字节字符(Unicode)相应。在Delphi 3 中,Char 类型字符与ANSIChar一致。切记,不管在什么环境,前 256 个Unicode 字符与ANSI 字符是完全一致的。常量字符可用代表它们的符号表示,如k,也可用数字符号表示,如 #78。后者还可用Chr函数表示为 Chr(78),用Ord函数可作相反的转换Ord(k)。一般来说,对字母、数字或符号,用代表它们的符号来表示较好;而涉及到特殊字符时用数字符号较好。下面列出了常用的特殊字符: #9 跳格 (Tab 键) #10 换行 #13 回车 (Enter 键) 一个例子:Range 为使你对一些有序类型的不同取值范围有一个认识,我写了一个名为Range 的Delphi程序简例。结果见图3.1。图3.1 简例Range显示有序数据类型信息(本例中采用整型)Range 程序基于一个简单的窗体,上面有六个按扭 (按有序数据类型命名),还有几个标签(Label)用于显示信息,见图3.1。窗体最左边的一列标签显示的是静态文本,左边第二列标签在每次单击按扭时显示数据类型信息。每当你按一下窗体右边的一个按钮,程序就会更新第二列标签的显示内容,显示的内容包括数据类型、字节数、该类型可存储的最大值和最小值。每个按钮都带有各自的OnClick 事件,因为各自的计算代码略有不同。例如,以下是Integer按钮(BtnInteger)OnClick 事件的源代码:procedure TFormRange.BtnIntegerClick(Sender: TObject);begin LabelType.Caption := Integer; LabelSize.Caption := IntToStr (SizeOf (Integer); LabelMax.Caption := IntToStr (High (Integer); LabelMin.Caption := IntToStr (Low (Integer);end;如果你有Delphi 编程经验,你可以看一下程序的源代码,弄明白程序到底是如何工作的。对于初学者,注意一下SizeOf、 High、 Low这三个函数的使用就可以了。High、 Low两个函数返回与参数相同的有序类型(这里是整型),SizeOf 函数返回整型数据。函数的返回值先用IntToStr 函数转成字符串,然后赋给三个标签的caption属性 。其他按钮事件与上面相似,唯一的不同点在于传递给函数的参数类型是不同的。图3.2 显示了Windows 95 下的16位Delphi编译程序的执行结果。比较图3.1和图3.2,可以看出16位整型和32位整型之间的差异。图3.2 :16位Delphi中Range程序运行结果显示的整型信息整型类型的字节大小取决于你所使用的CPU和操作系统。在16位的Windows中,整型变量占两个字节,在32位的Windows中,整型变量占4个字节。因此,在两个环境中编译的Range程序会得到不同的结果。如果你的程序对整数类型的字节大小没有特殊要求,Integer 类型在不同版本中的差异并不是个大问题。如果你在一个版本中保存了一个整数,那么在另一个版本中取出这个整数时可能会遇到一些问题,这种情况下,你应该采用平台无关的数据类型如 LongInt 或 SmallInt。对于数学计算或非特殊的代码中,你最好的选择是坚持使用平台相应的标准整型,这就是说,使用CPU最喜欢的整型类型。当处理整数时,Integer 应是你的首选,不到迫不得已最好不要采用其他的整型类型。有序类型系统例程 Pascal 语言和Delphi System 单元中定义了一系列有序类型操作例程,见表 3.2。C+ 程序员会注意到其中的Inc 例程,它可与 + 和 += 运算符对应(Dec 例程也同样)。表 3.2: 有序类型系统例程 例程作用Dec将例程中的参数值递减1或一个特定的值,其中特定值可在第二个可选参数中定义 Inc将例程中的参数值增加1或一个特定的值 Odd如果参数为奇数返回真 Pred根据参数在其数据类型定义中的序列,返回参数值的前驱值 Succ返回参数值的后继值 Ord返回参数值在其数据类型值集合中的序号 Low返回参数对应的有序数据类型的最小取值 High返回参数对应的有序数据类型的最大取值 注意,当有些例程用于常量时,编译器会自动用计算值替代例程。例如你调用High(X) ,设定X为一个整数,那么编译器会用整数类型中最大的可能值代替这个表达式。实数类型 实数类型代表不同格式的浮点数。Single类型占的字节数最小,为4个字节;其次是Double 浮点类型,占8个字节;Extended 浮点类型,占10个字节。这些不同精度的浮点数据类型都与IEEE( 电气和电子工程师协会)标准的浮点数表示法一致,并且 CPU数字协处理器直接支持这些类型,处理速度也最快。Real 类型在Delphi 2 和 Delphi 3 中的定义与 16 位版本一样,都占 6 个字节。不过Borland公司一直不提倡使用这种类型,而建议用Single、 Double、 Extended 类型代替。这是由于 Real 这种 6 字节的旧格式既不受 Intel CPU 的支持,又没有列在官方的IEEE 实型中。为了完全解决这一问题,Delphi 4 不得不修改 Real 类型的定义,将其改成标准的 8 字节浮点型, 由此引起了兼容性问题,不过如果有必要,你可以采用下面编译指令克服兼容性问题,恢复Delphi 2 和 Delphi 3 的Real 类型定义:$REALCOMPATIBILITY ON另外还有两种奇怪的数据类型:Comp 类型和Currency 类型,Comp 类型用 8 个字节描述非常大的整数(这种类型可支持带有 18 位小数的数字);Currency 类型 (16 位版的Delphi不支持该类型) 表示一个有四位小数位的值,它的小数位长度是固定的,同Comp 类型一样也占 8 个字节。正如名字所示,Currency 数据类型是为了操作很精确的四位小数货币数值才添加的。对实型数据,我们没办法编一个类似Range的程序,因为High 、Low及 Ord函数不能用于实型值。理论上说实型类型代表一个无限的数字集合;有序类型代表一个有限的数字集合。注意:让我进一步把上述问题解释一下。对于整数 23,你能确定23 后面的数是什么 ,因为整型数是有限的,它们有确定的值域范围及排列顺序。而浮点数即使在一个很小的值域范围内也无限、无序。 事实上,在 23 和 24 之间有多少值? 哪个值是 23.46 后面的值? 23.47 还是 23.461,或者 23.4601? 这是很难说清的。因此,如问Char 类型字符 w 的顺序位置是有意义的, 但同样的问题对浮点类型数 7134.1562 就毫无意义。对于一个实型数,你能确切知道有没有比它大的实型数,但是,如想探究给定的实数前到底有多少个实型数(这是Ord 函数的作用),是得不到结果的。实型类型在用户界面编程中用得不多,但是Delphi从各方面支持实型类型,包括在数据库方面的支持。由于支持IEEE浮点数运算标准,Object Pascal 语言完全适合于各类数值计算编程。如果对这部分感兴趣,你可以参考Delphi 在System单元中提供的算术函数(详细见Delphi 帮助)。注意:Delphi 带有一个Math 单元,其中定义了一些高级数学例程,这些例程包括三角函数(如ArcCosh 函数)、金融函数(如InterestPayment 函数)和统计函数(如MeanAndStdDev 过程)。有些例程,它的名字听起来很怪,如MomentSkewKurtosis 例程,它是作什么用的呢? 还是留你自己查吧。日期和时间 Delphi 也用实型数表示日期和时间数据。但为了更准确起见,Delphi 特别定义了TDateTime 数据类型,这是一个浮点类型,因为这个类型必须足够宽,使变量能容纳年、月、日、时、分和秒、甚至毫秒。日期值按天计数,从1899-12-30开始,放在TDateTime 类型的整数部分;时间值则位于十进制数的小数部分。TDateTime 不是编译器可直接识别的预定义类型,它在System单元定义:type TDateTime = type Double;使用TDateTime 类型很简单,因为Delphi 为该类型定义了一系列操作函数,表3.3列出了这些函数。表3.3: TDateTime类型系统例程 例程作用 Now返回当前日期及时间 Date返回当前日期 Time返回当前时间 DateTimeToStr按缺省格式将日期和时间值转换为字符串;特定格式转换可用 FormatDateTime函数 DateTimeToString按缺省格式将日期和时间值拷贝到字符串缓冲区 DateToStr将TDateTime值的日期部分转为字符串 TimeToStr将TDateTime值的时间部分转为字符串 FormatDateTime按特定格式将日期和时间值转换为字符串 StrToDateTime将带有日期和时间信息的字符串转换为TdateTime类型值,如串有误将引发一个异常 StrToDate将带有日期信息的字符串转换为TDateTime类型格式 StrToTime将带有时间信息的字符串转换为TDateTime类型格式 DayOfWeek根据传递的日期参数计算该日期是一星期中的第几天 DecodeDate根据日期值返回年、月、日值 DecodeTime根据时间值返回时、分、秒、毫秒值 EncodeDate组合年、月、日值为TDateTime类型值 EncodeTime组合时、分、秒、毫秒值为TDateTime类型值 为了显示怎样使用日期时间类型及其相关例程,我建了一个简单的例子TimeNow。该例子在主窗体中设置了一个按钮和一个列表框(ListBox)。开始执行时,程序自动计算并显示当前的时间及日期,以后每次单击按钮 ,显示从程序开始至当前的时间。下面列出了窗体的OnCreate 事件代码:procedure TFormTimeNow.FormCreate(Sender: TObject);begin StartTime := Now; ListBox1.Items.Add (TimeToStr (StartTime); ListBox1.Items.Add (DateToStr (StartTime); ListBox1.Items.Add (Press button for elapsed time);end;第一句中调用了Now 函数,这个函数返回当前的日期和时间,它的值保存在StartTime 变量中,StartTime 变量是全程变量,其声明如下:var FormTimeNow: TFormTimeNow; StartTime: TDateTime;我只添加了第二个声明,第一个是由Delphi自动添加的。默认情况下的代码如下:var Form1: TForm1;窗体名改变后,这个声明被自动更新。使用全程变量实际上不是最好的办法,更好的方法是使用窗体类的私有域,这涉及到面向对象的编程技术。接下来的三个语句向位于窗体左面的列表框添加三个条目,结果见图3.3。列表框中的第一行显示了TDateTime 值的时间部分字符串、第二行显示的是同一值的日期部分,最后一行显示了一个简单的提示。图 3.3:例TimeNow启动时的输出显示当用户单击Elapsed 按钮时,上图第三行字符串被程序的计算结果代替:procedure TFormTimeNow.ButtonElapsedClick(Sender: TObject);var StopTime: TDateTime;begin StopTime := Now; ListBox1.Items 2 := FormatDateTime (hh:nn:ss, StopTime - StartTime);end;这串代码再次计算当前的时间,并显示当前与程序开始之时的时间差,其中用到了其它事件中的计算值,为此不得不把该值存入全程变量。实际上,最好是采用基于类的变量。注意:上面代码中所用ListBox的索引号为2,而它代表的是第三行的显示输出,其原因是listbox的数据项是从零开始计数的:第一项计为0,第二项为1,第三项为2,依次类推,后面涉及数组时再详细讨论这方面内容。除了调用TimeToStr和 DateTo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西玉林市2022-2023学年九年级上学期期中化学试题(含答案)
- 2025医用眼科器械消毒处理标准流程
- 高级茶艺师基础知识培训课件
- 高端养老院长培训课件
- 备考三支一扶考试真题及答案
- 电焊搭棚知识培训内容课件
- 北京辅警文员考试真题及答案
- 北航安全准入考试题库及答案
- 保山学院开学考试试题及答案
- 脑筋转弯考试题及答案
- 2026届广州市高三年级阶段训练(8月市调研摸底) 语地理试卷(含答案)
- 网络安全测验题目及答案
- 2025至2030中国密封圈行业项目调研及市场前景预测评估报告
- 2025苏教版三年级上册数学教学计划 (三篇)
- 2025-2026学年湘科版(2017)小学科学四年级上册教学计划及进度表
- 微量物证检验技术
- 2025-2026学年苏教版(2024)小学数学一年级上册教学计划及进度表
- 2025年幼儿园指南考试题目及答案
- 医美行业监管趋势下2025年美容整形手术的市场需求与消费者行为分析报告
- 2025年中煤财务岗笔试题及答案
- 中西医结合医师岗位面试问题及答案
评论
0/150
提交评论