Delphi 6.0编程指南 陈嵘 2001年 60期 Delphi是当前最强大,最灵活的基于Windows的可视化应用程序开发工具。它将可视化技术与Object Pascal语言完美结合,具有良好的数据库访问能力,是一个非常强大的应用程序开发组件的集合,被喻为“第四代编程语言”。Delphi 6.0是Borland公司继Delphi 5.0后的又一力作。   #1 一、Delphi 6.0新特性    (1)Delphi 6.0通过完全基于SOAP的网络服务和XML数据交换支持,从根本上简化了在互联网上构筑下一代电子商务的程序。XML及网络服务技术和Delphi 6.0的无缝融合为工业标准化的网络服务和互联网上B2B、B2C和P2P的集成带来了唯一的快速开发工具。    (2)WebSnap使得Delphi能够直接融入当今的网站开发团队。通过WebSnap,Delphi程序能够无缝地集成到网站和使用现今流行的HTML开发环境(如Dreamweaver、FrontPage、VBScript和JavaScript)的网站开发团队中。    (3)编写单一源代码的Windows/Linux程序。Delphi 6.0和Kylix兼容,使用交叉平台的CLX控件库和可视化设计器编写的高性能、可移动式的Windows程序能在Linux上用Borland Kylix轻松编译。    (4)支持最新的Windows 2000/Me和Office 2000图形用户接口。通过ActionBands、ActionManagers和Shell Controls可以轻松制作最流行的、符合微软UI最新趋势的动态用户界面。通过让最终用户完全自定义他们自己的UI使用来排除复杂的用户界面。   #1 二、Delphi的IDE环境    当我们打开Delphi 6.0的时候,首先进入的就是它的集成开发环境(Integrated Development Environment,IDE),我们编写、运行和调试程序就是在这个环境中完成的。    在Delphi 6.0中,集成开发环境由碟码编辑器、调试器、工具栏、图像编辑器和数据库工具组成,所有这些以集成的方式进行操作。如下(^60090203a^)所示。    1.主菜单    主菜单是位于屏幕最顶端的主控窗口的菜单栏,通过它几乎可以访问所有的Delphi的提供工具。    2.工具条    工具条提供了一组快捷的按钮来让用户能迅速访问到Delphi 6.0中常用的功能。    3.控件模板    位于主控窗口工具条右边的就是控件模板,通常我们也将它们称为Delphi的组件。Delphi 6.0将很多功能相近的控件放在同一个控件组中。    按一般情况来说,只需要双击一个控件就可以把它放到应用程序的窗体中去。使用Delphi进行编程大部分情况就是使用各种控件,只要掌握了基本控件的使用方法,你就可以很方便地编制出一般的应用程序了。    4.窗体设计器    当你第一次运行Delphi 6.0的时候,在整个界面的中间可以看到一个标题栏为Form1的窗体,这就是窗体设计器。在这个设计器中,你可以对要开发的应用程序的外观进行设置,它是整个Delphi应用程序设计的基础。    在Delphi 6.0的窗体设计器是所见即所得的,你可以在窗体上任意放置自己所需要的可视或者是不可视控件。    5.代码编辑器    位于窗体设计器的下方的那一块编辑区域称为代码编辑器。在Delphi 6.0中,代码编辑器由两部分组成,左侧是一个代码分析器,它可以让你很方便地找到应用程序中的类、各种定义的方法和变量等。右侧则是用户输入代码的地方,我们从代码编辑器窗体上的标签可以看到,现在打开的文件是Unit1.Pas文件,每一个编辑的文件都可以打开在一个标签页中,你可以通过点击标签的方法方便地在工程的各个文件之间进行切换。    代码编辑器是程序员编程的一个环境,几乎所有的代码都在这个地方进行输入、运行和调试。Delphi 6.0提供的代码编辑器除了具有一般文字编辑器的功能外,还有很多体贴的设计。例如当你在输入代码时,Delphi会自动分析你的代码,以各种不同的颜色和状态来区别不同的代码、函数和关键字。例如,在默认的设置中,关键字是黑体的,数字是蓝色的,而注释的段落则是斜体的,这样能方便程序员整理和组织自己的代码。    另外值得一提的是,在Delphi中,代码编辑器有一种很神奇的功能,称为Code Insight,当输入Delphi所能识别的对象名称并打上一个“.”的时候,Delphi会自动分析这个对象所具有的属性和方法,把它直接放在“.”后面的下拉列表中去,这样你可以直接在下拉列表框中选择所需要的东西就行了。同时,当你在写程序需要调用一个过程或方法的时候,只要输入了该方法的名称,然后加一个“(”,Delphi就可以智能地将所需要的参数依次列出;在应用程序调试的时候,如果将光标放在某个变量或表达式上停留一段时间,Delphi就会自动列出表达式的值。    6.对象观察器    在Delphi 6.0整个界面的最右边,有一个称为“Object Inspector”的窗体,它就是对象观察器了。    一个对象观察器由两个标签页组成:Properties(属性)和Event(事件),当我们在窗体设计器中选中一个控件,它所对应的属性和事件就会列在这个对象观察器中。   #1 三、基本语法    (一)声明常量    比如要声明一个为a的常量:    const    a=100 //声明值为100的常量    注意:常量最好选取一个好记的字母组合,具有一定的表述性,不要超过63个字符,用字母或下划线开头,同样,后面的变量也遵从这一原则。    (二)声明变量    比如要声明一个为a的变量,方法如下:    Var    a:real; //声明一个real变量    对于声明多个变量,可使用逗号将其隔开,其方法如下:    Var    a,b,c:real; //声明三个real变量    这里,real表示这是一个real类型的变量。    (三)数据类型    1.整数类型    首先我们来看看熟悉的整数,不同的数据类型所需要的内存空间是不一样的,在整数这个范围里面,同样也存在不同的类型划分,下面给出整数类型表。    (^60090203c^)    2.实数类型    很显然,实数在对付小数方面有得天独厚的优势,当人们在为了你的财务软件丢失了后面的零数跟你没完的时候,实数类型就是你的救星。下面是实数类型表:    (^60090203b^)    3.字符类型    Delphi给我们提供了Char、ANSIChar、WideChar类型,支持单代码标准,Char、ANSIChar类型基本等价,它们都能容纳一个ASCII字符,WideChar能容纳一个单代码字符Unicode。下面是字符类型表:    (^60090203d^)    4.串类型    (^60090203e^)    我们看到string类型长度可以到达3GB,因为Delphi支持长串。其编译指令$H+是默认有效的,所以string类型可以几乎容纳无限长度的串,在这种状态下,string类型等价于Ansistring类型,你可以动态分配。它是空字节结束的串,从而保持了良好的兼容性。我们还可以在声明字符串变量的时候规定其长度。    Var    Debtor1: string; //声明一个字符串    Debtor2: string[6] //声明一个固定长度为6个字符的字符串    5.布尔类型    布尔(Boolean)类型其实就是Yes或者No,True或者False。布尔型的变量就是逻辑量,可以进行逻辑运算,也就是说,你可以进行逻辑运算操作,为了保持兼容性,Delphi给我们提供了五种类型,我们来看看下表。    (^60090203f^)    (四)数据结构    1.数组    你可以按照自己意愿,将许多单个简单的数据类型创建成自己的数据结构,在你的财务软件中,你可以把这些债务人的名字都放到一个数组,这就是一维数组。声明数组方法如下:    Type    DebtorArray=array[1]..10] of string; //数组的声明,上界1,下界10    Var    Debtors: DebtorArray;    我们自己定义的类型DebtorArray就像使用integer、string等一样,你可以把它看作是一个简单的类型,也可以看成简单类型的集合,它的每一个元素都是一个简单的string类型。    如果你的债务人变量需要按照不同的金额范围分为不同的组,那么二维数组就排上用场了,方法如下:    Type    DebtorArray =array[1…10,1..10] of string; //定义一个二维数组类型    Var    Debtors: DebtorArray;    2.记录类型    你现在可以通过使用记录类型来给你的数组里面每一个人的加上详细资料了,记录类型也是简单类型创建来的,它的每个元素都不一定像数组一样必须拥有相同的类型,可以把不同类型的数据统统容纳下来,我们来看看具体怎么做。    Type    RecordDebtors=record //记录类型的定义    Name:string;    Address:string;    Phone:string;    Age:nteger;    End;    //定义一个二维数组类型,数组成员是上面定义的记录类型    DebtorArray=array[1..10,1..10]of RecordDebtors;    Var    Debtors: DebtorArray;    这里,我们定义了一个二维的数组,这个数组的每一个元素都包括name、address、phone、age这几个简单类型。由此可见,数据结构的创建是很灵活的,主要是你的需要是什么,你就可以创建相应的结构。    3.子界    子界就是限制,边界。子界作为一种结构限制了任意一种简单数据可用的值的范围。我们来看看子界的用法。    Type    Debtorsrand=′a′..′z′;    Var    Debtor: DebtorsRand;    这里,我们限制了Debtor只能从小写字母“a”到“z”。    子界很方便地定义了我们的取值范围,但是这些值必须是连续的,如果我们想在一些互不相干的Debtor中选取我们需要的某个Debtor,就需要用到集合了。    4.集合    准确地说,子界是集合的一个子集,集合可以在定义当中使用子界。集合这种数据结构也是由简单数据构成,每一个简单的类型作为集合的子集,方法如下:    Type    DebtorsRand=set of char;//定义一个集合类型,集合成员是char类型    Var    Debtors: DebtorsRand;    Begin    Debtors:=[′a′.. ′z′,′A′′T′′N′]    ……    这段程序我们定义了一个Debtors的集合,定义了里面包含了“a”到 “z”、“A”、“T”、“N”等元素。    5.枚举类型    枚举类型让你的程序能更快地被其他程序员接受,比如在你的财务软件中给几个非常没有信用的债务人编了号码,来进行一系列的操作,别人怎么能知道号码对应的是谁呢?我们可以看看以下例子。    Program EnumerateDemo    $APPTYPE CONSOLE //编译指令,说明该应用程序是一个控制台程序,而不是GUI程序    uses    SysUtils;    Type    BadDebtors=(wang,feiche,libuhao)    Var    Debtor: BadDebtors;    List: integer;    Begin    Debtor:= libuhao;    List:= integer(Debtor);    Writeln(′List is′, list);    End.    这个小程序运行后list变量的值是什么呢?应该是2 ,序号从0开始。可见在一些复杂的程序中,使用枚举让程序变得容易维护和阅读。    (五)操作符    Delphi 支持的操作符有算术操作符、关系操作符、位操作符、逻辑操作符。    1.算术操作符    绝大多数操作符是拥有两个操作数的,称为双目操作符,只有一个操作数的,称为单目操作符。Delphi 6.0的算术操作符包括+(加)、-(减)、/(除)、mod(取拿)、divc(整除)等。    2.关系操作符    关系操作符我们也很熟悉,比较两个数值的大小的时候,就用到关系操作符,下面给出关系操作符:=(等于)、〉(大于)、〈(小于)、〈=(小于或等于)、〉=(大于或等于)、〈〉(不等于)    3.逻辑操作符    当你只关心比较,在真或假上伤脑筋的时候,就会用到逻辑操作。Delphi 6.0的逻辑操作符合包括Not(取反)、And(逻辑与)、Or(逻辑或)、Xor(逻辑异或)    4.操作符的优先级    当然,一个表达式不一定只包含一个操作符,多个操作符基本上遵从数学那套原则,从左到右、先乘除后加减。    (^60090203g^)    注意:如果有括号,就按照先括号内后括号外的顺序操作。    (六)语句    1.条件判断语句    在Pascal中条件判断语句有两种:    (1)If语句    格式1:    if 逻辑表达式 then    begin    程序体1    end    else    begin    程序体2    end;    格式2:    if 逻辑表达式 then    执行语句1    else    执行语句2    If语句的含义就是当条件成立时执行程序体1(或执行语句1),当条件不成立时执行程序体2(或执行语句2):    (2)Case语句    格式1:    case 值表达式 of    值1:    begin    程序体1;    end;    值2:    begin    程序体2;    end;    ……    值n:    begin    程序体n;    end    else    begin    程序体n+1;    end;    end;    格式2:    case 值表达式 of    值1:执行语句1;    值2:执行语句2;    ……    值n:执行语句n;    else 执行语句n+1;    end;    Case语句通常用来取代复杂的If…else…If…else嵌套结构,但是需要注意的是,作为Case语句分支选择依据的值表达式必须是序数类型,比如Char类型、int类型、枚举类型等。    2.循环语句    (1)For循环    For循环适合用在事先通知循环次数的情况下,下面是For循环的格式:    for 循环变量:=初值 to 终值 do    begin    程序体    end;    (2)While循环    While循环结构用在先判断某些条件是否为真,然后重复执行某一段代码。While的条件是在循环体执行前判断的。    格式:    while 逻辑表达式 do begin    程序体    end;    (3)Repeat循环    Repeat循环与While循环相似,但考虑问题的角度不一样,它在某个条件为真前一直执行程序体,并且条件判断是放在循环的结尾进行。也就是说,Repeat是为真结束循环,While是为真进入循环,Repeat先执行程序体再判断,While先判断再执行程序体。    格式:    Repeat    程序体    until 逻辑表达式;    (4)Break语句    在For、While、Repeat循环中调用Break,会使得程序的执行流程立即跳到循环的结尾。    (5)Continue语句    如果想跳过循环中部分代码重新开始下一次循环,就调用Continue。    (6)With语句    While语句使用With语句能很方便地引用一个记录、类或一个对象的域和方法。    (七)函数与过程    1.概述    对于函数和过程,两者间很明显的区别是函数有返回值,而过程没有返回值。把会在几个地方用到的某一程序段包装成函数或者过程,然后在这几个地方调用该函数或过程,这样代码只需要写一次就可以在多个地方使用,也就是达到代码重用的效果,这在阅读、维护代码和模块化程序设计上都是十分必要的。    2.函数和过程    函数格式:    function 函数名(参数声明):返回值声明;    begin    程序体    end;    过程格式:    procedure 过程名(参数声明);    begin    程序体    end;    程序中函数和过程的参数可以是值传递和引用传递,传递的参数可以是基本类型、用户自定义类型或开放数组,如果变量在函数和过程中不改变它的值也可以是常量。    值传递的参数程序将这样处理:创建一个变量,该变量的作用域是局部变量。当函数(过程)结束时,该变量也结束,在函数(过程)期对该变量的改变不会对函数(过程)结束后的程序造成影响。    而引用传递的参数与值传递有很大不同,这种传递的参数被称为变量参数,它意味着接收该变量的函数(过程)能够改变该变量的值,在声明变量参数时我们需要用到var关键字。   #1  四、Delphi的控件    Delphi中最基本的元素是控件(Component)。Delphi的控件就是对象,程序员利用它来快速设计用户界面和开发程序。任何控件都有自己的属性、事件和方法,控件的属性和事件可以通过对象观察器来设置,控件的方法是用来对控件进行调用和处理的系统内置程序。控件的应用主要包括对控件的属性设置、事件代码的编写以及方法的调用。    (一)控件的使用    要使用控件,首先在控件面板上选定需要的控件,然后在窗体中放入该控件。对于可视控件,我们可以根据需要调整它的大小,而不可视控件不能调整大小。在窗体中装入控件并选中控件后,Delphi会显示出控件对应的属性窗口。我们通过改变控件的属性值来改变控件的特征和行为。 在“对象观察器”窗口中选取“Events”页就可对控件事件进行设置。“事件”是指外界的“刺激”或某种状态改变了,例如按了某个键、鼠标移动等。Windows是属于“事件驱动”的系统,当“事件”发生时程序才会执行,若没有事件发生,整个程序处于停滞状态。程序编写的重点放在“事件处理”上,因此除了将正确的程序代码放置在相应的事件处理中,也要避免在事件处理中又去触发事件本身,否则会产生无穷的递归调用。    (二)窗体控件    窗体是Windows应用程序设计过程中最常用的控件,它的属性、事件和方法具有很强的代表性。可以这样理解,窗体的属性影响窗体的外观,窗体的事件影响窗体在程序运行时的行为。    1.窗体控件的属性    ActiveControl属性:用于给窗体中的其他控件设置焦点。    Autocroll属性:用于设置当控件超出窗体范围时是否在窗体中出现滚动条。    BorderIcons属性:设置是否在窗体中显示最小化(Minimize)、最大化(maximize)及关闭(Close)按钮。    Bordorstyle属性:用于设置窗体的样式。    Caption属性;用于设置窗体标题栏的标题。    ClientHeight、ClientWidth属性:用于设置窗体可用部分的高度和宽度(即不包括边界)。    Color属性:用于设定窗体的背景颜色。    Cursor属性:用于确定鼠标移入窗体后的形状。    Font属性:用于设置窗体的字体及文字颜色等。    Formstyle属性:窗体窗口类型。它有四种选择:标准窗口(fsNormal)、顶部窗口(StayonTop,窗口在开启时在所有窗口的最外面)、父窗口(fsMDIForm,这类窗口可以包含多个子窗口)、子窗口(fsMDIChild,在父窗口里面的子窗口,一个父窗口里面可以有多个子窗口,其窗口最大和最小化都将父窗口看作它的上一级窗口,最小化目标在父窗口内,最大化时就是父窗口)。    Height、Width属性:窗体高度和宽度(包括边界),它们以像素为单位。    Icon属性:用于设置窗体左上角的图标。    Key Preview属性:如果将它的值设为True,将决定击键由窗体的Key事件首先处理,而非由焦点所在的元件来处理。默认值为False。    Left、Top属性:用于决定窗体相对于屏幕的左边或顶部的位置,它们也是用像素为单位。    Name属性:设置窗体的名称,这是窗体或控件中最重要的属性之一。    PixlsPerInch、Scaled属性:在Scaled属性值设定True以后,PixlsPerInch决定窗体每英寸(Inch)中包含多少像素,它们与Screen对象的PixlsPerInch一起组合使用,决定Windows在一英寸中有多少像素。    Position属性:决定窗体在屏幕中显示的位置。    PrintScale属性:用于设定打印时窗体中信息的比例变化。    Visable属性:决定窗体或元件在运行时是否可见。    WindowsState属性:设定窗口运行时的状态(即最小化或是最大化)。    2.窗体事件    OnClick、OnDBClick:当用户单击或双击窗体的空白区时,该事件就被触发。    OnCloseQuery、OnClose:OnCloseQuery是用户试图关闭窗体时就会被触发,通常可以运用该事件写上释放程序资源的代码,或显示窗体在关闭前的警告。OnClose事件则是在窗体关闭后才触发。    OnCreate:该事件在窗体第一次建立时被触发,常用来设置窗体及其事件的初始属性。     OnDeactivate:当用户切换到另一应用软件时,该事件被触发。    OnMouseDown:用户按下某个鼠标键时事件被触发。    OnMouseUp:用户松开按下的某个鼠标键时事件被触发。    OnMouseMove:用户移动鼠标时事件被触发。    OnKeyDown:用户按下某个能产生ASCII码键时被触发。    OnKeyPress:用户按下某个键时被触发(例如Alt或Ctrl键没有标准的ASCII码,仍可触发事件)。    OnKeyup:用户松开按下的某个键时事件被触发。    OnResize:当用户重新调整窗体大小时该事件被触发。    OnShow:当窗体出现之前事件被触发。    (三)文本输入、输出类控件    1.Label控件    Label(标签)一般用来显示一些文字信息。    2.Edit控件    Edit控件是用于接收用户输入的信息并显示出来。Edit控件的主要属性有:    Text:用于决定Edit对象的数据内容。当用户在Edit对象内输入文本或显示数据时,所输入的结果就会放在属性Text内。    ReadOnly:用于决定所输入的数据是否可被更改。    MaxLength:限制可输入字符串的长度。默认属性MaxLength为0,代表最长到255个字符。    CharCase:用于决定在Edit对象中文本的大小写。    在使用Edit控件的正常情况下,用户所输入的任何字符都会原原本本地显示在Form上。但在有些特殊情况下,用户不希望其他人看见所键入的数据,例如输入用户密码,此时你可利用Edit对象中的属性“PasswordChar”来设定Edit的显示方式,使其只显示所设置的符号(如*)。    3.Memo控件    Memo对象与Edit对象很相像,都是提供给用户在程序中输入数据或显示文字用的对象。所不同的是Memo对象能够提供给用户输入多行数据的能力,输入的数据量最多可达255KB的容量大小,但是每个单行的数据量最多只能够有255个字符。    除了像Edit对象一样可以使用属性Text存取输入的数据外,Delphi还提供另一种方法存取Memo对象的数据,那就是使用Lines属性。Text属性与Lines属性之间的不同在于,Text属性存放Memo对象中全部的输入数据,而Lines属性只存放某个单行的数据,因此可让你更灵活地运用Memo对象。    4.LabeledEdit控件    LabeledEdit控件是Delphi 6新增的一个控件,它的作用相当于使用Label控件和Edit控件的组合。通过对LabelPosition属性的设置可以非常灵活地放置标签的位置;设置LabelSpacing属性可以调整标签和编辑区之间的间距,调整单位是像素;EditLabel属性中包括多项子属性,它的主要作用是对LabeledEdit控件的标签部份的设置,与Label属性设置大同小异。    (四)按钮与成组类控件    1.Button控件    按钮是Windows常用的控件,Delphi提供了几种不同的按钮:Button、BitButton、SpeedButton、RadioButton、CheckBox,你可针对程序的需求,灵活地运用各种不同的按钮控件。    在Button控件中有两个重要的事件:OnClick及OnDblClick。当用户用鼠标在Button控件上单击,或是当焦点在Button控件上时按下Enter键,即触发OnClick事件处理,用鼠标双击则会触发OnDblClick事件处理。因此,程序员会把按下Button控件后要执行的程序放在这两个事件处理中,例如下面程序段:    Procedure Tform1.Button1Click(Sender: Tobject);    Begin    Button2.Enabled: =false;    Form1.Caption: ='Demo Program';    Form1.Color: =clGreen;    End    要设定Button控件成为默认按钮,只要把属性Default设为True即可。    2.BitBtn控件与Speed Button控件    BitBtn控件与SpeedButton控件在控件面板的Additional控件页上,是进行工具条快速设计的理想控件。它只有一个位图,没有标题。需要注意的是,用多个Speed Button制作一个工具条时,必须先放置一个分组类控件,如Panel控件、Group Box控件等。否则试图将加速按钮先制作好再移上去时会发现它始终处于分组类控件下面不可见。    BitBtn和SpeedButton两种控件彼此之间非常相似,除了具有Button控件的基本属性外,BitBtn控件可在其上加入文本以及Delphi建立好或自定义的bitmap图标,而SpeedButton控件也可在其上加入图标,并有独特的能力可让多个SpeedButton控件同在一个分组中。因此,SpeedButton控件经常被用在应用程序中来建立快速按钮。    在BitBtn和SpeedButton控件上建立自定义的bitmap图标,只需在属性Glyph中指定要选择的图标。    3.Check Box与Radio Button控件    Check Box检查框和Radio Button无线按钮控件通常是相提并论的,多用作接收用户“是”或“否”的输入判别。它们一般都是成组的放置在Radio Group或Group Box控件中。所不同的是,成组的Radio Button是“互锁”的,用户选定一个后,其他的将自动设置为不选;而Check Box控件则是分立的,你可以同时选中其中的几个,也可以一个都不选。    (五)栏目类控件    1.ToolBar控件    在Windows应用程序中,工具栏是最常见的。它可以将最常用的功能集中在一起,用图标的形式提供快捷的访问方式。在Delphi 6.0中也提供了工具栏(ToolBar)控件,在Win 32控件页中。    工具栏是由一个个单独的按钮控件(ToolButton)组成的。ToolBar工具栏控件的属性很多,下面介绍一些经常用到的属性。    Align属性:用于确定工具栏在主窗口中的排放位置。    AutoSize属性:用于确定工具栏是否自动适应主窗口变化。    ButtonHeight、ButtonWidth属性:用于确定工具栏中包含工具栏按钮或者其他可视控件的高度和宽度。    Flat属性:用于确定工具栏中按钮的显示方式。    Images属性:用于确定工具栏按钮所使用的显示图标。    List属性:确定工具栏中工具栏按钮控件和标题的显示方式。    ShowCaption属性:用于确定工具栏按钮是否显示文本标题。    工具栏按钮控件(ToolButton)是一种特殊的按钮控件,它只能在ToolBar控件中使用,不能单独在窗体中使用,下面列出ToolButton控件的主要属性:    Grouped属性:工具栏按钮控件通过Grouped 属性和Style 属性对工具栏中的按钮进行分组。    ImageIndex属性:用于确定按钮的图标。    Down属性:用于控制和确定按钮的按下和抬起状态。    Style属性:确定按钮控件的显示风格,有以下几种选项:    (1)tbsButton:按钮显示为正常状态,按钮任何时刻均处于抬起状态;    (2)tbsCheck:按下按钮时处于按下状态;再次按下按钮时,按钮处于抬起状态;    (3)tbsDropDown:按钮显示为一个向下的的箭头;    (4)tbsSeparator:显示为空的分隔符;    (5)tbsDivider:显示为一条垂直线。    ToolButton控件通过右键单击ToolBar控件的弹出菜单中的“New Button”选项来产生,ToolButton控件的所有按钮图标都由Imagelist控件来提供,所以ToolBar工具栏控件要与Imagelist控件配合使用,有多少个ToolButton控件就要在Imagelist控件中装入多少个图标控件。    2.StatusBar控件    Delphi 6.0提供了状态栏控件(Status Bar),使用Delphi 6.0提供的状态栏控件可以全面实现应用程序中状态栏的功能。下面介绍状态栏控件的重要属性、事件和方法。    (1)状态栏控件的属性和事件:    Align属性:用于确定状态栏控件在应用程序窗口中安放的位置。状态栏一般处于应用程序主窗口的底部,所以Align属性的缺省值为alBotton。    SimplePanel属性:用于确定状态栏控件在应用程序窗口中显示状态面板的数量。如果SimplePanel属性调置为False,状态栏将包含多个显示面板。    SimpleText属性:用于确定状态栏控件在应用程序窗口中显示面板的字符串信息。当Simple Panel属性设置为True时,SimpleText属性设置的文本信息将显示在状态栏中。    SizeGrip属性:用于确定状态栏控件在程序运行过程中是否可以动态地改变大小。  SizeGrip属性的缺省设置为True。    Panels属性:用于确定状态栏控件的多个显示面板。通过对状态栏中多个显示面板属性的设置,可以确定整个状态栏的表现形式。    (2)显示面板控件(Status Panel):    显示面板控件并不独立存在,而是依附状态栏控件存在的。在应用程序窗体中添加状态栏控件后,需要在其中添加显示面板控件,基本操作步聚如下:    首先在窗体中选择状态栏控件,双击,出现显示面板编辑器。然后,在显示面板编辑器中单击Add New按钮,将自动添加显示面板。在对象编辑器中,可以对显示面板的属性进行设置。    下面是显示面板在应用程序中需要进行设置的属性:    Alignment属性:用于确定显示面板中字符串文本的对齐方式。属性值可以取Leftjustify、Rightjustify和Center。    Bevel属性:用于确定状态栏显示面板的显示风格。设置为pbLowered时,显示面板以下凹方式显示;设置为pbLowered时,显示面板以上凸方式显示;设置为pbNone时,显示面板以平面方式显示。    (六)图形、图像类控件    1.Image控件    Image图像控件是一个容器控件。用来在窗口中显示一幅图片,可以在picture属性中调入图像文件。Image控件支持位图(BMP)、图标(ICO)、图元(WMF)三种文件格式。Image控件比较重要的属性有Autosize和Strech。它们决定了图像在窗口中的显示尺寸。Autosize属性为True表示按原尺寸显示,Strech属性为True表示图像按对象图框的大小显示。    下面介绍Image图像控件常用的属性:    AutoSize属性:用于确定图像控件是否调节其尺寸以适合它所包含的图像的尺寸。    Center属性:用于确定一个图像是否位于图像控件的中央。    Picture属性:用于确定图像控件中显示的图像。    Stretch属性:用于确定图像控件包含的图像文件是否改变尺寸以适合图像控件的大小。    2.Canvas控件    Canvas画布控件是一个特殊的控件,它一般不能单独使用,而是作为窗体控件的一个属性,提供进行绘画操作的平面,在这个区域上,程序可实现各种绘图功能。画布中笔的位置定义在PenPos属性中,可用MoveTo方法来移动笔。如果要在画布上输出文本,可使用Textout方法输出。    (七)选择、列表控件    1.目录访问控件    Delphi为你提供了强大的文件目录访问控件。你可以针对具体的用途设计自定义的文件对话框。在控件选项板上选中System页,你将发现这些控件,它们是文件列表框FileListBox、目录列表框DirectoryListBox、驱动器下拉式列表框DriveComboBox和过滤式下拉列表框FilterComboBox控件。    文件列表框控件FileListBox显示当前目录中的文件,缺省的设置是显示所有文件。通过改变Mask属性来设置过滤器,可以适用DOS的标准通配方式,选择要显示的文件名。当指定多个过滤器时,之间用“;”隔开。    目录列表框控件DirectoryListBox显示当前驱动器内的目录,并且允许用户在程序执行时切换目录。    驱动器下拉式列表框控件DriveComboBox显示当前所在的驱动器,并且在执行时允许用户在驱动器之间切换。    FilterComboBox(过滤式下拉文件列表框)控件显示当前文件过滤器类型,例如*.*,*.pas等。在执行时允许用户在下拉列表中选择要显示的文件类型。对Filter属性进行初始化,就会得到下拉式列表。    2.ListBox和ComboBox控件    ListBox(列表框)和ComboBox(组合框)都显示列表项目,所不同的是组合框占用较少的空间。常见的Windows操作系统中,显示可用磁盘驱动器时,用的就是组合框。列表框则提供了一个项目列表以供选择,如Windows打开文件操作时显示文件列表的就是ListBox。    3.ValueListEditer控件    ValueListEditor控件是Delphi 6新增的一个控件,它提供了编辑关键字及所包括的对应值的一种简单方法。    TitleCaptions属性是对关键字列及包括的对应值列标题设置。    Strings属性是对关键字列及包括的对应值列装入关键字名及对应值的数据。    (八)使用非可视控件    非可视控件在运行时是不可见的,控件的设计状态和运行状态并不相关,这种控件,称之为非可视化控件。    1.使用菜单控件    在设计菜单时,可以用菜单设计器Menu Designer进行设计。    应用程序的菜单有两种形式:MainMenu是一般的Windows用户界面必须的控件,它显示在固定的位置,一般用键盘和鼠标左键来激活菜单的功能项;PopupMenu是弹出式菜单,一般以鼠标的右键或其他快捷键来激活菜单;菜单的位置是在屏幕上“浮动”的,根据鼠标的当前位置决定。以下,我们将MainMenu和PopupMenu统称为菜单。    (1)进入菜单设计器Menu Designer:创建菜单时,首先要在窗体中放置一个菜单对象。在菜单控件上双击左键,就会出现Menu Designer。    (2)创建菜单的各个项目:进入Menu Designer,会发现在菜单的第一项位置上加亮显示。输入顶层菜单项(实际上是在设定顶层菜单项的Caption属性)并回车。一项菜单条设置完后,加亮显示的位置被移至下拉菜单的下一项,用鼠标左键切换到下一个顶层菜单,逐步输入菜单的各项,直到菜单完成。    (3)设定加速键和热键:我们可以给菜单加入加速键。方法是,输入时将“&”放到需要指定为加速键的字母前面,该字母将被用下划线显示,运行时,按“Alt+加速键字母”可以激活该菜单条。设定热键也是很方便的,只需在Object Inspector中该菜单条的ShortCut属性值段的下拉菜单中,为它选定一个热键组合即可。PopupMenu的设置方法与其相同。    2.使用计时器控件Timer    在控件面版上的System控件页,有一个Timer(计时器)控件,它能够有规律地触发OnTimer事件,发送信息给应用程序。Timer的主要属性有:    Enabled属性:用于表示计时器打开还是关闭;    Interval属性:用于设置两个OnTimer事件间的间隔,单位是毫秒,也即千分之一秒。将间隔置为0相当于关闭计时器,Interval的最大允许值是32767,也即32.767秒。    在《电脑报2001年合订本附赠光盘》中,我们给出Delphi 6.0的开发实例,读者可以参看相应文章。