第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3...

52
第3章 常见组件编程 从本章开始,将为读者介绍 Delphi 编程的一些基本方法。通过这一部分的学习,读者可 以了解开发 Windows 环境下应用程序的一些关键技术,并可以方便、快捷地开发一般的应用 程序。 为了简化编程工作,Delphi 提供了许多功能强大的函数和类。其中很重要的一部分就是组 件类。本章将重点介绍常见组件及其编程应用。 3.1 窗体和组件 3.1.1 概述 现在深入普及的Windows操作系统中,方便快捷的人机交互界面主要是通过窗体和对话 框实现的。在Delphi中,这些窗体和对话框就是程序设计阶段的窗体, Delphi的可视化设计工 作就是在窗体中进行的。 组件所对应的类为TComponent,所有的组件都是由这个类派生来的。通常,窗体中会有 文字输入、滚动条、复选框、单选框、按钮等一系列组件,通过这些直观易懂的组件,可以 方便的实现多种多样的功能。在Delphi中,这些运行期间出现在窗体和对话框中的组件称为 可视组件,对应TControl子类。在窗体中,不仅可以放置组件,还可以放置一些运行期间非 可视的组件,对应其它的TComponent子类。这些不可视组件集中地实现了一些特殊的功能。 比如,时钟控制等功能。 组件(可视组件)可分为两类:窗体组件和图形组件。窗体组件对应 TWinControl 子类, 是基于系统窗体的可视组件,具有窗体句柄,可作为输入焦点并含有其它组件,例如 TEdit 组件;图形组件对应 TGraphicControl 子类,没有窗体句柄,不可作为输入焦点,也不能含有 其它组件,例如 Label 组件。图形组件比窗体组件使用的资源少,尤其在组件数量比较多的 情况下最好使用图形组件。组件组的关系如图 3-1 所示。 窗体和组件的关系非常密切。从直观的角度来讲,窗体就像一个容器,其中包容了可视 组件和非可视组件。从程序代码的角度来看,一个窗体对应一个源程序文件,其中定义了窗 体中所有组件的对象。 窗体和组件之间除了具有上述的不同点之外,还具有一些相同点。例如,从面向对象编 程的角度来看,所有组件都是 TComponent 类派生类的一个对象。窗体类(TForm) 也是从 TComponent 类派生的,所以可以将窗体看成一个特殊的组件。 有些组件也具有窗体的“容器”属性,也就是在这些组件中可以放置其它组件,通常这 些组件称为容器组件。例如在 TLabel 组件中可以放置 TEdit 组件, TLabel 组件就是一个容器 组件。 Delphi 中的所有组件是在可视组件库(Visual Component Library,缩写为 VCL)中封装 的。可视组件库是 Delphi 中非常重要的一部分,不仅封装了所有组件对应的类,还封装了一

Transcript of 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3...

Page 1: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3章 常见组件编程

从本章开始,将为读者介绍 Delphi 编程的一些基本方法。通过这一部分的学习,读者可

以了解开发 Windows 环境下应用程序的一些关键技术,并可以方便、快捷地开发一般的应用

程序。 为了简化编程工作,Delphi 提供了许多功能强大的函数和类。其中很重要的一部分就是组

件类。本章将重点介绍常见组件及其编程应用。

3.1 窗体和组件

3.1.1 概述

现在深入普及的Windows操作系统中,方便快捷的人机交互界面主要是通过窗体和对话

框实现的。在Delphi中,这些窗体和对话框就是程序设计阶段的窗体,Delphi的可视化设计工

作就是在窗体中进行的。 组件所对应的类为TComponent,所有的组件都是由这个类派生来的。通常,窗体中会有

文字输入、滚动条、复选框、单选框、按钮等一系列组件,通过这些直观易懂的组件,可以

方便的实现多种多样的功能。在Delphi中,这些运行期间出现在窗体和对话框中的组件称为

可视组件,对应TControl子类。在窗体中,不仅可以放置组件,还可以放置一些运行期间非

可视的组件,对应其它的TComponent子类。这些不可视组件集中地实现了一些特殊的功能。

比如,时钟控制等功能。 组件(可视组件)可分为两类:窗体组件和图形组件。窗体组件对应 TWinControl 子类,

是基于系统窗体的可视组件,具有窗体句柄,可作为输入焦点并含有其它组件,例如 TEdit组件;图形组件对应 TGraphicControl 子类,没有窗体句柄,不可作为输入焦点,也不能含有

其它组件,例如 Label 组件。图形组件比窗体组件使用的资源少,尤其在组件数量比较多的

情况下 好使用图形组件。组件组的关系如图 3-1 所示。 窗体和组件的关系非常密切。从直观的角度来讲,窗体就像一个容器,其中包容了可视

组件和非可视组件。从程序代码的角度来看,一个窗体对应一个源程序文件,其中定义了窗

体中所有组件的对象。 窗体和组件之间除了具有上述的不同点之外,还具有一些相同点。例如,从面向对象编

程的角度来看,所有组件都是 TComponent 类派生类的一个对象。窗体类(TForm)也是从

TComponent 类派生的,所以可以将窗体看成一个特殊的组件。 有些组件也具有窗体的“容器”属性,也就是在这些组件中可以放置其它组件,通常这

些组件称为容器组件。例如在 TLabel 组件中可以放置 TEdit 组件,TLabel 组件就是一个容器

组件。 Delphi 中的所有组件是在可视组件库(Visual Component Library,缩写为 VCL)中封装

的。可视组件库是 Delphi 中非常重要的一部分,不仅封装了所有组件对应的类,还封装了一

Page 2: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 71

些通用的类。所有的这些类都是由一个基类派生出来的,也就是 TObject 类。了解可视组件

库对于学习组件、使用 Delphi 很有帮助。

图 3-1 组件组的图示说明

3.1.2 窗体(Form)

下面将介绍一些窗体的主要属性、方法和事件。根据下面对相关属性的简要介绍,读者

可以结合对象编辑器中的相关选项加深对窗体的认识。

1.BorderIcons 属性

属性BorderIcons用来指定窗体标题栏上的图标,可以设置为下列数值: biSystemMenu 可以通过点击标题栏左边的图标或在标题栏上单击鼠标右键来显示

控制菜单。控制菜单有时也称为系统菜单。 biMinimize 在标题栏右边显示 小化按钮。 biMaximize 在标题栏右边显示 大化按钮。 biHelp 在标题栏右边显示帮助按钮。只有窗体的 BorderStyle 属性设置为 bsDialog

或者窗体属性 BorderIcons 中不包括 biMinimize 和 biMaximize 时,biHelp 设置才有效。

4.BorderStyle 属性

属性BorderStyle用来设置窗体的外观和边框,可以指定为下面的数值: bsDialog 窗体为标准的对话框,边框大小不可以改变。 bsNone 窗体没有边框,也没有标题栏,边界的大小不可以改变。 bsSingle 窗体具有单线边框,大小不可以改变。 bsSizeable 边框大小可变的标准窗体。 bsSizeToolWin 风格与 bsSizeable 相同,只是标题栏比较小。对于这种风格的窗体,

属性 BorderIcons 中设置的 biMinimize 和 biMaximze 也不起作用。 bsToolWindow 风格与 bsSingle 相同,只是标题栏比较小。另外,对于这种风格的窗

体,属性 BorderIcons 中设置的 biMinimize 和 biMaximize 并不起作用。 注意:窗体属性BorderIcons的设置与属性BorderStyle的设置可能会发生互斥,例如属性

BorderIcons的biMinimize和biMaximize会与属性BorderStyle的bsDialog冲突,属性BorderIcons

Page 3: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

72 第 3 章 常见组件编程

的biHelp会与属性BorderStyle的bsSizeable冲突。

3.Caption 属性

属性 Caption 用来指定窗体标题栏中的说明文字。 通常,对于多文档界面(MDI)应用程序,当主框架窗体中的子窗体 大化显示的时候,

应用程序的标题栏中显示的内容为“<应用程序名>-<打开的文档名>”;当子窗体非 大化窗

体显示的时候,主框架窗体中只显示应用程序的名称,子窗体有自己的标题栏,其中显示该

窗体打开的文件名。所以,当窗体的显示方式发生了改变后,应该立即改变标题栏中的内容。

4.Font 属性

属性 Font 用来设置窗体中文字的字体、颜色和字号等。 如果将窗体中组件的属性 ParentFont 设置为 True,那么该组件的字体设置就与其父级窗

体的字体设置完全一样了。所以在程序设计的时候,为了保持整个系统风格的统一,应该使

工程中的窗体风格尽量一致,可以先设置窗体的 Font 属性,然后将窗体中所有组件的

ParentFont属性设置为True就可以了。一般不要单个地对窗体中的组件进行Font属性的设置。

5.FormStyle 属性

属性FormStyle用来指定窗体的类型。 根据不同的窗体类型,Windows环境中的应用程序可以分为下面的三类:

单文档界面(SDI)应用程序这种应用程序同时只能打开一个文档。例如 Windows 系统

附件中的“画图”程序,只能同时编辑一个图像文件。 多文档界面(MDI)应用程序一般这种应用程序具有一个父窗体和多个子窗体,可以同

时打开多个文档,分别在多个子窗体中显示。例如常用的图像处理软件 PhotoShop 等,可以

同时编辑多个图像。 对话框应用程序这种应用程序的主界面基于一个对话框类型的窗体。例如 Windows

系统附件中的“磁盘扫描”程序。 此外,有些应用程序在运行期间可以总是显示在桌面的 前端,例如在Windows 98中按

下系统热键Ctrl+Alt+Del,激活的关闭程序窗体会一直显示在其它应用程序的窗体之上,除非

退出该程序。 属性FormStyle可以分别实现上面所说的各种类型的应用程序,取值如下:

fsNormal 普通类型的窗体。既不为 MDI 应用程序的父级窗体,也不为 MDI 应用程

序的子窗体。 fsMDIChild MDI 应用程序中的子窗体。 fsMDIForm MDI 应用程序中的父窗体。 fsStayOnTop 在桌面 前端显示的窗体。

6.Icon 属性

属性 Icon 用来指定标题栏中显示的图标。 单击对象编辑器 Icon 属性右边的省略号按钮,在弹出的 Picture Editor 对话框中点击

Page 4: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 73

Load...按钮,就可以装入一个制作好的图标。 使用 Delphi 自带的工具 Image Editor 可以方便地制作图标。通过菜单 Tools/ Image Editor

可运行 Image Editor 编辑制作图标。如图 3-2 所示。 如果需要动态地改变窗体 Form1 中的图标,可以调用下面的过程:

Form1.Icon.LoadFromFile('Icon1.ICO');

其中Icon1.ICO是要在窗体Form1标题栏中显示的图标文件名。

7.Name 属性

属性 Name 用来标志工程中的窗体。 通常,应该在系统开发的设计阶段就将整个工程中所有窗体的名称确定,然后在编程阶

段根据设计文档修改窗体的 Name 属性。一般情况下,不要在程序运行期间通过代码修改

Name 属性。

图 3-2 使用 Image Editor 编辑制作图标

8.Position 属性

属性 Position 用来描述窗体的大小和显示的位置。可以是下列数值之一: poDesigned 窗体显示的位置和大小与设计期间的一致。 poDefault 窗体每次显示时,与上次比较,往右下角移动了一些位置;窗体的高度和

宽度由 Windows 决定。 poDefaultPosOnly 窗体以设计期间的大小显示,窗体显示的位置较上次向右下角移

动了一些。如果窗体以设计时的大小不可以在屏幕上完全显示,就移动到屏幕的左上角显示。 poDefaultSizeOnly 窗体以设计期间的位置显示,窗体的大小由 Windows 决定。 poScreenCenter 窗体以设计期间的大小显示,窗体显示的位置总在屏幕的中间。考

虑多个监示器时位置的调整。

Page 5: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

74 第 3 章 常见组件编程

poDesktopCenter 窗体以设计期间的大小显示;窗体显示的位置总在屏幕的中间。不

考虑多个监示器时的调整。

9.WindowsState 属性

属性 WindowsState 用来描述窗体显示的状态,可以取下面的三个数值之一: wsNormal 窗体以普通状态显示(既不是 大化状态,也不是 小化状态)。 wsMinimized 窗体以 小化状态显示。 wsMaximized 窗体以 大化状态显示。

3.1.3 组件(Component)

在 Delphi 编程的过程中,要经常使用到组件。通过可视组件,可以在窗体中方便地构建

与用户交互的界面。另外一些不可视的组件可以为程序增加许多强大的功能。在 Delphi 集成

开发环境的组件栏中,按照功能分类罗列了大量的组件,熟悉它们可以提高开发程序的进度。

此外,还可以根据需要,调整组件栏中组件的位置,或者在组件栏中添加、删除组件,还可

以为了满足一些特殊需求而创建新的组件,并把它们添加到组件栏中。 表 3-1 所示是 Delphi 6.0 中常用的组件栏。

表 3-1 Delphi6 中的主要组件栏作用

组件夹 功能

Standard 标准Windows组件、框架、菜单等

Additional 一些专用的Windows组件

Win32 32位Windows系统中的公用组件

System 进行系统操作的组件(包括定时器、多媒体和DDE等)

Data Access 操作数据库的组件,如访问数据库、表格、查询和报表等

Data Controls 进行数据库控制的组件

ADO 通过ActiveX Data Objects访问数据库的组件

InterBase 提供与InterBase直接联接的组件

MIDAS 开发多层数据库应用程序的组件

InternetExpress 开发InternetExpress应用程序(Web服务器应用程序和客户端多层数据库应用程

序)的组件

Internet 开发Web服务的应用程序

FastNet 提供Internet操作的一些组件

Decision Cube 为应用程序提供多维数据分析的组件

QReport 快速报表组件

Dialogs Windows通用对话框组件

Win 3.1 提供与Windows 3.1兼容的一些组件

Samples 一些定制组件的例子

Servers 通用COM服务器组件

下面是 Delphi 中常用的几类可视组件:

Page 6: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 75

文本组件 特殊输入组件 按钮及其分类组件 列表组件 分组组件 信息反馈组件 表格显示组件 图形显示组件

各种可视组件的详细内容将在本章后面的几节中进行介绍,并用相应的例程加以说明。

3.1.4 组件的使用

在窗体中使用组件主要包括:

1.添加组件

向窗体中添加组件的方法很多,可以根据习惯和编程的方便精心选择,主要的添加方法

有: 在组件栏中需要添加的组件上单击一下鼠标左键,鼠标形状发生改变。然后在窗体

中某个位置按下鼠标左键并拖动,松开鼠标左键后,组件就以刚才拖动的大小出现在窗体中,

接着也可以对组件的大小进行调整。 在组件栏中需要添加的组件上单击一下鼠标左键,鼠标形状发生改变。然后在窗体

中再单击一下鼠标左键,就将组件添加到窗体中了。这时添加的组件以固定的大小出现在窗

体中,接着可以对组件的大小进行调整。 在组件栏中双击组件,则被双击的组件会自动添加到当前默认的窗体或容器组件中。 在窗体中选择一个组件或多个,通过菜单命令 Edit/Copy 复制到剪贴板中,然后通过

菜单命令 Edit/Paste 将剪贴板中的组件粘贴到窗体中。粘贴出来的组件与原组件具有基本一

致的属性,如大小、字体等。 也可以通过快捷键 Ctrl+C 将选中的组件复制到剪贴板中,通过快捷键 Ctrl+V 将剪贴

板中的组件粘贴出来。如果在工具栏中添加了剪切(Cut)、复制(Copy)和粘贴(Paste)按钮,可

以更快地进行操作。

2.删除组件

如果要删除窗体中的某个组件,可以先选中该组件,然后单击键盘上的Delete键就可以

了。也可以通过主菜单中的Edit/Cut命令实现。 可以一次选中多个组件按Delete键进行删除操作。一次选定多个组件的方法有:

按下 Shift 键的同时,利用鼠标左键单击各个组件。同时被选中的组件四周将会出现

8 个灰色的正方形黑点。 在窗体上没有组件的地方按下鼠标左键并拖动,将会出现一个虚框。松开鼠标左键

后,该虚框“触及”到的组件就被选中了。

Page 7: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

76 第 3 章 常见组件编程

3.调整组件

改变组件在窗体中的大小和位置可以采用下面的方法: (1)鼠标操作 利用鼠标左键单击组件,则将组件选中,这时被选中的组件四周出现8个正方形黑点。

在组件上按下鼠标左键并拖动,可以方便地改变组件的位置。如果将鼠标移动到某个黑点上,

鼠标形状将变成上下拖动的形状,此时可以按下鼠标左键进行拖动,改变组件的大小。 (2)键盘操作 利用键盘的上(↑)、下(↓)、左(←)、右(→)移动键可以在窗体中选择组件。选中某个组

件后,通过Ctrl+↑、Ctrl+↓、Ctrl +←、Ctrl +→可以改变组件的位置,通过Shift+↑、Shift+↓、Shift+←、Shift+→可以改变组件的大小。

一般利用鼠标进行粗略地定位或大小设置,利用键盘进行精细地定位或大小设置。也可

以利用剪贴板对同一类型的组件进行复制,获取相同的大小。 (3)统一操作 先选中几个组件,然后通过主菜单Edit/Size...命令将打开Size对话框,如图3-3所示。在

Size对话框中选择宽度和高度的有关设置。例如,分别选中Size对话框中的Width/Width和Hight/Hight,在框中填入相应数值。按下OK按钮后,选中的组件的大小就等于所填入数值了。

图 3-3 Size 对话框 图 3-4 Alignment 对话框

将多个组件选中后,也可以同时对它们进行移动和对齐等操作。如果需要对多个组件进

行对齐,可以通过主菜单的 Edit/Align... 命令弹出 Alignment 对话框,如图 3-4 所示。 在 Alignment 对话框中,对选中的组件进行水平和垂直两个方向的对齐操作。例如在

Alignment 对话框中选中 Horizontal/Center in window 项和 Vertical/Center in window 项,按下

OK 按钮后,选中的单个组件就位于窗体的中央。如果选中的是多个组件,则将多个组件作

为一个整体进行操作。 此外,也可以通过Align工具栏(如图3-5所示)对多个选中的组件进行排列。通过菜单

命令View/Alignment Palltte可以显示Align工具栏。

图 3-5 Align 工具栏

Page 8: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 77

4.组件属性

在窗体中选中单个组件后,在对象编辑器中就可以对其属性进行设置了。如果单个组件

在窗体中不好选中,则可以在对象编辑器中的对象列表组合框中选择。 在对象编辑器中单击鼠标右键,通过弹出菜单的Arrange/Category或Arrange/Name可以对

属性的排列方式进行设置。 如果选中了多个组件,则可以统一地进行属性设置。这时对象编辑器中出现的属性为选

中组件的共同属性。

5.设置可视组件的 Table Order

图 3-6 Edit Tab Order 对话框

在对话框中,可以通过按下 Tab 键,依次定位到各个具有输入焦点的可视组件。可以通

过设置组件的 TabOrder 属性来确定这种定位的顺序。通过主菜单的 Edit/Table Order. . .命令弹

出 Edit Tab Order 对话框(如图 3-4 所示),在其中的 Controls listed in tab order 项中选中某个

组件后,点击对话框右部的上、下箭头就可以方便地改变该组件的 TabOrder 属性。 此外,也可以在对象编辑器中直接设置组件的 TabOrder 属性。对于一些容器组件,要对

其中的各个组件单独设置 TabOrder 属性。

6.锁定组件

一般在窗体中将组件的大小和位置安排好后,可以将组件锁定,这样就不会因为误操作

而改变已经设置好的大小和位置。可以通过菜单命令 Edit/Lock Controls 将窗体中的组件“锁

定”和“解除锁定”。

7.组件的事件处理过程

在窗体中选中某个组件后,在对象编辑器的 Events 属性页中就可以创建相应的事件处理

过程。双击某个事件右边的下拉式组合框,则自动创建该组件的事件处理过程,并将光标定

位到代码编辑器中。如果在窗体中双击某个组件,则会自动生成其默认的事件处理过程。例

如,对于 TEdit 组件来说,默认的事件就是 OnChange 事件。 此外,在窗体中对组件还可以进行“栅格对齐”、“左右翻转”和“改变比例”等操作,

Page 9: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

78 第 3 章 常见组件编程

对应的菜单命令分别是 Edit/Align to Grid、Edit/Flip Children 和 Edit/Scale...等。

3.2 文本输入类组件

在应用程序的界面上,往往需要用户输入一些文字,或者以一定的格式将文本显示给用

户,这时可通过文本组件来实现。

3.2.1 TEdit 组件

TEdit 组件可以显示、编辑单独的一行文本,是常用组件之一,它的相关类为 TEdit。在

使用 TEdit 组件的时候应注意: AutoSelect 属性可以设置当 Edit 组件获得输入焦点时,是否自动选中所有的文本。在 Edit

组件中可以输入文字来替换以前的文字,也可以在以前的文字后面添加新的内容。 当用户将输入焦点移动到某个 Edit 组件上时(如通过按下 Tab 键),替换的机会远远大

于新添加的机会时,就可以将 AutoSelect 属性设置为 True,这样可以方便用户的使用。 PasswordChar 属性可以将用户输入的所有字符以同一个字符显示。 通常情况下,用户在 Edit 组件中输入口令的时候,将输入的字符使用星号(*)显示。另外,

还需要提供给用户一个重新输入对口令加以确认的过程。 Edit 组件 常用的事件(也是默认事件)为 OnChange,也就是当 Edit 组件中的文本发生改

变的时候,该事件的处理过程执行。 在一些对话框中可以见到这种情况:在一个编辑框中输入字符的时候,另一个编辑框中

的内容自动发生改变。只要在第一个编辑框的 OnChange 事件的处理过程中改变第二个编辑

框的 Text 属性就可以实现上述过程。

3.2.2 TMemo 组件

TMemo 组件可以显示、编辑多行文本。对一些比较长的文本内容可以利用 TMemo 组件

来显示、编辑。在使用 TMemo 组件的过程中应注意: 可以通过 Text 属性来存取文本内容。 可以通过 Modified 属性来确定文本内容是否发生了改变。 Memo 组件没有从 TCustomEdit 类继承 AutoSelect 属性,所以不可以使用该属性。

3.2.3 TMaskEdit 组件

TMaskEdit组件可以显示、编辑具有指定格式的文本,如6位数字的邮政编码、固定格式

的电话号码等。 可以通过EditMask属性来设置输入的格式。单击EditMask属性右面的省略号按钮,将弹

出Input Mask Editor对话框,在其中可以方便地设置需要的输入要求和格式。通常可以先在右

面的Samples Masks中选择一项,然后在Input Mask中进行修改。

Page 10: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 79

图 3-7 Input Mask Editor

3.2.4 TRichEdit

TRichEdit组件可以显示、编辑具有丰富文本格式(Rich Text Format)的文件,如.rtf文件。

在使用TRichEdit组件的时候,有下面的注意点: 如果 PlainText 属性设置为 True,则在 TRichEdit 组件中显示 RTF 文件的时候,将格

式标记以普通文本的方式显示出来。如果 PlainText 属性设置为 False,则根据 RT F 文件中的

格式设置来显示。通常将 PlainText 属性设置为 False。 通过方法 Lines.LoadFromFile 和 Lines.SaveToFile 可以方便地存取 RTF 文件。

3.2.5 TLabel 组件

TLabel组件上可以显示一个只读的字符串。通常利用标签组件在窗体上显示静态文本。

此外,将标签组件与其它没有标题的组件相关联后,可以通过键盘上的Tab键使这些组件获得

输入焦点。在使用TLabel组件的时候应注意: 通过设置 Caption 属性,可以改变 TLabel 组件显示的内容。 TLabel 组件的 Transparent 属性比较有用。如果将 Transparent 属性设置为 True,则

显示的字符串不会完全挡住下面的组件。例如 TLabel 组件下面有一个 Image 组件,显示了一

个位图,那么 TLabel 组件的 Transparent 属性设置为 True 后,在字符的笔划之间将显示下面

位图的内容。

3.2.6 TStaticText

TStaticText组件上可以显示只读文本,该组件具有一个Windows句柄。TStaticText组件的

用法比较简单,类似于TLabel组件。

Page 11: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

80 第 3 章 常见组件编程

图 3-8 文本组件相关类的层次结构图

3.2.7 几点说明

在使用文本组件的时候有下面的几点需要说明: CharCase 属性可以强迫组件中的文本全部为大写字母、全部为小写字母或不强迫改

变大小写。CharCase 初是作为 TCustomEdit 类的属性出现的,TEdit 类将其作为公共属性

继承了下来,所以 Edit 组件具有 CharCase 属性。然而 TCustomMemo 类并没有从 TCustomEdit类处继承 CharCase 属性,所以 TMemo 类与 TRichEdit 类就没有 CharCase 属性。后面有一些

属性也存在同样的情况。 Text(或 Lines)属性可以在设计阶段就赋予组件显示的内容。对于 TEdit 组件和

MaskEdit 组件,在对象编辑器中列举了 Text 属性,对于 Memo 组件和 TRichEdit 组件却没有

列举,而改成了 Lines 属性。 实际上 Memo 组件和 TRichEdit 组件同样具有 Text 属性,可以通过代码改变 Text 属性的

值。ReadOnly 属性指定用户是否可以修改组件中的内容。默认值为 False,即用户可以修改

组件中的内容。 MaxLength 属性限制每一行 多可包含的字符数。默认值为零,表示不由应用程序

来限制每行的字符数,而是由操作系统来确定的。 HideSelection 属性可以设置当组件失去焦点时是否高亮度显示选中的文本。

3.3 按钮类组件

同菜单命令一样,按钮组件也可以让用户主动产生一个命令。下面是一些与按钮有关的

组件:

Page 12: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 81

3.3.1 TButton 组件

TButton组件为普通的按钮组件。在使用普通按钮组件的时候应注意: 如果某个按钮的 Default 属性设置为 True,则在该视图中按下回车键(Enter)后,

将执行该按钮的 OnClick 事件的处理过程。对于有些组件,如 RichEdit 等,将不会产生默认

按钮的 OnClick 事件。 通常在一个窗体中只设置一个默认按钮。

3.3.2 TBitBtn 组件

TBitBtn组件为图形按钮组件。在使用TBitBtn组件的时候应注意: 可以自己制做位图按钮上的图形,也可以采用 Delphi 指定的一组默认图形。如果自

己制作图形,可以将位图保存在.bmp 文件中,在设计阶段就可以通过 Glyph 属性将图形显示

在位图按钮上。采用 Delphi 指定的一组默认图形,可以通过 Kind 属性来设置。具体取值可

以为 bkCustom、bkOK、bkCancel、bkHelp、bkYes、bkNo、bkClose、bkAbort、bkRetry、bkIgnor e 和 bkAll 等,它们分别具有明显的意义。对于自己制做图形的位图按钮, Kind 属性要设置

为 bkCustom。 NumGlyphs 属性指明该位图按钮使用图形的个数,可以设置为 1~4 之间的一个整

数。如果 Kind 属性不为 bkCustom,也就是使用 Delphi 指定的一组默认图形时,NumGlyphs自动设置为 2。对于自己制作图形的位图按钮,如果只有一个位图,就将 NumGlyphs 的值设

置为 1,如果设置为 2,在按钮上只能显示一半的图形。 在位图按钮具有多个图形的时候,位图按钮通常显示的是第 1 个图形;当按钮被按

下后,显示第 3 个图形;当按钮失效后(Enabled 属性为 False),显示第 2 个图形。 位图按钮包含有几个图形,可以自己设定,然后 Delphi 自动将指定的图形在水平方

向上进行等分,并在不同的情况下显示不同的图形。所以在自己制作图形时,可以将同一个

位图按钮的几个图形并排放在一起。

3.3.3 TSpeedButton 组件

TSpeedButton组件为加速按钮组件,可以组成工具栏。在加速按钮上可以同时显示图形

和文字,用法与位图按钮很相似。

3.3.4 TCheckBox 组件组件

TCheckBox组件为复选按钮组件,可以组成多项选择。在使用复选按钮的时候应注意: 可以通过 Alignment 属性设置复选按钮上文字的位置。 如果复选按钮为三态的,也就是可以表达“选中”、“未选中”和“部分选中” (灰

色)的概念时,可以将 AllowGrayed 属性设置为 True。 可以在设计阶段就设置好复选按钮的状态。通过 Checked 属性可以将复选按钮设置

为“选中”和“未选中”状态,通过 State 属性可以将复选按钮设置为“选中”、“未选中”

或“部分选中”。 在同一个窗体中,尽量将不同的复选按钮分组使用,将具有相同性质的复选按钮放

在一起。

Page 13: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

82 第 3 章 常见组件编程

3.3.5 TRadioButton 组件

图 3-9 按钮组件相关类的层次结构图

TRadioButton组件为单选按钮组件,可以在多个条件中选择唯一的一个。通常在使用单

选按钮时,总是将其进行分组。在同一组中,只能同时选中一个按钮,其余按钮自动取消选

中。在实现单选按钮的分组时,可以有两种方法: 利用分组框组件(TGroupBox)和单选按钮组件(TRadioButton)实现。首先向窗体

中添加分组框,然后向分组框中添加单选按钮。这样,同一个分组框中的单选按钮就自动成

为一组。可以通过 TRadioButton 组件的 Checked 属性来确定哪一个单选按钮被选中。 利用单选按钮分组框(TRadioGroup)实现。可以通过 ItemIndex 属性来确定选中哪

一个单选按钮。 与上面这些按钮及其分类组件有关的类的层次结构如图3-9所示。

3.4 列表类组件

3.4.1 TListBox 组件

TListBox组件可以显示一系列字符串,用户可以选中其中的一个或多个。在使用列表框

的时候应注意: 可以在设计阶段改变 Items 属性来预先设置列表框的内容,同时也可以在运行期间

通过代码改变列表框的内容。例如向列表框中增加条目:ListBox1.Items.Add('增加的新条目'),删除当前选中的一个条目:ListBox1.Items.Delete(ListBox1.ItemIndex),清除所有的条目:

ListBox1.Clear 等. 如果将 TListBox 组件的 MultiSelect 属性设置为 True,就可以一次选中多个条目。 如果将TListBox组件的Sorted属性设置为True,可以自动将列表框中的字符串排序。

Page 14: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 83

3.4.2 TComboBox 组件

TComboBox组件为组合框组件。组合框由一个编辑框和一个下拉式列表框组成,可以从

多个列表条目中选择一个。在使用组合框的时候应注意: 组合框有五种类型,可以通过 Style 属性来设置,如表 3-2 所示。

表 3-2 ComboBox 组件的 Style 属性可取的数值

Style属性值 说明

CsDropDown 在在组合框的编辑框中可以输入,同时下拉式列表框是一组具有等高度

的字符串

CsDropDownList 在组合框的编辑框为只读的,而且编辑框中的内容只能在从列表框中选

CsSimple 在只有一个编辑框显示,可以在编辑框中输入字符串,也可以通过上、

下箭头键改变编辑框中的内容

CsOwnerDrawFixed 在组合框由一个只读编辑框和条目高度相等的列表框组成,条目的高度

由属性ItemHeight 确定

CsOwnerDrawVariable 在组合框由一个只读编辑框和列表框组成,条目的高度可以不同

通过属性 DropDownCount 可以改变列表框显示条目的个数,默认值为 8。当列表框

中的条目大于 DropDownCount 时,将会在列表框右面自动出现一个滚动条。

3.4.3 TTreeView 组件

TTreeView组件可以显示具有树型层次的数据。TTreeView在表示树型的数据结构时非常

优越。Windows的资源管理器就是将磁盘或光盘上的目录结构以树的形式表现的。在使用

TTreeView组件的时候应注意: 树的生成可以在设计阶段进行,也就是改变 Items 属性。单击 Items 属性右面的省略

号按钮,在弹出的TTreeView Items Editor对话框中可以方便地生成一个树。另外在TTreeView组件上单击鼠标右键,通过菜单 Items Editor…也可以打开 Tree View Items Editor 对话框。

在程序运行期间,可以动态地改变树的内容。可以通过 TTreeView 组件 Items 属性

的 Add、AddChild、Delete 函数等实现。

图 3-10 TreeView Items Editor 对话框

Page 15: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

84 第 3 章 常见组件编程

一般在树上的每个条目前会有一个小图标。有时当该条目被选中时,会显示另一个

小图标。在 Delphi 中,这些小图标由 ImageList 组件( Win 32 组件夹的第 3 个组件)进行统一

管理,然后在 TTreeView 组件的 Images 属性中选择一个 ImageList 组件,接着具体设置每个

条目的 ImageIndex 属性就可以选择 ImageList 组件中相应的图标了。 如果将 RightClick 属性设置为 True,则在树的某个条目上单击鼠标右键,也可以将

该条目选中。 通常要编写 TTreeView 组件的 OnChange 事件的处理过程,也就是在树上选择了不同的

条目后,执行该事件的处理过程。

3.4.4 TListView 组件

TListView组件可以显示一些列表的条目,可以按大图标、小图标、列表或详细资料等四

种方式显示。在Windows的资源管理器中,采用了TListView组件显示一定目录下的文件信息,

这些文件信息是按大图标、小图标、列表或详细资料等四种方式显示的,可以通过点击工具

栏上的“查看”按钮在四种显示方式之间切换。在使用TListView组件的时候应注意: 在 TListView 中也有一些图标,添加图标的方法与 TTreeView 组件一样,也是先定

义一个 ImageList 组件,再将 TListView 组件的 LargeImages、SmallImages 和 StateImages 等属性与对应的 ImageList 组件关联。

通过对 TListView 组件的 Columns 属性进行设置,可以确定将要显示的列数,并且

可以为每一列指定文字的对齐方式、显示的宽度、图标索引号等。另外,对 TListView 组件

的 Items 属性进行设置,可以向组件中预先增加一些记录。在 TListView 组件上单击鼠标右

键,通过菜单 Columns Editor...和 Items Editor...也可以分别对上面的两项内容进行设置。在

TListView Items Editor 对话框中,单击 New Item 按钮将生成每个记录的第 1 列内容,单击

New SubItem 按钮将生成记录的第 2 列、第 3 列等的内容。

图 3-11 列表组件相关类的层次结构图

Page 16: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 85

3.4.5 TImageList 组件

TImageList 组件是对位图进行管理的不可视组件。TImageList 组件主要用来对窗体中的

图标进行管理,统一分配索引号,然后提供给 TTreeView 组件、TListView 组件等。 通常应将 Masked 属性设置为 True,这样,图标中的背景框就不显示出来,只显示图标

中的必要部分;否则,显示的图标将是一个矩形图形,背景色(比如青色)也将显示出来。

3.4.6 TCheckListBox 组件

TCheckListBox 为复选按钮列表框组件,在列表框中可以有一列或多列复选按钮。可以

通过 TCheckListBox 组件的 Items 属性,在设计阶段添加、修改列表内容。在运行期间,可

以通过下面的代码对列表内容进行修改: (1)增加一个新的复选列表条目:

CheckListBox1.Items.Add('新的复选列表条目');

(2)在索引号为 0 的复选列表条目前的方框中显示一个勾号:

CheckListBox1.Checked[0]:=True;

(3)判断索引号为 1 的复选列表条目是否被选中,也就是该条目被高亮度显示:

if (CheckListBox1.Selected[1]) then ShowMessage('条目1 被选中。') ;

3.4.7 TDateTimePicker 组件

TDateTimePicker 组件可以实现日期或者事件的快速输入。在使用 TDateTimePicker 组件

的时候应注意: 如果 Kind 属性设置为 dtkDate,则输入的是日期;如果 Kind 属性设置为 dtkTime,

则输入的是时间。 在输入的是日期的情况下,修改 DateFormat 属性可以设置日期的格式,有两种格式:

dtLong (长日期型)和 dtShort(短日期型)

3.5 表格类组件

表格显示组件可以用来显示表格化的数据,在下面我们逐一进行介绍。

3.5.1 TDrawGrid 组件

TDrawGrid 组件可以在表格中显示已知结构的数据。通过 FixCols 属性的设置,可以确

定有几列的内容不随水平方向的滚动条移动位置。通常,将 FixCols 属性设置为 1,左边第 1列就不受水平方向的滚动条控制而一直显示,这 1 列就可以作为关键的说明而存在。同样, FixRows 属性也具有类似的功能。

在 Options 属性左边有一个加号,双击 Options 属性将其展开,在下拉的属性中可以对许

多方面进行设置,例如是否可以编辑单元格、是否可以改变一列的宽度、是否可以选定一行

或者是否可以利用鼠标移动一行等。

Page 17: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

86 第 3 章 常见组件编程

图 3-12 表格组件相关类的层次结构图

3.5.2 TStringGrid 组件

TStringGrid组件可以以表格的形式显示一系列字符串。TStringGrid组件比TDrawGrid组件

更常使用。在使用TStringGrid组件的时候应注意: 可以通过改变 TStringGrid 组件的 ColCount、RowCount 属性来获得行数和列数。当

然,在运行期间也可以动态地改变这两个属性值。 通过 TStringGrid 组件的 Cells[Column,Row]属性可以获得行数为 Column,列数为

Row 的单元的内容,也可以为其赋值。

3.5.3 TDBGrid 组件

TDBGrid 组件可以显示数据库中的数据集合。TDBGrid 组件的用法将在数据库部分进行

介绍。

3.6 刻度和进度类组件

刻度和进度相关类的结构如图 3-13 所示。

图 3-13 刻度和进度组件相关类的层次结构图

Page 18: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 87

3.6.1 TProgressBar 组件

TProgressBar 组件为进度条组件,可以动态地显示一个过程的进度。如果一项工作进行

的时间超过了几秒钟,就需要以一定的方式告诉用户:程序正在运行,系统没有死机,请等

待,并通过图形直观的显示进程的速度。进度条组件(TProgressBar)可以实现上述功能。 通常,我们必须知道整个工作的量,然后在对话框中或者状态条中显示 TProgressBar 组

件,根据工作的进度,动态地改变 TProgressBar 组件的 Position 属性。另外,TProgressBar具有 Max 和 Min 属性,用来表示进度条所表示的 大值和 小值。通常, Max 设置为 100,Min 设置为 0,Position 属性的初始值设置为 0。这样,就将整个工作分成了 100 份,每完成

1 份,就将 Position 属性的数值加 1。

3.6.2 TStatusBar

TStatusBar 组件为状态条组件,在其中可以显示一些说明信息。状态条通常放置在窗体

的底部,在上面动态地显示一些信息。例如,可以显示一些指导用户进行操作的信息。选中

状态条组件后,在上面单击鼠标右键,通过菜单命令 Panels Editor...,将弹出一个状态条的编

辑窗体,例如 Editing TStatusBar1.Panels 窗体。窗体具有一个工具栏,第一个按钮为 Add New,

可将状态条分成一些不同的区域。还可以改变不同区域的宽度、显示的文字或者风格。

3.7 分组组件

在窗体中将交互信息分成不同的组,可以便于用户进行操作。Delphi 中提供了下面的一

些分组组件。

3.7.1 TGroupBox 组件

GroupBox 组件为标准的分组框组件。如果要将几个组件放在一个 TGroupBox 组件中,

必须先在窗体中放置这个 TGroupBox 组件,然后选中该 TGroupBox 组件,再添加其它组件。

3.7.2 TRadioGroup 组件

TRadioGroup 组件为单选按钮分组框组件。通过 TRadioGroup 组件可以快速生成一组单

选按钮。通过 Items 属性,可以预先设定单选按钮。Columns 属性可以设置分组框中的列数,

各个按钮之间的距离会自动设置成等间距的。

3.7.3 TPanel 组件

TPanel 组件是一个可视化及灵活性都比较好的分组框组件。在窗体中显示图形的时候,

一般先添加一个 TPanel 组件,然后在上面再添加 Image 组件。这样在图形显示的时候,可以

以 Panel 组件的边框做边界。 另外,可通过设置 BevelInner 属性和 BevelOuter 属性来改变 TPanel 组件的边框样式。

3.7.4 TScrollBox 组件

TScrollBox组件为带有滚动条的分组框组件。如果TScrollBox组件中的其它组件放置的位

置超出了TScrollBox组件的边界,则会自动出现水平方向的或垂直方向的滚动条,通过滚动

Page 19: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

88 第 3 章 常见组件编程

条,可以看到其它组件超出边界的地方。

3.7.5 TTabControl 组件

TTabControl 组件为标签组件,类似于分页组件,但一般多个标签只对应于一个页。从表

面上看,TTabControl 组件与 PageControl 组件非常相似,但在使用的时候,它们之间的差别

非常明显:一个 TTabControl 组件只能对应一个页,而 PageControl 组件一个标签就对应一个

页。在使用 TTabControl 组件的时候应注意: 通过修改 Tabs 属性,可以手工地添加标签的个数。 在 Images 属性中与 ImageList 组件关联,可以为每个标签设置一个图标。 改变 Styles 属性,可以将标签的显示方式设置为标签方式、按钮方式、平板按钮方

式。 一般在 TTabControl 组件的唯一的一个页中放置一些组件,当选择了不同的标签后,

只修改这些组件的数值。

3.7.6 TPageControl 组件

TPageControl 组件为分页组件,可以在多个页中显示不同的组件。在使用 TPageControl组件的时候应注意:

在 TPageControl 组件上单击鼠标右键,在弹出式菜单中选中 New Page 命令,将会

增加一个新的页面。 对于 TPageControl 组件,利用鼠标左键单击标签与单击页面位置选中的对象是不同

的。如果单击标签,则选中了整个组件,同时设置当前激活页,这时按下 Delete 键,会把整

个组件删除。如果单击页面位置,则选中了当前激活页的页面,这时按下 Delete 键,只删除

当前选中的页面。 在 TPageControl 组件的不同页面中,可以加入不同的组件。 在选中整个组件的情况下,改变 ActivePage 属性,可以改变当前的激活页。另外还

可以改变 Images 属性,使之与某个 ImageList 组件相关联,为每个页指定一个图标。 在选中具体页面的情况下,可以改变 TPageIndex 属性,也就是标签排列的顺序会发

生改变。另外可以改变 ImageIndex 属性,指定相关 ImageList 组件中的图标索引值。

3.7.7 THeaderControl 组件

THeaderControl 组件在数据分列的时候可以提供一个标题。在使用 THeaderControl 组件

的时候应注意: 改变 Align 属性,可以指定 THeaderControl 组件放置的位置。默认值为 alTop,组件

停靠在窗体的上部,宽度充满整个窗体。将 Align 属性设置为 alNone,就可以只有改变

THeaderControl 组件的位置与大小了。 选中 THeaderControl 组件并单击鼠标右键,在弹出式菜单中选择 Sections Editor...命

令,可以对 THeaderControl 组件的列进行编辑,指定每列的文字、宽度等。

Page 20: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 89

3.7.8 容器组件组件

在TGroupBox、TPanel、TScrollBox、TTabControl和TPageControl等组件中都可以放置其

它组件,所以是容器组件。在使用容器组件的时候应注意: 应先添加容器组件,然后在选中该容器组件的情况下,再向其中添加其它组件。 如果将容器组件移动、删除,则其中的组件一起被移动、删除。 容器组件中的其它组件只能在该容器组件中显示,超过容器组件边框的部分将不显

示出来。 在窗体上设置 Tab 键顺序的时候,容器组件和它包含的组件是作为一个组件来参加

排序的。容器组件中的组件可以独立于容器外的组件进行 Tab 键顺序排列。

图 3-14 分组组件相关类的层次结构图

3.8 特殊输入组件

3.8.1 TScrollBar 组件

TScrollBar组件为滚动条组件。如果一个窗体中的内容一次显示不完,可以通过滚动条浏

览不同的内容。在使用TScrollBar组件的时候应注意: Kind 属性可以设置滚动条是水平的还是垂直的。取值可以是:

sbHorizontal 滚动条是水平方向的。 sbVertical 滚动条是垂直方向的。

Max、Min 属性用来确定滚动条表示数值的范围,数据类型为 32 位有符号整数类型

(Integer)。 LargeChange、SmallChange 可以设置滚动条数值改变的大小。利用鼠标在滚动条上

(但不是在滚动条的滑动按钮上)单击左键,滚动条上滑动按钮的位置将发生比较大的变化。

Page 21: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

90 第 3 章 常见组件编程

而如果只在滚动条两端的上下按钮上单击左键,则滑动按钮的位置将发生比较小的改变。

LargeChange 表示滑动按钮在滚动条上的位置发生比较大的变化时的数值, SmallChange 则

表示滑动按钮在滚动条上的位置发生比较小的变化时的数值。LargeChange 和 SmallChange为 1~32767 之间的整数。

此外,当焦点定位在滚动条上时,还可以使用PageUp(PgUp)、PageDown(PgDn)、↑、

↓、←、→、Home和End等键快速地改变当前位置。 通常,滚动条的位置发生LargeChange改变时,对应窗体中的内容正好翻过一页(或一屏)。

而滚动条的位置发生SmallChange改变时,对应窗体中的内容正好翻过一行。 Position 属性表示了滚动条当前的位置。

3.8.2 TTrackBar 组件

TTrackBar 组件可以从一个连续的范围内选择一个数值。TTrackBar 组件与 TScrollBar 组件有许多相似之处,也有许多不同之处。在使用 TTrackBar 组件的时候应注意:

Frequency 属性表示每隔几个数值显示一个刻度。 LineSize 属性与 PageSiz 属性对应,表示比较小的变化时位置的改变。如通过按下

↑、↓、←或→等键后位置的改变。 PageSize 属性表示比较大的变化时位置的改变。如通过按下 PageUp(PgUp)或

PageDown (PgDn)等键后位置的改变。 SliderVisible 属性用来设置是否显示滑动按钮。 ThumbLength 属性表示滑动按钮的宽度(或高度)。 TickMask 属性用来指定标尺显示的位置。可以为下面的三个数值:

tmBottomRight 标尺的位置的右面(或下面)。 tmTopLeft 标尺的位置的左面(或上面)。 tmBoth在TTrackBar组件两边都显示标尺。

图 3-15 特殊输入组件相关类的层次结构图

Page 22: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 91

3.8.3 TUpDown 组件

在 TUpDown 组件中通过鼠标点击上下箭头可以改变相关联的组件(如 Edit 组件)中的数

值。在使用 TUpDown 组件的时候应注意: Assosiate 属性指定与 TUpDown 组件关联的组件,可以通过下拉的组合框进行选择。 Increment 属性指定通过 TUpDown 组件而每次增加或减少的步长。 Orientation 属性确定组件的方向,可以取下面的两个值之一:

udHorizontal 水平方向,箭头左右指向。 udVertical 垂直方向,箭头上下指向。

Thousand 属性可以设置当数值超过 999 时,是否在千位后显示一个逗号。 Wrap 属性可以设置相关联的组件中的数值是否循环变化。如在 大值的时候,再按上

箭头,则相关联的组件中数值变为 小值。

3.8.4 THotKey 组件

THotKey 组件可以输入 Ctrl/Shift/Alt 与其它键的组合键,可用来定义热键。THotKey 组

件可以在设计阶段指定热键,也可以在运行期间改变。

3.9 菜单的使用

菜单是 Windows 应用程序和用户之间统一的交互方式,操作方便、简单直观。菜单有多

种样式,如固定式、下拉式和弹出式等。 Windows 中的菜单通常由顶层的水平列表项以及分别与各项相连的下拉式菜单所组成,

当用户选择了顶层某个列表项时,就会弹出其相连的菜单——子菜单。下拉式的子菜单由多

个菜单项组成,可以将多个菜单项进行分组,把相关的菜单项作为一组,组与组之间以分隔

线隔开。 菜单项一般可以分成三种情况:一种只是菜单项名称,这种菜单项直接导致完成某种操

作;另一种是菜单项名称后还有省略号,表示选择它将要弹出一个对话框,用户需要在对话

框中做进一步的工作;还有一种就是菜单项名称后有一个右箭头,表示选中它后又会弹出一

个菜单,这样就可以形成多级菜单。 一般的菜单项具有下面的一些特征:

在菜单项中定义一个快捷键,也就是在菜单的说明文字中有一个带有下划线的字符,

这样用户可以用键盘来选择菜单,大大方便用户的使用。对于顶层的菜单,只要同时按下 Alt键和带有下划线的字符键,就会激活该菜单,并弹出其子菜单;当子菜单弹出后,只要按下

其中的某个带下划线的字符键,即可选择该菜单项。 对于英文菜单,可以选择某个具有代表性的字符定义为快捷键,一般是第一个字母;对于

中文菜单,可在说明文字之后增加一个括号,括号中添加一个具有代表性的字符定义为快捷

键,一般是该中文对应英文单词中的重要字母。如果要使某个字符带有下划线,也就是将相应

的字母作为快捷键,可以在该字母前加一个&符号,如&E,在菜单中将显示为 E。在同一个子

菜单中,每个菜单项的快捷键不能一样。 如果有些菜单项对应的命令是常用命令,可以考虑在工具栏上创建相应的加速按钮,

Page 23: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

92 第 3 章 常见组件编程

同时在该菜单项前添加一个图标,图标应该与相应的加速按钮具有相同的图形标志。 对于有些菜单项,还可以定义热键,也就是定义由 Ctrl、Alt 或 Shift 键与某个字符

键或功能键的组合,如 Ctrl+s 组合键通常用来保存文件;Ctrl+Z 可以取消上一步操作。 定义菜单项时,可以将功能相近的一些菜单项放在一起作为一组,同一个子菜单的不同

组以分隔条隔开。同组的菜单项可以作为复选菜单存在(可以同时将多个菜单项设置为选中方

式),也可以作为单选菜单存在(同时只有一个菜单项可被选中)。只要将菜单项的 Caption 属

性设置为减号“-”,该菜单项就会以分隔条形式出现。 将菜单项分组的另一种方法就是制作多级菜单。在菜单编辑器中选中某个菜单项,按下

Ctrl +→组合键,就可以方便地添加多级菜单。 可以在设计阶段或运行阶段将某个菜单项的 Checked 属性设置为 True,即在该菜单项的

前面添加了一个勾号或点号;将 Checked 属性设置为 False,则取消勾号或点号。通常,这样

的菜单项会和工具栏中的某个弹起/按下类型的按钮相关联。

3.9.1 主菜单

在应用程序的标题栏下就是主菜单栏。在主菜单栏中基本上要包括该应用程序中的所有

操作。比如说,在窗体中可以通过右键弹出式菜单实现的操作,一般在主菜单中也要有相应

的菜单项。 在窗体中添加主菜单也就是添加 TMainMenu 组件,该组件在 Standard 组件夹中。在窗

体中添加了 TMainMenu 组件后,双击该组件或在其上单击鼠标右键,在弹出式菜单中选择

Menu Designer...命令,将打开菜单编辑器。可以在对象编辑器中设置每一项的属性,如 Caption属性。设置了一个菜单项的属性后,在其下面或右面会出现一些新的菜单项,选中这些新的

菜单项后可以继续设置属性,这样就可以创建一个完整的菜单体系了。

图 3-16 Menu Designer

应该注意以下几个问题: 可以在窗体中添加一个 ImageList 组件,实现对一些图标的管理。然后在窗体(不是

菜单编辑器窗体)中选中 MainMenu 组件,在对象编辑器中设置该菜单的 Image 属性,与

ImageList 组件关联。 后在菜单编辑器中选中具体的菜单项后,在对象编辑器中修改

ImageIndex 属性,就可以在该菜单项前显示 ImageList 组件中具有相应索引值的图标。另外,

在菜单编辑器窗体中选中某个菜单项,设置对象编辑器中的 Bitmap 属性,也可以为该菜单项

Page 24: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 93

指定一个图形。 要进行菜单项属性的设置和事件处理过程的生成,可以双击菜单组件或通过右键菜

单命令打开菜单编辑器,然后选中具体的菜单项,在对象编辑器中进行修改。 在菜单设计窗体中,可以设置菜单的 ShortCut 属性,为菜单项设置一个热键。

3.9.2 鼠标右键弹出式菜单

应用程序中的鼠标右键弹出式菜单可以方便用户的操作,灵活性也很好。可以给窗体添

加弹出式菜单,也可以给具体的某个组件添加弹出式菜单。另外,窗体中的某几个组件可以

共用一个弹出式菜单,只要将这几个组件的TPopupMenu属性设置成同一个弹出式菜单的名

称就可以了。 弹出式菜单可以通过TPopupMenu组件实现,该组件位于Standard组件夹中。同

TMainMenu组件的设计方法一样,双击TPopupMenu组件或在其上单击鼠标右键,在弹出式

菜单中选择Menu Designer...命令,打开菜单编辑器。 如果要在某个窗体上实现单击鼠标右键弹出菜单,可以在该窗体上添加弹出式菜单,设

计完毕后,还要在窗体的TPopupMenu属性中选中该弹出式菜单。对于组件来说,也要设置

TPopupMenu属性。

3.9.3 使用菜单模板

Delphi中定义了一些菜单模板,在设计阶段可以方便地利用这些菜单模板向菜单中添加

菜单项,而且添加的菜单项具有统一的风格。

1.使用菜单模板

在设计菜单时,要向菜单中添加菜单模板中定义的菜单项时,可以在菜单编辑器中进行。

双击窗体中的菜单组件或通过右键弹出的菜单命令 Menu Designer...,打开菜单编辑器。单击

鼠标右键,在弹出式菜单中选择 Insert From Template...,在接着出现的 Insert Template 对话框

中,可以选择需要添加的模板菜单。单击 O K 按钮,将定义好的菜单添加到正在设计的菜单

中。 注意:

默认方式下的菜单模板是英文方式,不符合中文风格,还要做进一步的修改。定义

了中文菜单模板后,使用起来非常方便。

2.定制菜单模板

在菜单编辑器中先设计好一个或多个子菜单,单击鼠标右键,选中Save As Template...,将弹出Save Template对话框。在Template Description项中输入菜单模板的名称,可以使用中文。

单击OK按钮,则当前菜单编辑器中的菜单就作为一个菜单模板而被保存起来,下次设

计菜单的时候可以重复使用。

3.删除菜单模板

在菜单编辑器中单击鼠标右键,选中 Delete Templates...命令,将弹出 Delete Templates对话框,在其中选中将要删除的菜单模板,可以在按下 Shift 键或 Ctrl 键的同时利用鼠标或上、

Page 25: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

94 第 3 章 常见组件编程

下箭头键选中多个菜单模板,按下 OK 按钮,则选中的菜单模板就被删除了。

3.10 工具栏和状态栏

在工具栏中,通常可以添加按钮(TButton)、图形按钮(TBitBtn)、加速按钮

(TSpeedButton)、组合框(TComboBox)和编辑框(TEdit)等,通过这些组件可以实现快

捷操作。一般来说,在工具栏中可以实现的快捷操作,在菜单中都应该有对应的命令。 工具栏可以通过 TToolBar、TCoolBar 或 TControlBar 组件与其它组件的组合来实现。

3.10.1 ToolBar 组件

TToolBar 组件在 Win32 组件夹中。在窗体中添加了 TToolBar 组件后, Align 属性默认

设置为 alTop,所以 TToolBar 组件默认停靠在窗体的 上边,并且宽度会自动适应窗体宽度

的改变。选中 TToolBar 组件后,可以直接向其中添加其它组件。添加的组件会自动从左向右

依次排列,利用鼠标拖动某个组件可以改变组件排列的位置。注意,往 TToolBar 组件中添加

其它组件的时候, 好先在组件栏中相应的组件上点击一下鼠标左键,然后松开并将鼠标移

动到组件栏上,再点击一下鼠标左键。这时新添加的组件的高度可以适合 TToolBar 组件的高

度。 另外,选中 TToolBar 组件后,单击鼠标右键,可以通过菜单命令 New Button 在组件栏

上添加一个按钮,也可以通过菜单命令 New Separator 在组件栏上添加一个间隔。

3.10.2 TCoolBar 组件

TCoolBar 组件在 Win32 组件夹中。在窗体中添加了 TCoolBar 组件后,Align 属性默认

设置为 alTop,所以 TCoolBar 组件默认停靠在窗体的 上边,并且宽度会自动适应窗体宽度

的改变。在默认状态下, TCoolBar 的高度大于单个工具栏的高度。在一个 TCoolBar 组件中

可以有多个工具栏,并且可以将一个工具栏拖动到另一个工具栏的后面。 选中 TCoolBar 组件后,可以直接向其中添加其它组件。添加的组件会自动形成一个相

对独立的工具栏。例如,向 TCoolBar 组件中添加一个 Button 按钮,则该按钮的宽度会自动

适应一个新添加工具栏的宽度,也就是充满这个新添加的工具栏。但在一般情况下,在一个

工具栏中要添加多个组件,这时可以利用容器组件实现上述功能:先向 TCoolBar 组件中添加

一个 Panel 组件,则会自动创建一个新的工具栏;然后选中 Panel 组件,再向其中添加其它组

件,并调整组件的位置和大小。 工具栏添加好之后,可以对其边框的形状进行设置。对于 TCoolBar 组件,可以设置

BandBordStyle、BordWidth、EdgeBorders、EdgeInner 和 EdgeOuter 等;对于 Panel 组件,可

以设置 BevelInner、BevelOuter、BordStyle 和 BordWidth 等。 另外,选中TCoolBar组件,单击鼠标右键,可以通过菜单命令Bands Editor...打开TCoolBar

编辑框,并在其中添加、修改工具栏。注意:如果要精确设置组件的大小,可以在按下 Shift键的同时按上、下、左、右箭头键。如果要精确调整组件的位置,可以在按下 Ctrl 键的同时

按上、下、左、右箭头键。

Page 26: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 95

3.10.3 TControlBar 组件

TControlBar组件在Additional组件夹中。在窗体中添加了TControlBar组件后,将其Align属性设置为 alNone,这样 TControlBar 组件就不会总停靠在窗体的 上边。当然,可以将其

Align 属性设置为 alTop、alLeft、alRight 或 alBottom 等,这样 TControl 组件就会自动适应窗

体尺度的改变,并停靠在某个边界旁边。 选中 TControlBar 组件后,可以直接向其中添加其它组件。添加的组件会自动形成一个

相对独立的工具栏。同 TCoolBar 组件一样,可以先向 TControlBar 组件中添加一个 Panel 组件,则会自动创建一个新的工具栏;然后选中 Panel 组件,再向其中添加其它组件,并调整

组件的位置、大小。 同样,工具栏添加好之后,可以对其边框的形状、位置特性等进行设置以满足需要。对

于 TControlBar 组件,可以设置 Align、AutoSize、BevelEdge、BevelInner、BevelKind、BevelOuter和 BevelWidth 等属性;对于 Panel 组件,可以设置 Align、AutoSize、BevelInner、BevelOuter、BevelWidth、BordStyle 和 BordWidth 等属性。

3.10.4 TStatusBar 组件

TStatusBar 组件在 Win32 组件页中。在窗体中添加了 TStatusBar 组件后,Align 属性默认

设置为 alBottom,所以 TStatusBar 组件默认停靠在窗体的 下边,并且宽度会自动适应窗体

宽度的改变。在一个 TStatusBar 组件中可以有多个面板。 选中 TStatusBar 组件后,单击鼠标右键,可以通过菜单命令 Panels Edit...打开状态栏编

辑器,并可以添加、修改状态栏中的面板。在状态栏编辑器中,可以设置状态栏中各个面板

的显示内容,面板的宽度等。当然,在程序运行期间,也可以通过代码动态改变各个面板中

的内容。

3.11 编程实例

在这一节里,我们通过两个简单的实例来为读者介绍 Delphi 常用组件的使用方法。

3.11.1 小型计算器

图 3-17 计算器程序界面

Page 27: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

96 第 3 章 常见组件编程

下面我们来看一个小型计算器的设计实例,通过这个程序介绍创建基于对话框的程序技

术。 激活菜单项 File/New Application 创建一个新的工程。仿照图 3-17,在窗体中添加相应的

组件。窗体类定义的代码如下所示:

TForm1 = class(TForm) B_Dot: TButton; B_Zero: TButton; B_One: TButton; B_Two: TButton; B_Three: TButton; B_Four: TButton; B_Five: TButton; B_Six: TButton; B_Seven: TButton; B_Eight: TButton; B_Nine: TButton; B_Equal: TButton; B_C: TButton; D_CE: TButton; B_Div: TButton; B_Mul: TButton; B_Add: TButton; B_Sub: TButton; procedure ClearEntry(); procedure FormCreate(Sender: TObject); procedure B_OneClick(Sender: TObject); procedure B_TwoClick(Sender: TObject); procedure B_ThreeClick(Sender: TObject); procedure B_FourClick(Sender: TObject); procedure B_FiveClick(Sender: TObject); procedure B_SixClick(Sender: TObject); procedure B_SevenClick(Sender: TObject); procedure B_EightClick(Sender: TObject); procedure B_NineClick(Sender: TObject); procedure B_ZeroClick(Sender: TObject); procedure B_AddClick(Sender: TObject); procedure B_SubClick(Sender: TObject); procedure B_DotClick(Sender: TObject); procedure B_CClick(Sender: TObject);

procedure D_CEClick(Sender: TObject);

为程序添加一些常量和变量,相应代码如下所示:

Page 28: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 97

const OperatorNone = WM_USER+100; //定义无任何操作 OperatorAdd = WM_USER+101; //定义加法操作 OperatorSub = WM_USER+102; //定义减法操作 OperatorMul =WM_USER+103; //定义乘法操作 OperatorDiv =WM_USER+104; //定义除法操作

为窗体添加私有变量如下所示:

public { Public declarations } mAccumulator:double; //暂时累加器 nAccumulator:double; //当前累加器 nDecimal:integer; //当前的小数点位置 nPreviousOperation:integer; //if true,清累加器 nClear:Boolean;

为窗体的 OnCreate 事件过程添加如下代码:

procedure TForm1.FormCreate(Sender: TObject); begin mAccumulator:=0; nAccumulator:=0; nDecimal:=0; nPreviousOperation:=OperatorNone; nClear:=false; end;

清空当前累加器的代码如下所示: procedure TForm1.ClearEntry(); begin nAccumulator:=0; nDecimal:=0; nClear:=false; end;

下面我们设置各数字按钮事件响应过程,相应代码如下:

//按钮1 procedure TForm1.B_OneClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数

Page 29: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

98 第 3 章 常见组件编程

if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+1.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+1; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator); end;

//按钮2 procedure TForm1.B_TwoClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+2.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+2.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator); end;

//按钮3 procedure TForm1.B_ThreeClick(Sender: TObject); begin

Page 30: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 99

if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+3.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+3.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮4 procedure TForm1.B_FourClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+4.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+4.0; end;

Page 31: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

100 第 3 章 常见组件编程

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮5 procedure TForm1.B_FiveClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+5.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+5.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮6 procedure TForm1.B_SixClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+6.0/nDecimal; nDecimal:=nDecimal*10; end

Page 32: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 101

else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+6.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮7 procedure TForm1.B_SevenClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+7.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+7.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮8 procedure TForm1.B_EightClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数

Page 33: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

102 第 3 章 常见组件编程

if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+8.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+8.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮9 procedure TForm1.B_NineClick(Sender: TObject); begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+9.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+9.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator);

end;

//按钮0 procedure TForm1.B_ZeroClick(Sender: TObject);

Page 34: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 103

begin if nClear=True then begin ClearEntry(); //清空当前累加器 end;

//判断是否为实数 if nDecimal>0 then //为实数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator+0.0/nDecimal; nDecimal:=nDecimal*10; end else //为整数 begin //加上当前按钮代表的值 nAccumulator:=nAccumulator*10; nDecimal:=nDecimal+0.0; end;

//向TEdit窗体输出结果 Screen.Text:=CurrToStr(nAccumulator); end;

//其它运算按钮相应函数 //+运算符 procedure TForm1.B_AddClick(Sender: TObject); begin //判断前一次按下的运算符 case nPreviousOperation of OperatorAdd: //前一次为+ begin //当前累加器和暂时累加器相加 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator+nAccumulator; end; OperatorSub: begin //当前累加器和暂时累加器相减 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator-nAccumulator; end; OperatorMul: begin //当前累加器和暂时累加器相乘

Page 35: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

104 第 3 章 常见组件编程

nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator*nAccumulator; end; OperatorDiv: //当前累加器和暂时累加器相除 begin nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator/nAccumulator; end; OperatorNone: begin //不做任何操作 nAccumulator:=StrToCurr(Screen.Text); end;

//记录这次按下的运算符 nPreviosOperation:=OperatorAdd; nClear:=True; mAccumulator:=nAccumulator; Screen.Text:=CurrToStr(mAccumulator); end; //-运算符 procedure TForm1.B_SubClick(Sender: TObject); begin //判断前一次按下的运算符 case nPreviousOperation of OperatorAdd: //前一次为+ begin //当前累加器和暂时累加器相加 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator+nAccumulator; end; OperatorSub: begin //当前累加器和暂时累加器相减 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator-nAccumulator; end; OperatorMul: begin //当前累加器和暂时累加器相乘 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator*nAccumulator; end;

Page 36: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 105

OperatorDiv: //当前累加器和暂时累加器相除 begin nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator/nAccumulator; end; OperatorNone: begin //不做任何操作 nAccumulator:=StrToCurr(Screen.Text); end;

//记录这次按下的运算符 nPreviosOperation:=OperatorSub; nClear:=True; mAccumulator:=nAccumulator; Screen.Text:=CurrToStr(mAccumulator); end;

//乘运算符 procedure TForm1.B_MulClick(Sender: TObject); begin //判断前一次按下的运算符 case nPreviousOperation of OperatorAdd: //前一次为+ begin //当前累加器和暂时累加器相加 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator+nAccumulator; end; OperatorSub: begin //当前累加器和暂时累加器相减 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator-nAccumulator; end; OperatorMul: begin //当前累加器和暂时累加器相乘 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator*nAccumulator; end; OperatorDiv: //当前累加器和暂时累加器相除

Page 37: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

106 第 3 章 常见组件编程

begin nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator/nAccumulator; end; OperatorNone: begin //不做任何操作 nAccumulator:=StrToCurr(Screen.Text); end;

//记录这次按下的运算符 nPreviosOperation:=OperatorMul; nClear:=True; mAccumulator:=nAccumulator; Screen.Text:=CurrToStr(mAccumulator); end;

//除运算符 procedure TForm1.B_DivClick(Sender: TObject); begin //判断前一次按下的运算符 case nPreviousOperation of OperatorAdd: //前一次为+ begin //当前累加器和暂时累加器相加 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator+nAccumulator; end; OperatorSub: begin //当前累加器和暂时累加器相减 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator-nAccumulator; end; OperatorMul: begin //当前累加器和暂时累加器相乘 nAccumulator:=StrToCurr(Screen.Text); nAccumulator:=mAccumulator*nAccumulator; end; OperatorDiv: //当前累加器和暂时累加器相除 begin nAccumulator:=StrToCurr(Screen.Text);

Page 38: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 107

nAccumulator:=mAccumulator/nAccumulator; end; OperatorNone: begin //不做任何操作 nAccumulator:=StrToCurr(Screen.Text); end;

//记录这次按下的运算符 nPreviosOperation:=OperatorDiv; nClear:=True; mAccumulator:=nAccumulator; Screen.Text:=CurrToStr(mAccumulator); end;

//小数点 procedure TForm1.B_DotClick(Sender: TObject); begin if nclear=true then begin clearEntry; end;

if nDecimal=0 then begin nDecimal:=10; end; end;

//清除符号C procedure TForm1.B_CClick(Sender: TObject); //清除当前累加器 begin ClearEntry(); Screen.Text:=CurrToStr(nAccumulator); end;

//全部清除符号CE procedure TForm1.D_CEClick(Sender: TObject); //清除当前累加器和暂时累加器 begin ClearEntry(); Screen.Text:=CurrToStr(nAccumulator); mAccumulator:=0.0; end;

Page 39: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

108 第 3 章 常见组件编程

3.11.2 文本编辑器的实现

在这一小节里,我们为读者介绍多文本界面(MDI)和多页面界面(MPI)技术;以及

VCL 库中 TMemo,TEdit 组件和有关文本编辑的常用对话框的使用。我们开发的一个文本

编辑器的实用程序,可实现如下功能: MDI 的编辑环境 创建打开、编辑、保存文件 查找、替换文件中指定的字符串 复制、粘贴、剪切字符串 设置文件字体大小 打印文件

文本编辑器是一种常用的应用程序。用户在编辑器中编辑多种文件,在多个文件之间进

行数据交换,对文件进行各种属性设置,并按自己要求打印文件。 激活菜单 File/New Application 创建一个新的工程。设置主窗体 FormStyle 属性为

fsMDIForm。

图 3-18 Project Options 对话框

Page 40: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 109

图 3-19 主窗体界面

图 3-20 子窗体界面

新建窗体,设置其 FormStyle 属性为 fsMDIForm。 因为子窗体是缺省可见的,所以如果要在应用程序运行时创建子窗体,而不要 Delphi

自动的创建,则可以采取以下步骤: (1)激活 Project/Options 菜单,系统弹出自动创建列表对话框,如图 3-20 所示; (2)在自动创建列表中选中子窗体; (3)单击右尖角符号“>”按钮将子窗体移至 Available 窗体列表中;

Page 41: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

110 第 3 章 常见组件编程

(4)单击 OK 按钮退出。 为父窗体和子窗体设置相应的菜单项。在父窗体中添加 TOpenDialog 组件,如图 3-19 所

示。 为子窗体添加一个 TRichEdit 组件,设置其 Align 属性为 alClient;添加字体对话框组件

(TFontDialog Componement),查找对话框(TFindDialog Componement) 组件,替换对话框组

件(TReplaceDialog Componement),文件打开对话框组件(TOpenDialog Componement)和

打印对话框组件(TPrintDialog Componement)。设计好的子窗体界面如图 3-20 所示。 字体对话框组件在应用程序中调用 Windows 字体对话框,用户可以在对话框中进行字体

选择和属性设置。用户选择字体并按下 OK 按钮之后,有关信息便存储在组件的 Font 属性中。

应用程序可通过调用字体对话框的 Execute 方法来显示对话框,如图所示,当用户选择 OK按钮后,Execute 方法返回 True 值;否则返回 False。

打开对话框包含一个 Filters 属性,它可确定文件类型和在文件类型下拉框中的顺序。调

用 Execute 方法可显示打开对话框,如图 3-22 所示。 TPrintDialog 组件显示一打印对话框。用户在此对话框中可选择打印机、打印页数、打

印份数等。当用户点击对话框中的 Setup 按钮时,便会出现打印设置对话框。使用 Option 属

性可以设置打印对话框的形式。

图 3-21 字体对话框

Page 42: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 111

图 3-22 打开对话框

下面我们添加父窗体的各事件处理过程,相应代码如下:

//关闭父窗体 procedure TFrameForm.Exit1Click(Sender:TObject); begin Close; end;

//动态新建一个子窗体 procedure TFrameForm.New1Click(Sender:TObject); begin TEditForm.Create(Self); end;

//定义子窗体状态 procedure TFrameForm.Tile1Click(Sender:TObject); begin Tile; end;

procedure TFrameForm.Cascade1Click(Sender:TObject); begin Cascade; end;

procedure TFrameForm.Arrangeicons1Click(Sender:TObject); begin ArrangeIcons;

Page 43: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

112 第 3 章 常见组件编程

end;

//打开一个文件 procedure TFrameForm.Open1Click(Sender:TObject); begin if OpenFileDialog.Execute then with TEditForm.Create(Self) do Open(OpenFileDialog.FileName); end;

//在子窗体中添加代码

private { Private declarations } PathName:String; public { Public declarations } procedure Open(const AFileName:string);

var EditForm: TEditForm;

const DefaultFileName = 'Untiled';

implementation uses Clipbrd,Printers,MDIFrame; {$R *.dfm}

//子窗体退出 procedure TEditForm.Exit1Click(Sender:TObject); begin FrameForm.Exit1Click(Sender); end;

//新建一个子窗体 procedure TEditForm.New1Click(Sender:TObject); begin FrameForm.New1Click(Sender); end;

//打开一个文件 procedure TEditForm.Open1Click(Sender:TObject); begin FrameForm.Open1Click(Sender); end;

//字符对齐操作 procedure TEditForm.Align1Click(Sender:TObject);

Page 44: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 113

begin Left1.Checked := False; Right1.Checked := False; Center1.Checked := False; with Sender as TMenuItem do Checked :=True; with Editor.Paragraph do if Left1.Checked then //左对齐 Alignment:=taLeftJustify else if Right1.Checked then Alignment:=taRightJustify else if Center1.Checked then Alignment:=taCenter; end;

//剪切操作 procedure TEditForm.Cut1Click(Sender:TObject); begin Editor.CutToClipboard; end;

//拷贝到剪切板 procedure TEditForm.Copy1Click(Sender:TObject); begin Editor.CopyToClipboard; end;

//把剪切版的内容粘贴到文件中 procedure TEditForm.Paste1Click(Sender:TObject); begin Editor.PasteFormClipboard; end;

//全选全部文本 procedure TEditForm.SelectAllClick(Sender:TObject); begin Editor.SelectAll; end;

//删除所选文本操作 procedure TEditForm.Delete1Click(Sender:TObject); begin Editor.ClearSelection; end;

procedure TEditForm.Edit1Click(Sender:TObject); begin

Page 45: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

114 第 3 章 常见组件编程

Paste1.Enabled:=Clipboard.HasFormat(CF_TEXT); Paste2.Enabled:=Paste1.Enabled; HasSelection:=Editor.SleLength>0; Cut1.Enabled:=HasSelection; Cut2.Enabled:=HasSelection; Copy1.Enabled:=HasSelection; Copy2.Enabled:=HasSelection; Delete1.Enabled:=HasSelection; end;

//打开一个文件 procedure TEditForm.Open(const AFileName:string); begin PathName:=AFileName; Caption:=ExtractFileName(AFileName); with Editor do begin Lines.LoadFromFile(PathName); SelStart:=0; Modified:=false; end; end;

//存储文件 procedure TEditForm.Saveas1Click(Sender:TObject); begin SaveFileDialog.FileName:=PathName; if SaveFileDialog.Execute then begin PathName:=SaveFileDialog.FileName; Caption:=ExtractFileName(PathName); Save1Click(Sender); end; end;

procedure TEditForm.Save1Click(Sender:TObject); begin if PathName = DefaultFileName then SaveAsClick(Sender) else begin Editor.Lines.SaveToFile(PathName); Editor.Modified:=False; end; end;

Page 46: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 115

//选择字体的属性 procedure TEditForm.Font1Click(Sender:TObject); begin FontDialog1.Font:=Editor.Font; if FontDialog1.Execute then Editor.SelAttributes.Assign(FontDialog1.Font); end;

//关闭文件 procedure TEditForm.Close1Click(Sender:TObject); begin Close; end;

//关闭子窗体 procedure TEditForm.FormClose(Sender:TObject;var Action:TCloseAction); begin Action :=caFree; end;

procedure TEditForm.FormCloseQuery(Sender:TObject;var CanClose:Boolean); const SWarningText='Save changes to%s?'; begin if Editor.Moditied then begin case MessageDlg(Format(SWarningText,[PathName]), mtConfirmation, [mbYes,mbNo,mbCancel],0) of idYes:Save1Click(Self); idCancel:CanClose:=False; end; end; end;

procedure TEditForm.FormCreate(Sender:TObject); begin PathName:=DefaultFileName; end;

//用打印对话框设置打印属性 procedure TEditForm.PrintersetupClick(Sender:TObject); begin PrinterSetUpDialog1.Execute; end;

Page 47: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

116 第 3 章 常见组件编程

//打印文件 procedure TEditForm.Print1Click(Sender:TObject); begin if PrinterDialog1.Execute then Editor.Print(PathName); end;

由于程序的算法比较简单,故在此不再做详细解释,读者可参照注释进行理解。

3.12 本章小结

本章介绍了 Delphi 常用的组件和一些基本的编程技术。主要包括各组件类的使用和基本

的相互继承关系以及菜单和工具栏的基本概念,并通过两个实例使读者对本章所讲述内容进

一步加深理解。通过这一部分的学习,读者可以了解开发 Windows 环境下应用程序的一些关

键技术,并可以方便、快捷地开发一般的应用程序,希望读者好好体会。

Page 48: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 117

第 3 章 常见组件编程 71

72 第 3 章 常见组件编程

第 3 章 常见组件编程 73

74 第 3 章 常见组件编程

第 3 章 常见组件编程 75

76 第 3 章 常见组件编程

第 3 章 常见组件编程 77

78 第 3 章 常见组件编程

第 3 章 常见组件编程 79

80 第 3 章 常见组件编程

第 3 章 常见组件编程 81

82 第 3 章 常见组件编程

第 3 章 常见组件编程 83

Page 49: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

118 第 3 章 常见组件编程

84 第 3 章 常见组件编程

第 3 章 常见组件编程 85

86 第 3 章 常见组件编程

第 3 章 常见组件编程 87

88 第 3 章 常见组件编程

第 3 章 常见组件编程 89

90 第 3 章 常见组件编程

第 3 章 常见组件编程 91

92 第 3 章 常见组件编程

第 3 章 常见组件编程 93

94 第 3 章 常见组件编程

第 3 章 常见组件编程 95

Page 50: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 119

96 第 3 章 常见组件编程

第 3 章 常见组件编程 97

98 第 3 章 常见组件编程

第 3 章 常见组件编程 99

100 第 3 章 常见组件编程

第 3 章 常见组件编程 101

102 第 3 章 常见组件编程

第 3 章 常见组件编程 103

104 第 3 章 常见组件编程

第 3 章 常见组件编程 105

106 第 3 章 常见组件编程

Page 51: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

120 第 3 章 常见组件编程

第 3 章 常见组件编程 107

108 第 3 章 常见组件编程

第 3 章 常见组件编程 109

110 第 3 章 常见组件编程

第 3 章 常见组件编程 111

112 第 3 章 常见组件编程

第 3 章 常见组件编程 113

114 第 3 章 常见组件编程

第 3 章 常见组件编程 115

116 第 3 章 常见组件编程

Page 52: 第3章 常见组件编程 - read.pudn.comread.pudn.com/downloads164/ebook/746472/03.pdf · 72 第3 章 常见组件编程 的biHelp会与属性BorderStyle的bsSizeable冲突。 3.Caption属性

第 3 章 常见组件编程 121

第 3 章 常见组件编程 117

118 第 3 章 常见组件编程

第 3 章 常见组件编程 119

120 第 3 章 常见组件编程