字符串类型
字符串类型事实上是一个一维的字符数组当您说明一个字符串型的变量时您应当指明这个字符串的大小下面是说明字符串类型的例子
type
MyString: string[];
var
MyName: MyString;
则变量MyName被说明成为最多可以包含个字符如果您没有说明字符串的大小Delphi会认为字符串包含最大值个字符给字符串赋值可以直接使用单引号括起的字串赋值
MyName := FrankSmith;或MyName := 张明
因为MyName是一个可以包含个字符的MyString型变量上文的两个的变量都是有效的一个汉字可以视作两个字符当您给字符串型变量赋的值多于定义数值时例如将MyName赋为FrankSmithFranklin则Delphi只会接受前个字符FrankSmithFran在内存中字符串通常占用比所说明的大小多一个字节的空间因为第一个位置是一个包含这个数组大小的字节您可以使用索引值来访问字符串的字符MyName[]可以得到MyName的第一个字符F
您可以使用Delphi丰富的运算符过程和函数来处理字符串型的变量和属性下面介绍几个常用的运算符和Delphi过程或函数
Concat和(+)功能相同都可以将多个字符串组合在一起建立一个较大的字符串Copy会返回一个字符串中的子字符串Delete在一个字符串中从一个指定位置起删除一定数目的字符Insert在一个字符串中插入一个字符串Length返回字符串的长度Pos返回一个子字符串在一个字符串中的位置即索引值
集合类型
集合类型是一群相同类型元素的组合这些类型必须是有限类型如整形布尔型字符型枚举型和子界型在检查一个值是否属于一个特定集合时集合类型非常有用下面的例程可以说明集合类型的用法
在窗体上加入一个编辑框和一个按钮清除编辑框中的文字在其上加上Caption为输入元音的标签Label并在编辑框的下方加入一个空的标签将按钮的Default属性改为True建立按钮的事件处理过程如下
procedure TFormButtonClick(Sender:TObject);
type
Tvowels=set of Char;
var
Vowels:TVowels;
begin
Vowels := [aeiou];
if EditText[] in Vowels then
LableCaption := 是元音;
else
LableCaption := 请再试;
end;
执行这个程序在编辑框中输入字母表达式EditText[] in Vowels的结果是布尔型的in是运算符用来判断字母是否存在于集合中输入的判别结果会显示在编辑框的下方以上就用到了集合类型TVowels
记录类型
记录是您的程序可以成组访问的一群数据的集合下面的例程说明了一个记录类型的用法
type
TEmployee=record
Name : string[];
YearHired:;
Salsry: Double;
Position: string[];
end;
记录包含可以保存数据的域每一个域有一个数据类型上文的记录TEmployee类型就含有四个域您可以用以下的方式说明记录型的变量
var
NewEmployeePromotedEmployee:TEmployee;
用如下的方法可以访问记录的单域
NewEmployeeSalary := ;
编写如下的语句可以给整个记录赋值
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 := UnitCalculate();
您可以在任何标识符如属性常量变量数据类型函数等之前加上库单元的名称您可以在自由地在任何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中未曾出现CA同样可以调用BC库单元在interface中说明的程序但如果B出现在A的interface部分的uses子句中那么库单元A便不能出现在B的interface的uses子句中因为这样会产生对库单元的循环访问当试图编译时会产生出现错误信息
程序库单元的实现部分
实现部分implementation中包含interface中说明的过程函数事件处理过程的具体实现程序代码这一部分可以有自己的额外说明但这些说明是私有的外部程序不能调用这些说明在interface中说明的函数实体必须在implementation部分出现可以使用标题简写只输入procedure或function保留字后面跟过程或函数的名称即可其后则是程序的实现部分了如果您在implementation部分说明任何常式其标题并未出现在interface部分则必须写全其标题部分
在implementation部分的uses子句中指定的库单元只供给本库单元的程序使用其interface中说明的程序其他使用本库单元的库单元不能访问这些在implementation的udes子句中库单元的说明因为在implementation后进行的库单元包含是私有的所以上例中如果C出现在B的implementation部分则A不能使用C的公有部分除非C出现在A的uses子句中在implementation中出现的循环访问是Delphi所允许的如果A的implemetation的uses子句中出现B则B的implementation部分也可以出现A