Delphi面向对象的编程方法(六)
字符串类型
字符串类型事实上是一个一维的字符数组 当您说明一个字符串型的变量时 您应当指明这个字符串的大小 下面是说明字符串类型的例子
type MyString: string[ ]; var MyName: MyString;
则变量MyName被说明成为最多可以包含 个字符 如果您没有说明字符串的大小 Delphi会认为字符串包含最大值 个字符 给字符串赋值可以直接使用单引号括起的字串赋值
MyName := Frank Smith ;或MyName := 张明
因为MyName是一个可以包含 个字符的MyString型变量 上文的两个的变量都是有效的 一个汉字可以视作两个字符 当您给字符串型变量赋的值多于定义数值时 例如将MyName赋为 FrankSmith Franklin 则Delphi只会接受前 个字符 FrankSmith Fran 在内存中 字符串通常占用比所说明的大小多一个字节的空间 因为第一个位置是一个包含这个数组大小的字节 您可以使用索引值来访问字符串的字符 MyName[ ]可以得到MyName的第一个字符 F
您可以使用Delphi丰富的运算符 过程和函数来处理字符串型的变量和属性 下面介绍几个常用的运算符和Delphi过程或函数
Concat和(+)功能相同 都可以将多个字符串组合在一起 建立一个较大的字符串 Copy会返回一个字符串中的子字符串 Delete在一个字符串中从一个指定位置起删除一定数目的字符 Insert在一个字符串中插入一个字符串 Length返回字符串的长度 Pos返回一个子字符串在一个字符串中的位置 即索引值
集合类型
集合类型是一群相同类型元素的组合 这些类型必须是有限类型如整形 布尔型 字符型 枚举型和子界型 在检查一个值是否属于一个特定集合时 集合类型非常有用 下面的例程可以说明集合类型的用法
在窗体上加入一个编辑框和一个按钮 清除编辑框中的文字 在其上加上Caption为 输入元音 的标签Label 并在编辑框的下方加入一个空的标签 将按钮的Default属性改为True 建立按钮的事件处理过程如下
procedure TForm Button Click(Sender:TObject); type Tvowels=set of Char; var Vowels:TVowels; begin Vowels := [ a e i o u ]; if Edit Text[ ] in Vowels then Lable Caption := 是元音 ; else Lable Caption := 请再试 ; end;
执行这个程序 在编辑框中输入字母 表达式Edit Text[ ] in Vowels的结果是布尔型的 in是运算符 用来判断字母是否存在于集合中 输入的判别结果会显示在编辑框的下方 以上就用到了集合类型TVowels
记录类型
记录是您的程序可以成组访问的一群数据的集合 下面的例程说明了一个记录类型的用法
type TEmployee=record Name : string[ ]; YearHired: ; Salsry: Double; Position: string[ ]; end;
记录包含可以保存数据的域 每一个域有一个数据类型 上文的记录TEmployee类型就含有四个域 您可以用以下的方式说明记录型的变量
var NewEmployee PromotedEmployee:TEmployee;
用如下的方法可以访问记录的单域
NewEmployee Salary := ;
编写如下的语句可以给整个记录赋值
with PromotedEmployee do begin Name := ; YearHired := ; Salary := Position := editor ; end;
您的程序可以将记录当成单一实体来操作
PromptEmployee := NewEmployee;
以上介绍了用户常用的自定义类型 在Delphi的编程中 对象是非常重要的用户自定义数据类型 象记录一样 对象是结构化的数据类型 它包含数据的域(Field) 也包含作为方法的过程和函数 在Delphi中 当您向窗体中加入一个部件 也就是向窗体对象中加入了一个域 每一个部件也是对象 每当您建立一个事件处理过程使得部件可以响应一个事件时 您即自动地在窗体中加入了一个方法 在本章第 节中 将详细讲述Delphi面向对象编程的方法和技巧
Object Pascal的库单元Unit
Units是常量 变量 数据类型 过程和函数的集合 而且能够被多个应用程序所共享 Delphi已经拥有许多预定义的程序库单元可供您建立您的程序库单元使用 Delphi的Visual Component Library由多个程序库单元组成 它们说明了对象 部件以供您的应用程序用来设计用户界面 例如 当您在窗体中加入一个Check Box时 Delphi自动在您的程序库单元中加入了Stdctrls库单元 因为TCheckBox部件是在StdCtrls库单元中说明的
当您设计您的窗体时 Delphi自动建立一个和您的窗体有关的库单元 您的库单元不必都和窗体有关 也可以使用预定义的只包含数学运算函数的库单元 或是自行编写数学函数库单元 在一个库单元中所有的说明都相互有关系 例如 CDialogs程序库单元包含了在您的应用程序中使用的普通对话框的所有说明 Object Pascal程序库单元的结构
不管一个库单元是否和一个窗体有关 库单元的结构都是相同的 其结构如下
unit <库单元名称> interface uses <选择性的库单元列表> {公有说明} implementation uses <选择性的库单元列表> 在implementation部分的uses子句中指定的库单元 只供给本库单元的程序使用其interface中说明的程序 其他使用本库单元的库单元 不能访问这些在implementation的udes子句中库单元的说明 因为在implementation后进行的库单元包含是私有的 所以上例中 如果C出现在B的implementation部分 则A不能使用C的公有部分 除非C出现在A的uses子句中 在implementation中出现的循环访问是Delphi所允许的 如果A的implemetation的uses子句中出现B 则B的implementation部分也可以出现A
程序库单元的初始化部分
初始化当前库单元所使用的数据 或是通过interface部分将数据提供给其他应用程序 库单元使用时 您可以在库单元中加入一个initialization部分 在库单元的end前加上您的初始化语句 当一个应用程序使用一个库单元时 在库单元中的initialization部分会先于其他的代码执行 如果一个应用程序使用了多个库单元 则每一个库单元的初始化部分都会在所有的程序代码前执行
使用Delphi的可视化部件及其库单元
当您在窗体中加入可视化部件时 如果该部件在可视化部件库中 Delphi会在您的库单元的interface部分的uses子句中自动加上需要使用的库单元名称 但有些对象在Delphi的环境中并没有可视化部件存在 例如 您想在库单元中加入一个预定义的信息框 则您必须把MsgDlg库单元加入您的uses子句中 如果您要使用TPrinter对象的话 必须将Printer库单元加入uses子句中 在在线帮助中可以查到对象所属的预定义库单元 要使用在其他库单元中说明的函数 应在函数的前面加上这一库单元的名称 并用 号隔开 例如 要在Unit 中使用Unit 中说明的Calculate函数 应使用下面的方法
Number := Unit Calculate( );
您可以在任何标识符如属性 常量 变量 数据类型 函数等之前加上库单元的名称 您可以在自由地在任何Delphi库单元中加入程序代码 但不要改变由Delphi生成的程序
建立与窗体无关的新库单元
如果您想在工程中建立一个和任何窗体无关的新库单元 可以现选用File|New Unit 这时一个新的库单元加入了工程 新库单元的代码如下
unit Unit ; interface implementation end
Delphi将根据您的工程中的文件数目为您的库单元选择名称 您可以在程序骨架间加入您的程序代码
当编译您的工程时 这个新加入的库单元会被编译为一个具有 DCU后缀的文件 这个新生成的文件是链接到工程的可执行文件上的机器代码
{私有说明} {过程和函数的执行部分} initialization {选择性的} {选择性的初始化程序} end
程序库单元的接口部分
interface是库单元的接口部分 它决定了本库单元对其他任何库单元或程序的可见(可访问)部分 您可以在接口部分说明变量 常量 数据类型 过程和函数等等 Delphi在您设计窗体的库单元中 将窗体数据类型 窗体变量和事件处理过程都说明在这一部分
interface标志库单元接口部分的开始 在interface中的说明对要使用这些说明的其他库单元或应用程序是可见的 一个库单元可以使用其他Unit的说明 只需要在uses子句中指明那些库单元即可 例如 您在库单元A中编写程序代码 且您想调用UnitB于interface部分说明的程序 您可以把库单元B的名称加入到A的interface部分的uses子句中 则任何A中的程序都可以调用B中说明的程序 而且 如果B中interface部分的uses子句中出现C库单元 尽管A中未曾出现C A同样可以调用B C库单元在interface中说明的程序 但如果B出现在A的interface部分的uses子句中 那么库单元A便不能出现在B的interface的uses子句中 因为这样会产生对库单元的循环访问 当试图编译时 会产生出现错误信息
程序库单元的实现部分
lishixinzhi/Article/program/Delphi/201311/8489