Delphi 7 控件实用程序设计100 例

328
程序设计实例丛书 Delphi 7 控件实用程序设计 100 段兴 主编 张敬韶 孙丽娜 编著 人 民 邮 电 出 版 社

Transcript of Delphi 7 控件实用程序设计100 例

程序设计实例丛书

Delphi 7 控件实用程序设计 100例

段兴 主编

宋 雷 张敬韶 孙丽娜 编著

人 民 邮 电 出 版 社

图书在版编目(CIP)数据

Delphi 7控件实用程序设计 100例 / 段兴主编. —北京:人民邮电出版社,2003.6 (程序设计实例丛书) ISBN 7–115–11297–5

Ⅰ.D… Ⅱ.段… Ⅲ.软件工具—程序设计 Ⅳ.TP311-56

中国版本图书馆 CIP数据核字(2003)第 040218号 内容提要

本书选取了利用 Delphi 7开发的控件方面有代表性的 100个编程实例。这些实例按照完成功能可划分为

窗口与界面,图形处理,多媒体,网络,数据库与报表,系统、文件及其他控件等几方面的内容,涵盖了 Delphi

7控件应用开发的主要方面。其中,Delphi 7自带控件实例与第三方控件实例各占一半。本书基础与提高并重,

既有基本知识,如动态菜单设置、鼠标切分界面、显示树形视图等的讲解,又有一些高级应用的分析,如三

维动画程序、TTS语音引擎、瘦客户型程序等。通过阅读本书,读者可以了解和掌握 Delphi 7控件应用开发

中常见的使用方法和高级应用技巧。

实用是本书的最大特色。本书大部分实例功能强大、效果新颖,实用性很强,可以帮助读者快速掌握控

件应用开发技术,另外部分实例侧重于帮助读者理解 Delphi 7控件应用开发的基本概念、重点和难点。

本书适合掌握 Delphi 7基本编程技术的读者阅读。

程序设计实例丛书

Delphi 7控件实用程序设计 100例

主 编 段 兴

◆ 编 著 宋 雷 张敬韶 孙丽娜

责任编辑 刘 浩

◆ 人民邮电出版社出版发行 北京市崇文区夕照寺街 14 号

邮编 100061 电子函件 [email protected]

网址 http://www.ptpress.com.cn

读者热线:010-67132692

北京汉魂图文设计有限公司制作

北京 印刷厂印刷

新华书店总店北京发行所经销

◆ 开本:787×1092 1/16

印张:20.75

字数:505千字 2003年 6月第 1版

印数:1—0 000册 2003年 6月北京第 1次印刷

ISBN 7-115-11297-5/TP·3466

定价:35.00元(附光盘)

本书如有印装质量问题,请与本社联系 电话:()

– 1 –

前 言 Delphi经过Borland公司的不断完善,第三方资源的大量加入以及广大爱好者的大力支持,

已经成为功能十分强大、使用人数众多的、当今主流的面向对象的编程语言。 Delphi控件技术更多地融入了模块化结构等优秀设计思想,使得从桌面应用向多层、Web

应用程序、XML 方面扩展变得非常容易,同时在跨平台使用、手机短信、语音引擎、GIS 全球定位应用等方面都显示出迷人的潜力。 本书较详细地讲解了 100个重要控件的属性、事件、方法等,并对重点问题做了较深入的

探讨,使得读者可以尽快掌握控件的应用。 全书共分为六篇。 第一篇 窗口与界面。讲述如何利用 XPMenu、GIFForm、Splitter、fcTreeCombo 等界面

控件设计Windows XP界面、动画图形窗口、动态分隔界面、在下拉列表框中显示树形视图等应用程序。 第二篇 图形处理。讲述如何利用 DrawGrid、DBChart、StringGrid、Layer等图形控件设

计图形栅格、数据库图表、图块网格、分层图形等应用程序。 第三篇 多媒体。讲述如何利用MediaPlay、GLVisir、TTSEnglish、AbcEffectsImage等多

媒体控件设计多媒体播放、三维动画、TTS语音引擎、制作图像特效集合等应用程序。 第四篇 网络。讲述如何利用 NmFtp、Socket、WebUpdate、GeoWhoIs 等网络控件进行

文件上传及下载、网络通信和数据传输、在线升级、网址定位器等流行软件的制作。 第五篇 数据库与报表。讲述如何利用 TclientDataSet、TBatchMove、TDBCtrlGrid、

WNQuery 等数据库控件提供瘦客户型程序、数据批量操作、扩展数据栅格、万能查询等高效率的数据库解决方案。

第六篇 系统、文件及其他控件。讲述如何利用 SkinEngine、TsearchFolders、SimplePie 、PrintPreview、Tamdesktop 等系统、文件类控件编写 XP 皮肤更换、文件的扫描查找、饼图进度条、打印预览、桌面背景动画效果等应用程序。 本书着重讲解了实例效果、制作步骤、有关参数调整和注意问题,这可以使得读者在学会

实例应用的同时,对相关函数调用与参数配置也有相应了解,起到触类旁通的作用。 配套光盘中包含本书的所有实例,全部经过精心调试,读者可以直接调用。 本书的编写凝聚了一批程序员、高校教师的辛勤工作和无私奉献,其中对外经济贸易大学

的张敬韶、贺文杰,山东大学的梁磊清、肖仁华等老师将很多优秀的原创代码无偿奉献并仔细

修订,同时翻译了部分国外代码,并逐一调试。山东省教委段欣副教授在百忙之中抽出时间对

本书重点章节及代码进行了审阅、调试。正是他们出色的才华与良好的团队合作精神,才使得

本书在质量上更进一步,谢谢他们。 本书由青岛三角洲数码技术开发中心策划,段兴主编。 由于水平有限,加之时间仓促,本书难免存在不足之处,还望广大读者批评指正。 本书配套光盘使用办法: 本书配套光盘包含全书 100个实例源代码及大部分对应的第三方控件。实例源代码位于光

– 2 –

盘各实例的根目录下,或光盘各实例根目录下“Demos”文件夹内,对应的第三方控件位于光盘实例的根目录下“Source”文件夹或“Components”文件夹内。

使用本书光盘实例源代码时,涉及第三方控件的实例需要重新安装、注册第三方控件;涉

及数据库的部分实例,需要重新给数据库所在的文件夹设置数据库别名,如“mydatabase”等;另外,部分远程访问实例需要设置更多参数才能正常运行;各实例具体的数据库别名等参数设

置请参阅该例程序说明及制作步骤。 涉及到的第三方免费控件,绝大部分都包含在光盘相应实例文件夹内,涉及到的第三方共

享、商业控件,都在“程序说明”中说明下载地址。所有使用到的数据库文件都在光盘根目录

下“数据库”文件夹内,请根据本机有关设置重新定位源代码相关设置。

编者 2003年 5月

目 录

第一篇 窗口与界面...............................................................................................................1

实例 1 CoolBar——浮动工具栏窗口 ......................................................................................2 实例 2 ListBox——列表框控件...............................................................................................5 实例 3 StatusBar——状态栏控件 ............................................................................................7 实例 4 TabSet控件——选项卡页..........................................................................................10 实例 5 PageControl——页面控制控件..................................................................................16 实例 6 XPMenu——Windows XP界面 .................................................................................18 实例 7 GIFForm——动画图形窗口.......................................................................................21 实例 8 EzRgnBtn——多态图形按钮 .....................................................................................23 实例 9 ComboBoxX——多功能组合框 ................................................................................25 实例 10 CaptionButton——标题栏按钮 ................................................................................28 实例 11 CoolTrayIcon——托盘图标......................................................................................29 实例 12 LinkButton—— 超链接按钮 ...................................................................................31 实例 13 AdvStringGrid——按钮网格界面............................................................................32 实例 14 fcOutLookBar——OutLook滚动工具栏 .................................................................38 实例 15 fcTreeCombo——在下拉列表框中显示树形视图..................................................41 实例 16 MainMenu——主菜单控件 ......................................................................................43 实例 17 ToolBar2000——工具条...........................................................................................46 实例 18 AbcWelcomeTipsDialog——每日提示对话框 ........................................................50 实例 19 wwCheckBox——图形复选框 .................................................................................52 实例 20 fcImageForm——异形图形界面 ..............................................................................54 实例 21 TMS Skin Factory——播放器皮肤 ..........................................................................57 实例 22 fcButtonGroup——动画效果切换选项卡................................................................60

第二篇 图形处理 ..................................................................................................................63

实例 23 PaintBox——画图.....................................................................................................64 实例 24 DrawGrid——图形栅格 ...........................................................................................68 实例 25 Chart用法..................................................................................................................72 实例 26 ColorGrid——调色板 ...............................................................................................75 实例 27 DBChart——数据库图表 .........................................................................................79 实例 28 Shape——形状..........................................................................................................82 实例 29 StringGrid——图块网格...........................................................................................85 实例 30 Timer用法 .................................................................................................................89 实例 31 Layer——分层图形 ..................................................................................................92 实例 32 AMClock——图形时钟............................................................................................94 实例 33 ScreenCapture——屏幕抓图 ....................................................................................97

国 Delphi 7控件实用程序设计 100例

– 2 –

第三篇 多媒体 .....................................................................................................................101

实例 34 MediaPlay——多媒体播放 ....................................................................................102 实例 35 Animate——播放 AVI文件 ...................................................................................105 实例 36 GIFImage——GIF动画制作与显示 ......................................................................108 实例 37 GLVisir——三维动画 .............................................................................................111 实例 38 TTSEnglish——TTS语音引擎 ..............................................................................115 实例 39 NKImageForm——图形窗体 .................................................................................118 实例 40 IAgaloLED——有光晕的 LED面板 .....................................................................119 实例 41 FcImage——图像特效............................................................................................121 实例 42 ShockwaveFlash——播放 Flash动画 ....................................................................123 实例 43 AbcEffectsImage——图像特效集合 ......................................................................126 实例 44 ActiveMovie——播放.mov文件 ...........................................................................127

第四篇 网络 ..........................................................................................................................129

实例 45 WebBrowser——浏览器 .........................................................................................130 实例 46 Socket——网络通信和数据传输 ...........................................................................133 实例 47 WebNavigator——网页浏览器 ..............................................................................137 实例 48 WebUpdate——在线升级专家 ...............................................................................138 实例 49 WebCopy——网络拷贝..........................................................................................141 实例 50 GeoWhoIs——网址定位器 ....................................................................................144 实例 51 WebImage——Web网络图片 ................................................................................147 实例 52 CEFileOperations——文件上传和下载 .................................................................149

第五篇 数据库与报表 .....................................................................................................153

实例 53 TclientDataSet——瘦客户型控件 ..........................................................................154 实例 54 TUpdateSQL——控件的使用 ................................................................................157 实例 55 TBatchMove——数据批量操作.............................................................................160 实例 56 TDBCtrlGrid——扩展的数据栅格 ........................................................................163

实实实例例例 555777 通用报表工具 SReport............................................................................................165 实例 58 万能查询控件WNQuery ........................................................................................168 实例 59 查询控件 EsLib .......................................................................................................172 实例 60 报表控件 FastReport ...............................................................................................175 实例 61 Exporter控件组的使用...........................................................................................177 实例 62 F1Book——数据表格.............................................................................................180 实例 63 DBLookupComboBox、DBLookupListBox——循环填充列表...........................183 实例 64 AdvColumnGrid——突出显示特殊数据...............................................................186 实例 65 DBTreeView——数据库树形视图.........................................................................190 实例 66 dxDBGrid——多功能数据表格.............................................................................194

目录国

– 3 –

实例 67 wwIncrementalSearch——实时查询控件 ..............................................................198 实例 68 DBInspectorBar——全能数据库导航条................................................................200

第六篇 系统、文件及其他...........................................................................................205

实例 69 AniIcon——动画光标.............................................................................................206 实例 70 FcLabel——三维标签效果.....................................................................................210 实例 71 MoneyEdit——货币输入计算框............................................................................213 实例 72 ParamTreeview——多功能树形控件.....................................................................215 实例 73 fcTreeView——精彩树形控件 ...............................................................................218 实例 74 SkinEngine——XP皮肤更换 .................................................................................222 实例 75 LsDirTree10、LsFileListView26——资源管理器界面.........................................225 实例 76 TsearchFolders——文件的扫描查找 .....................................................................227 实例 77 ScreenSaver——屏幕保护......................................................................................230 实例 78 TsystemInfo——获得系统信息..............................................................................234 实例 79 TlightSpeed——漂亮的焰火 ..................................................................................238 实例 80 Trend——运动的条状图、线状图、块状图 ........................................................241 实例 81 TwinList——监控正在运行的程序 .......................................................................245 实例 82 LCDNumber——液晶面板.....................................................................................249 实例 83 Tmarquee——模拟电子广告看板..........................................................................253 实例 84 制作记事本..............................................................................................................256 实例 85 ActionList——应用程序通用功能列表.................................................................260 实例 86 PrintPreview——打印预览.....................................................................................262 实例 87 制作图片浏览器......................................................................................................265 实例 88 图形打印 .................................................................................................................268 实例 89 OleContainer——OLE容器 ...................................................................................271 实例 90 XPForm——XP窗体..............................................................................................275 实例 91 CoolItem——提示栏菜单.......................................................................................278 实例 92 DsnRegister——运行时 IDE设计环境 .................................................................280 实例 93 GradProgress——渐变填充的进度条 ....................................................................284 实例 94 SimplePie——饼图进度条 .....................................................................................285 实例 95 PBOpenPreviewDialog/ PBSavePreviewDialog——带预览文本、

图像功能的对话框...................................................................................................287 实例 96 与Word文档关联控件 ...........................................................................................291 实例 97 与 PowerPoint演示文稿关联控件 .........................................................................297 实例 98 TextBrowser——文本浏览控件 .............................................................................303 实例 99 Tamdesktop——桌面背景动画效果 ......................................................................308 实例 100 DBLookUpTreeView——在下拉列表框中显示数据库树形视图......................311

附录 第三方控件的设计及安装方法 ...................................................315

第一篇 窗口与界面

窗口与界面技术一直是应用程序发展历程上的标志性元素,从最初的 DOS命令行界面发展到 Windows 窗口界面,程序界面设计越来越受到重视,人性化、个性化程序界面设计潮流从本质上改变了应用程序远离大众的专业色彩,极大地促进了计算机的普及。 在窗口与界面技术上,不同的编程语言各有侧重,算法语言(如 C语言、C++、Visual C++

等)及数据库相关编程语言(如 Visual FoxPro、Power Builder等)的界面设计方式有很大的差异,而且数据库相关编程语言的界面设计单调、可用控件很少。

尽管不同的编程语言在窗口与界面技术上各有长短,但总地来讲,Delphi 提供的基于控件的窗口与界面技术是目前所有的编程语言中效果最好、效率最高的,它将数据库技术与界面

设计技术完美地结合起来。特别是 Delphi 7版的推出,使得用于算法语言的各种控件与界面设计技术,几乎可以全部用于数据库程序,而且使用极其简单,像流行的 XP菜单、换肤技术、异形窗口等,几乎都可以不写一行代码,使用控件轻松实现,其强大的功能令人叹为观止。 本部分将重点介绍 Delphi 7窗口与界面技术,讲述如何利用 XPMenu、GIFForm、Splitter、

fcTreeCombo等界面控件制作Windows XP界面、动画图形窗口、动态分隔界面、在下拉列表框中显示树形视图等,同时还为读者提供了 Delphi 7通用界面设计的一些常用技巧,使读者对Delphi 7窗口与界面技术有较深刻的理解。

本部分主要有以下精彩内容:

XPMenu——Windows XP界面;

GIFForm——动画图形窗口;

fcTreeCombo——在下拉列表框中显示树形视图;

TMS Skin Factory——播放器皮肤。

国 Delphi 7控件实用程序设计 100例

– 2 –

实例 1 CoolBar——浮动工具栏窗口

实例效果 随着软件技术的不断进步,软件界面也越来越美观,操作也越来越方便。综观市面上比较

专业的各种软件,会发现大部分都提供浮动工具栏窗口,特别像工具软件,基本上都或多或少

有浮动工具栏停靠功能。本例制作了可拖动的菜单工具栏和普通工具栏,可在 Form的四周停靠,并可在启动时就形成浮动工具栏窗口。图 1-1所示为刚启动时的浮动效果,图 1-2所示为菜单工具栏位于窗口左侧,普通工具栏位于窗口底侧的效果。

图 1-1 效果图(1) 图 1-2 效果图(2)

控件说明 Delphi的停靠效果和它的 VCL紧密结合。在 TWinControl类中有 DockSite属性(boolean),

其作用是是否允许别的控件停靠在此控件的上面,在 TControl类中有一个 DragKind属性,如果要这个控件能停靠在别的控件上,可以把 DragKind属性设成 dkDock。就这么简单,只要设置一下属性,一个支持停靠的程序就完成了。 一般的支持停靠的程序都可以在主窗口的上下左右停靠(只要是从 TWinControl继承的控

件都有此功能),这里选择 TCoolBar控件。为了便于读者理解,可以假定主窗口的左边可以停靠。在主窗口上放一个 Align属性为 alLeft的 TCoolBar,宽度为 25,DockSite属性为 True。下边和右边也类似地各放一个 TCoolBar控件。

1. CoolBar控件主要属性如表 1-1所示。

第一篇 窗口与界面国

– 3 –

表 1-1 控件属性 属性 作用 本例设置 备注

Bands 设置停靠条

Align 排列方式 alTop

Docksite 是否停靠 停靠

Bitmap 背景图片

2.主要方法、事件略。 注意:浮动菜单栏的做法其实是结合菜单与浮动工具栏,首先设置了一个MainMenu控件,然后对应设置一个 TCoolBar、一个 ToolBar 控件,并使工具栏快捷按钮的OnClick事件指向菜单按钮的响应事件。 用于停靠的部件,除了本例中用的 CoolBar组件以外,还经常用 Panel控件。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 4

个 CoolBar控件(Win32 组件页),2 个 ToolBar控件(Win32 组件页),1 个 MainMenu 控件(Standard组件页),1个 ImageList1控件,设置它们的属性。

2.在两个 ToolBar上单击鼠标右键,选择 New Button,添加几个 ToolButton按钮。双击MainMenu控件,添加菜单项。详细设置见本书光盘。 完成界面如图 1-3所示。

图 1-3 设计期界面

二、源代码及注释 //设置一个停靠的过程

procedure TForm1.CoolBar1DockOver(Sender: TObject; Source: TDragDockObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

var

ARect: TRect;

国 Delphi 7控件实用程序设计 100例

– 4 –

begin

Accept := (Source.Control is TToolBar);

if Accept then

begin

ARect.TopLeft := (Sender as TCoolBar).ClientToScreen((Sender as TCoolBar).ClientRect.TopLeft);

ARect.BottomRight := (Sender as TCoolBar) .ClientToScreen((Sender as TCoolBar) .ClientRect.

BottomRight);

Source.DockRect := ARect;

end;

end;

//刚启动界面时 FormCreate过程代码

procedure TForm1.FormCreate(Sender: TObject);

Var P:TPoint;

begin

with CoolBar1 do

begin

AutoSize := True;

DockSite := True;//可停靠

OnDockOver := CoolBar1DockOver;

end;

with CoolBar2 do

begin

AutoSize := True;

DockSite := True;//可停靠

OnDockOver := CoolBar1DockOver;

end;

with CoolBar3 do

begin

AutoSize := True;

DockSite := True;//可停靠

OnDockOver := CoolBar1DockOver;

end;

with CoolBar4 do

begin

AutoSize := True;

DockSite := True;//可停靠

OnDockOver := CoolBar1DockOver;

end;

第一篇 窗口与界面国

– 5 –

With ToolButton1 do

begin

Caption := 'a';

Grouped := True;

MenuItem := a1;//菜单

end;

with ToolBar1 do

begin

AutoSize:=True;

DragKind := dkDock;//可停靠在其他控件上

DragMode := dmAutomatic; //自动拖放

EdgeBorders := [ebTop, ebBottom];//边框

Flat := True; //浮动按钮

Indent := 15; //左边把手宽度,便于拖动

ShowCaptions := True;

Transparent := True;

P:=ClientToScreen(Point(0,0)); //启动时便浮动

ManualFloat(Rect(P.x,P.y,1000,1000));

end;

本实例完整代码,请见本书光盘。

实例 2 ListBox——列表框控件

实例效果 ListBox控件能够以只读方式显示多个项目,可以在设计期的属性窗口中添加列表项,也

可以在运行期使用代码动态添加列表项,效果如图 2-1所示。

图 2-1 运行界面图

国 Delphi 7控件实用程序设计 100例

– 6 –

控件说明 本例主要讲解 ListBox 控件,该控件位于 Delphi 7 的 Standard 面板,加入到窗体后,在

Object Inspector窗口中单击 ListBox的 Items属性栏目内的 按钮,出现图 2-2所示的编辑框,在编辑框中加入需要显示的项目,一个项目占一行。

1.该控件主要属性如表 2-1所示。

表 2-1 控件属性 属性 作用 本例设置 备注

Columns 指定显示的列数 0

Items 显示项目列表

Style 列表框的类型 lbStandard

MultiSelect 是否允许同时选择多个项目 False

ItemIndex 在列表框中选择的项目的索引号

2.该控件主要事件和方法。 Click事件:鼠标单击列表框时触发该事件。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form上添加 ListBox

控件和两个 Buttonl控件。 界面如图 2-3所示。

图 2-2 编辑框 图 2-3 设计期界面

二、源代码及注释 //增加项目

procedure TfrmList.btnAddItemClick(Sender: TObject);

begin

lstDemo.Items.Add('add'+IntToStr(lstDemo.Count+1));

//使最新增加的项目被选择

第一篇 窗口与界面国

– 7 –

lstDemo.ItemIndex:=lstDemo.Count-1;

end;

//清空列表框

procedure TfrmList.btnDeleteItemClick(Sender: TObject);

begin

if lstDemo.Count>0 then

lstDemo.Clear;

end;

实例 3 StatusBar——状态栏控件

实例效果 状态栏是常用的界面控件,用于在窗体底部显示提示信息,例如显示时间、操作编号等,

与 Visual Basic等可视化编程语言的同类控件相比,其突出之处是状态栏的窗格中允许加入其他控件,本例加入了一个按钮,效果如图 3-1所示。当状态栏尺寸变化时,状态栏中各窗格的尺寸也发生相应变化,效果如图 3-2所示。

图 3-1 运行界面图(1) 图 3-2 运行界面图(2)

控件说明 本例主要讲解 StatusBar控件。该控件位于 Delphi 7的 Additional面板,状态栏由若干窗

格组成,在每个窗格中显示信息(文本或者其他控件),双击状态栏,出现窗格编辑器,如图

3-3所示。

图 3-3 窗格编辑器

国 Delphi 7控件实用程序设计 100例

– 8 –

1.该控件主要属性如表 3-1所示。

表 3-1 StatusBar的属性 属性 作用 本例设置 备注

Panels 状态栏中的窗格列表

Simplepanel 在状态栏中是否只有一个窗格(panel) False

其中 Panel(段落)属性如表 3-2所示。 表 3-2 Panel(段落)的属性

属性 作用 本例设置 备注 Text 窗格中的显示文本

Style 窗格的类型(psOwnerDraw,psText) 若设置为 psOwnerDraw,则允许在窗格中加入其他控件

2.该控件的主要事件和方法。 Resize事件:在状态栏的宽度发生变化的时候触发该事件。 DrawPanel事件:在建立状态栏时重画 Style属性设置为 psOwnerDraw的窗格。 注意:当窗体尺寸变化时,应对状态栏的尺寸进行调整,以保证界面的统一协调。实

现方法参见示例程序。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。在 Form上添加

StatusBar控件(Standard组件页),双击状态栏,出现窗格编辑器,增加 3个窗格,设置第二个窗格的 Style属性为 psOwnerDraw。

2.在 Form上添加 Application控件(Additional组件页)。完成界面如图 3-4所示。

图 3-4 设计期界面

二、源代码及注释 //在窗体的类定义中声明私有域

private

{ Private declarations }

FPanelWidth: array of real; //动态数组,保存状态栏中每个段宽度和状态栏宽度的比例

FStatusBarWidth: Integer; //保存状态栏的原始宽度

StatusDrawRect: TRect; //需要重画的矩形区域

btnTemp: TButton; //要在状态栏增加的按钮

第一篇 窗口与界面国

– 9 –

//初始化状态栏

procedure TfrmStatus.FormCreate(Sender: TObject);

var

iPanelsCount: Integer;

begin

with stbDemo.Panels.Add do

begin

Text := 'add panel, 这是第' + IntToStr(Index + 1) + '个段落';

Width := 50;

end;

FStatusBarWidth := stbDemo.Width;

SetLength(fpanelwidth, stbDemo.Panels.Count);

for iPanelsCount := 0 to stbDemo.Panels.Count - 1 do

begin

FPanelWidth[iPanelsCount] := stbDemo.Panels[iPanelsCount].Width /

stbDemo.Width;

end;

end;

//在状态栏显示系统时间

procedure TfrmStatus.ApplicationEvents1Idle(Sender: TObject;

var Done: Boolean);

begin

stbDemo.Panels[2].Text := FormatDateTime('hh''时''mm''分''ss'’秒''', Now);

end;

//状态栏宽度发生变化的时候调整状态栏中各个段的宽度

procedure TfrmStatus.stbDemoResize(Sender: TObject);

var

iPanelsCount: Integer;

begin

for iPanelsCount := 0 to stbDemo.Panels.Count - 1 do

stbDemo.Panels[iPanelsCount].Width := round(stbDemo.Width *

FPanelWidth[iPanelsCount]);

end;

//在状态栏增加按钮,并根据状态栏宽度调节按钮的尺寸

procedure TfrmStatus.stbDemoDrawPanel(StatusBar: TStatusBar;

Panel: TStatusPanel; const Rect: TRect);

begin

StatusDrawRect := Rect;

if btnTemp = nil then

国 Delphi 7控件实用程序设计 100例

– 10 –

btnTemp := TButton.Create(frmStatus);

with btnTemp do

begin

Caption := 'Button';

Left := StatusDrawRect.Left;

Width := StatusDrawRect.Right - StatusDrawRect.Left;

Top := StatusDrawRect.Top;

Height := StatusDrawRect.Bottom - StatusDrawRect.Top;

Visible := true;

Parent := stbDemo;

end;

end;

实例 4 TabSet控件——选项卡页

实例效果 读者可能对 FileListBox、DirectoryListBox和 DriveComboBox三个控件联合使用已经比较

熟悉。而本实例是 FileListBox、DirectoryOutLine和 TabSet三个控件结合使用。同样是用于查看磁盘信息,只不过用 DirectoryOutLine控件代替了 DirectoryListBox控件,用 TabSet控件代替了 DriveComboBox控件,使得界面清新,如图 4-1所示。该例非常简单,单击 TabSet控件上显示出的磁盘选项卡页,这时在左边的 DirectoryOutLine控件里显示该磁盘的所有文件夹。当选中某个文件夹时,将在右边的列表框里显示该文件夹所包含的文件。Panel控件左边显示文件路径,右边显示文件大小。

图 4-1 效果图

第一篇 窗口与界面国

– 11 –

控件说明 1.TabSet控件主要属性如表 4-1所示。

表 4-1 TtabSet 控件主要属性 属性 作用 本例设置 备注

SelectedColor 设置选中某个磁盘时的颜色 clBlue SoftTop 设置控件的顶端是否柔和 False True or False UnselectedColor 设置没有选中磁盘的颜色 clBackground TabIndex 表键的索引值 在代码里设置 Tabs 设置表键 在代码里设置

2.该控件主要方法。 SelectNext:选择下一个。 Create:创建。 3.该控件主要事件。 OnMeasureTab:设置表键的大小时,此事件发生。 OnDrawTab:绘画表键时,此事件发生。 OnChange:改变选项卡页时,此事件发生。 4.控件性质。该控件为 Delphi自带控件(在Win3.1组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置一个 TabSet控件,其 Style属性设为 TsOwnerDraw,SelectedColor属性

设为 clBlue,UnselectedColor 属性设为 clBackground。添加一个 FileListBox 控件,其 Name属性设为 FileList。添加一个 DirectoryOutLine控件,其 Name属性设为 DirectoryOutline。添加两个 Panel控件,其 Bevellnner属性都设为 bvLowered。添加 5个 Image控件,其 Picture属性设置一幅画。添加一个MainMenu控件,详细设置请参见光盘。最后完成界面如图 4-2所示。

图 4-2 设计期界面

国 Delphi 7控件实用程序设计 100例

– 12 –

二、源代码及注释 //首先在 privat部分定义如下:

private

procedure ConfirmChange(const ACaption, FromFile, ToFile: string);

uses FmxUtils, FAttrDlg, FChngDlg;

{$R *.dfm}

procedure TFMForm.Exit1Click(Sender: TObject);

begin

Close;

end;

procedure TFMForm.FormCreate(Sender: TObject);

var

Drive: Char;

AddedIndex: Integer;

begin

for Drive := 'a' to 'z' do

begin

//设置选项卡页和磁盘驱动器

case GetDriveType(PChar(Drive + ':\')) of

DRIVE_REMOVABLE:

AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Floppy.Picture.Graphic);

DRIVE_FIXED:

AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Fixed.Picture.Graphic);

DRIVE_CDROM:

AddedIndex := DriveTabSet.Tabs.AddObject(Drive, CDRom.Picture.Graphic);

DRIVE_RAMDISK:

AddedIndex := DriveTabSet.Tabs.AddObject(Drive, RamDisk.Picture.Graphic);

DRIVE_REMOTE:

AddedIndex := DriveTabSet.Tabs.AddObject(Drive, Network.Picture.Graphic);

else

AddedIndex := 0;

end;

if UpCase(Drive) = FileList.Drive then

DriveTabSet.TabIndex := AddedIndex;//设置选项卡页索引

end

end;

//选项卡页改变时,发生此事件

procedure TFMForm.DriveTabSetChange(Sender: TObject; NewTab: Integer;

var AllowChange: Boolean);

第一篇 窗口与界面国

– 13 –

begin

if not (csDesigning in ComponentState) then

begin

AllowChange := True;

try

with DriveTabSet do

DirectoryOutline.Drive := Tabs[NewTab][1];

except

on EInOutError do

begin

AllowChange := False;

with DriveTabSet do

//设置 TabSet控件的选项卡页等于 DirectoryOutline控件的磁盘驱动器

DirectoryOutline.Drive := Tabs[TabIndex][1];

raise;

end;

end;

end;

end;

procedure TFMForm.DirectoryOutlineChange(Sender: TObject);

begin

FileList.Directory := DirectoryOutline.Directory;//设置两控件的文件地址相同

DirectoryPanel.Caption := DirectoryOutline.Directory;//在 Panel控件显示磁盘路径

end;

procedure TFMForm.FileListChange(Sender: TObject);

var

TheFileName: string;

begin

with FileList do

begin

if ItemIndex >= 0 then

begin

TheFileName := Items[ItemIndex];

//显示文件的大小

FilePanel.Caption := Format('%s, %d bytes', [TheFileName, GetFileSize(TheFileName)]);

end

else FilePanel.Caption := '';

end;

end;

国 Delphi 7控件实用程序设计 100例

– 14 –

//设置选项卡页的大小

procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;

var TabWidth: Integer);

var

BitmapWidth: Integer;

begin

BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;

Inc(TabWidth, 2 + BitmapWidth);

end;

//绘制选项卡页

procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas;

R: TRect; Index: Integer; Selected: Boolean);

var

Bitmap: TBitmap;

begin

Bitmap := TBitmap(DriveTabSet.Tabs.Objects[Index]);

with TabCanvas do

begin

Draw(R.Left, R.Top + 4, Bitmap);

TextOut(R.Left + 2 + Bitmap.Width, R.Top + 2, DriveTabSet.Tabs[Index]);

end;

end;

procedure TFMForm.File1Click(Sender: TObject);

var

FileSelected: Boolean;

begin

FileSelected := FileList.ItemIndex >= 0;

Open1.Enabled := FileSelected;

Delete1.Enabled := FileSelected;

Copy1.Enabled := FileSelected;

Move1.Enabled := FileSelected;

Rename1.Enabled := FileSelected;

Properties1.Enabled := FileSelected;

end;

procedure TFMForm.Delete1Click(Sender: TObject);

begin

with FileList do

if MessageDlg('Delete ' + FileName + '?', mtConfirmation,

[mbYes, mbNo], 0) = mrYes then

第一篇 窗口与界面国

– 15 –

if DeleteFile(FileName) then Update;

end;

//属性设置

procedure TFMForm.Properties1Click(Sender: TObject);

var

Attributes, NewAttributes: Word;

begin

with FileAttrForm do

begin

FileDirName.Caption := FileList.Items[FileList.ItemIndex];

FilePathName.Caption := FileList.Directory;

ChangeDate.Caption := DateTimeToStr(FileDateTime(FileList.FileName));

Attributes := FileGetAttr(FileDirName.Caption);

ReadOnly.Checked := (Attributes and faReadOnly) = faReadOnly;

Archive.Checked := (Attributes and faArchive) = faArchive;

System.Checked := (Attributes and faSysFile) = faSysFile;

Hidden.Checked := (Attributes and faHidden) = faHidden;

if ShowModal <> mrCancel then

begin

NewAttributes := Attributes;

if ReadOnly.Checked then NewAttributes := NewAttributes or faReadOnly

else NewAttributes := NewAttributes and not faReadOnly;

if Archive.Checked then NewAttributes := NewAttributes or faArchive

else NewAttributes := NewAttributes and not faArchive;

if System.Checked then NewAttributes := NewAttributes or faSysFile

else NewAttributes := NewAttributes and not faSysFile;

if Hidden.Checked then NewAttributes := NewAttributes or faHidden

else NewAttributes := NewAttributes and not faHidden;

if NewAttributes <> Attributes then

FileSetAttr(FileDirName.Caption, NewAttributes);

end;

end;

end;

//打开文件

procedure TFMForm.Open1Click(Sender: TObject);

begin

with FileList do

begin

if HasAttr(FileName, faDirectory) then

国 Delphi 7控件实用程序设计 100例

– 16 –

DirectoryOutline.Directory := FileName

else ExecuteFile(FileName, '', Directory, SW_SHOW);

end;

end;

procedure TFMForm.FileListMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Button = mbLeft then

with Sender as TFileListBox do

begin

if ItemAtPos(Point(X, Y), True) >= 0 then

BeginDrag(False);

end;

end;

实例 5 PageControl——页面控制控件

实例效果 在 PageControl 中能够集中显示多个页面(Tatsheet)。可以通过单击页面按钮,在各个页

面之间进行切换。同样,可以在程序运行时,根据需要动态添加页面,效果如图 5-1所示。

图 5-1 运行界面图

控件说明 PageControl是 Delphi 7中常用的界面控件,通过使用该控件能够有效减少不必要的窗体,

使得界面紧凑、易于切换。多个页面都在一个区域中显示,便于用户操作。 该控件位于 Delphi 7的Win32面板,在该控件上单击鼠标右键,出现快捷菜单。通过 New

Page、Delete Page等项增加、删除页面。通过 Next Page和 Previous Page项在各个页面之间进行切换。页面设置如图 5-2所示。

第一篇 窗口与界面国

– 17 –

图 5-2 页面设置

1.PageControl控件主要属性如表 5-1所示。

表 5-1 PageControl控件属性 属性 作用 本例设置 备注

ActivePage 指定或者返回活动页面

HotTrack 鼠标移动到页面按钮上是否加亮显示 False

MultiLine 页面较多时是否以多行方式显示 False

Style 页面按钮的显示方式 tsTabs

TabPosition 页面按钮的放置位置 tpTop

2.TabSheet主要属性如表 5-2所示。

表 5-2 TabSheet属性 属性 作用 本例设置 备注

Caption 页面按钮的文本

PageIndex 页面索引序号

PageControl 指定或者返回页面所在的页面控制

3.该控件主要方法和事件。 Change(TabSheet的事件):当在各个页面之间切换时触发该事件,这样就能够在这个事

件中对页面进行重新设置。 注意:使用 PageControl控件时,应把功能上有逻辑联系的页面组织在一起,对于逻辑关系联系不紧密的页面改用窗体或者其他控件。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

PageControl控件。 2.在 PageControl上放置一个 Button控件。完成界面如图 5-3所示。

图 5-3 设计期界面

国 Delphi 7控件实用程序设计 100例

– 18 –

二、源代码及注释 //演示页面的动态增加

procedure TfrmPageControl.btnAddPageClick(Sender: TObject);

var

tmpTabSheet: TTabSheet;

begin

if pgcDemo.PageCount > 6 then

Exit;

tmpTabSheet := TTabSheet.Create(pgcDemo);

tmpTabSheet.Caption := ' Ò³Ãæ' + IntToStr(pgcDemo.PageCount + 1);

tmpTabSheet.PageControl := pgcDemo;

end;

实例 6 XPMenu——Windows XP界面

实例效果 Windows XP\Microsoft Office XP 以其优秀的“变脸”菜单界面效果,赢得了广泛的关注,

成为继固定式菜单、浮动式菜单之后新一代的菜单标准。在各种编程语言中,实现“变脸”菜

单效果最简洁、最优秀的编程语言当推 Delphi 7,这里介绍的第三方控件 XPMenu就是 Delphi界面控件中的佼佼者。其运行时不可见,可以将几乎所有界面控件 XP化,包括菜单、工具栏、表格等,如图 6-1、图 6-2 所示,分别演示了主菜单与弹出式菜单(PopupMenu)的高级自画效果。另外,还可以实现菜单背景的渐变、纯平化(Flat),分别设置菜单图标与文字背景等,效果十分优秀。

图 6-1 运行界面图(1)

第一篇 窗口与界面国

– 19 –

图 6-2 运行界面图(2)

控件说明 很多读者都使用过Microsoft Office系列办公软件,从Office 97、Office 2000到最新的Office

XP,其在界面、功能等设计上一直可以说引导潮流。最新版的 Office XP的推出同样引起不小的轰动,一方面在于其新增加的功能,另一方面,其程序界面的“变脸”技术也是一大亮点,

最直观的感受莫过于 Office XP的新菜单样式,如图 6-3所示。

图 6-3 Office XP的新菜单样式

本例主要讲解实现 XP新菜单样式的Menu控件。XPMenu控件在建立菜单时即对其进行了定制,菜单重画动作的实现与 ActionBands 控件的 VCL 实现的不同,在于后者是建立窗体时(FormCreate)对菜单进行定制,因此菜单设计期可以直接看到效果,如图 6-4所示。

图 6-4 菜单设计期效果

国 Delphi 7控件实用程序设计 100例

– 20 –

1.该控件主要属性如表 6-1所示。

表 6-1 控件属性 属性 作用 本例设置 备注

Active 激活控件 True *

AutoDetect 自动侦测界面控件 True *

Gradient 菜单背景颜色渐变 True

IconBackColor 菜单项图标背景颜色,即渐变色 clPurple

IconWhith 菜单项图标宽度 24

FlatMenu 纯平化 True

MenuBarColor 主菜单背景颜色

SelectBoardColor XP化的菜单项边框颜色 clRed

SelectColor XP化的菜单项颜色 clYellow

UseSystemColor 使用系统颜色 False *

2.该控件无事件、方法。 3.控件性质。 XPMenu控件为免费、提供全部源代码的国产第三方控件。 4.下载地址:http://www.playicq.com/。 注意:使用 XPMenu控件特别需要注意的是属性表备注栏中带“*”号的属性项,它们对本控件作用的正常实现至关重要,其中 Active 、AutoDetect必须设置为 True ,才能实现激活控件、自动侦测界面控件,并将其 XP化的功能,UseSystemColor属性则只有设置为 False,才能使用自定义的 XP 化的菜单项颜色、菜单项边框颜色、菜单项图标背景颜色渐变等,否则,系统将一直使用默认效果,即如同 Windows XP\Microsoft Office XP 的浅蓝色 XP菜单、白色背景颜色渐变等效果。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

MainMenu控件、PopupMenu控件(Standard组件页),并添加相应菜单项。 2.在 Form1上添加 CoolBar控件(Win32组件页),并在其上添加两个 ToolBar控件(Win32

组件页),将其 DragKind属性都设置为 dkDock,DragMode属性都设置为 dmAutomatic,以便可以拖出工具栏,形成浮动工具面板,添加相应工具按钮。

3.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上选择“ImageList Editor”项,添加相应的 ico图标。

4.设置 MainMenu 的 Images 属性为 ImageList,双击 MainMenu 控件并设置每一个菜单项的 ImageIndex,以使每个菜单项都拥有自己的图标,同样设置弹出式菜单、工具栏的 Images属性为 ImageList,为每个菜单项、工具按钮设置图标。

5.增加 FontDialog 控件、OpenDialog 控件、SaveDialog 控件、PrintDialog 控件(Dialog组件页)。

第一篇 窗口与界面国

– 21 –

6.增加 Panel控件(Standard组件页)、Bevel控件(Additional组件页)、RichEdit控件(Win32组件页)、StatusBar 控件(Win32 组件页),将 RichEdit 控件的 PopupMenu 属性设置为PopupMenu1,其余详细设置见本书配套光盘相应源代码。 最后完成界面如图 6-5所示。

图 6-5 设计期界面

二、源代码及注释 本实例完整代码,请见本书光盘。

实例 7 GIFForm——动画图形窗口

实例效果 图形窗口是根据 BMP图形生成的一类特色鲜明的异形窗口,本例使用 GIFForm控件轻松

地实现了这种功能。该控件的突出之处是另外增添了动画功能,各透明窗口循环显示,可以任

意设置动画帧频、设置背景透明等。有了这个控件,读者可以做出一些优秀的窗口效果,像瑞

星实时监控系统那样,在桌面上放置一个动画图形窗口,效果别致,如图 7-1和图 7-2所示。

图 7-1 效果图(1) 图 7-2 效果图(2)

国 Delphi 7控件实用程序设计 100例

– 22 –

控件说明 1.GIFForm控件主要属性如表 7-1所示。

表 7-1 控件属性 属性 作用 本例设置 备注

BMPRegions 设置生成异形窗口的 BMP图形 见图 7-3 可以设置多幅 BMP图形,并设置透明背景,形成动画图形窗口效果

Loop 设置循环播放 True

Active 设置透明窗口 True 当属性值为 True时,窗口显示为透明

2.主要事件。 Onchange:当透明窗口切换时发生。 3.主要方法。 Show(index:integer):显示 index指定的透明窗口。 4.控件性质。 GIFForm控件为免费、提供全部源代码的国产第三方控件。 5.下载地址:http://www.playicq.com/。 注意:使用 GIFForm 控件特别需要注意的是 BMPRegions 项,对本控件作用的正常实现至关重要。单击 BMPRegions属性旁的按钮,进入属性编辑窗口,可以增加、删除 BMP文件,显示透明色和延时时间。其中 Count属性为加入的 BMP文件总数,如图 7-3所示。 当然,如果设计控件时加入一个转换代码,直接加载 GIF 动画文件,由 GIF 动

画文件自动对应生成 BMP图形,效果更好,读者也可以二次开发,自己尝试一下。

图 7-3 属性编辑

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。在 Form1上添加一

个 GIFForm控件,单击 BMPRegions属性旁的按钮进入属性编辑窗口,增加 5幅 BMP文件,并设置延时时间等参数。其中 Count属性为加入的 BMP文件总数。

第一篇 窗口与界面国

– 23 –

2.添加 PopupMenu 控件(Standard 组件页),并添加相应菜单项。将 GIFForm 控件的PopupMenu属性设置为 PopupMenu1。 最后完成界面如图 7-4所示。

图 7-4 设计期界面

二、源代码及注释 完整编译代码略,详见本书光盘。

实例 8 EzRgnBtn——多态图形按钮

实例效果 该控件可以加载 4幅图片,分别在空闲(Idle)、鼠标按下(Pressed)、鼠标经过(MouseOver)、

按钮无效状态下显示不同的图片,效果如图 8-1~8-4所示。

图 8-1 运行界面图(1) 图 8-2 运行界面图(2)

图 8-3 运行界面图(3) 图 8-4 运行界面图(4)

国 Delphi 7控件实用程序设计 100例

– 24 –

控件说明 通过一个 ImageList控件指定 4个图片,然后关联到 EzRgnBtn控件上,用于显示按钮的

不同状态,也可以在对象浏览器中分别为不同的状态指定一个图片。这大大扩展了 Delphi 的按钮类控件的功能。

1.该控件主要属性如表 8-1所示。

表 8-1 控件属性 属性 作用 本例设置 备注

PicIdle 指定空闲时显示的图片

PicDown 指定鼠标按下时显示的图片

PicUp 鼠标经过按钮时显示的图片

PicDsbld 按钮不可用时显示的图片

PaintMode 设置控件显示模式

ImageList 指定关联的 ImageList控件

2.该控件主要方法。 Down(HowLong:longint):模拟鼠标按下,参数 HowLong指定模拟按下鼠标的延迟时间。 3.控件性质。 EzRgnBtn控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://delphi.icm.edu.pl。 注意:使用 ImageList与 EzRgnBtn关联,具有一定局限性,因为在 ImageList控件中只能指定.ico和.bmp格式的图片。如果需要使用更丰富多彩的效果,应使用控件自身的属性指定不同状态下的显示图片。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

EzRgnBtn控件和 CheckBox控件。 2.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上

选择“ImageList Editor”项,添加相应的.ico图标。界面如图 8-5所示。

图 8-5 设计期界面

第一篇 窗口与界面国

– 25 –

二、源代码及注释 //设置按钮使能状态

procedure TForm1.chkCheckBox1Click(Sender: TObject);

begin

EzRgnBtn1.Enabled := not chkCheckBox1.Checked;

end;

//延迟鼠标按下状态,以观察按钮的变化

procedure TForm1.EzRgnBtn1Click(Sender: TObject);

begin

(Sender as TEzRgnBtn).Down(1000);

end;

实例 9 ComboBoxX——多功能组合框

实例效果 ComboBoxX控件能够对组合框中选项进行任意增加、删除、修改操作,并且在下拉列表

底部提供了功能齐全的按钮进行交互操作,给人耳目一新的感觉,效果如图 9-1所示。

图 9-1 运行界面图

控件说明 本例主要讲解 ComboBoxX 控件,与 Delphi 自带的组合框相比,该控件的功能得到了很

大增强,增加了许多新的属性、事件、方法。 1. 该控件主要属性如表 9-1所示。 2.该控件主要事件。 OnDeleteItem:删除组合框中的某项时触发该事件。 OnEditItem:对组合框中的某项进行编辑时触发该事件。

国 Delphi 7控件实用程序设计 100例

– 26 –

OnModifiedItem:对组合框中的某项进行修改以后触发该事件。 OnNewItem:新建一个选项时触发该事件。 OnMoveUpItem:把某项上移时触发该事件。 OnMoveDownItem:把某项下移时触发该事件。 OnDrawItem:对下拉框刷新时触发该事件。 OnMeasureItem:对下拉框大小刷新时触发该事件。

表 9-1 控件属性 属性 作用 本例设置 备注

Buttons 设置显示在下拉框中的按钮

cbxbEdit 编辑按钮

cbxbNew 增加按钮

cbxbDelete 删除按钮

cbxbUp 上移按钮

cbxbDown 下移按钮

cbxbPin 别针按钮

全部选择,均设置为 True

ItemDrag 是否允许用户在运行期移动组合框

中的选项 True

PinDown 是否使别针按钮保持在按下状态 False

Style 组合框类型 CsOwnerDrawFixed

3.控件性质。 ComboBoxX控件为免费、提供全部源代码的第三方控件。 4.下载地址:[email protected][email protected] 。 注意:如果需要对组合框中的项目进行重绘,必须设置组合框的 Style 特性为CsOwnerDrawFixed或者 CsOwnerDrawVariable,并在事件 OnDrawItem的实现过程中加入重绘组合框的代码。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

ComboBoxX控件。完成界面如图 9-2所示。

图 9-2 设计期界面

第一篇 窗口与界面国

– 27 –

二、源代码及注释 //绘制组合框

procedure TForm1.cobxComboBoxX1DrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

aText: string;

begin

with TComboBoxX(Control).Canvas do

begin

if (odComboBoxEdit in State) then//编辑状态

Font.Color := clRed//设置字体颜色为红色

else

Font.Color := clBlack;// 设置字体颜色为黑色

if (odSelected in State) then//选择状态

Brush.Color := clRed

else if (Index and 1 = 1) then

Brush.Color := clLime

else

Brush.Color := clYellow;

FillRect(Rect);

if (Index > -1) then

begin

aText := TComboBoxX(Control).Items[Index];

TextRect(Rect, Rect.Left + 1, Rect.Top + 1, aText);//重画组合框的文本显示区域

end;

if (odFocused in State) then

begin

Brush.Style := bsClear;

Pen.Color := clRed;

Rectangle(Rect);

Brush.Style := bsSolid;

end;

end;

end;

国 Delphi 7控件实用程序设计 100例

– 28 –

实例 10 CaptionButton——标题栏按钮

实例效果 程序运行后,CaptionButton 控件能够在窗体的标题栏增加按钮,这些按钮既可以实现一

般按钮的功能也可以具有菜单选项,可以对鼠标事件做出反应,效果如图 10-1所示。

图 10-1 运行界面图

控件说明 通过 BtnOrder 属性能够设定一组 CaptionButton 控件在标题栏上的排列位置,在

CaptionButton控件上可以加载各类图片或者文字符号。 1.该控件主要属性如表 10-1所示。

表 10-1 控件属性 属性 作用 本例设置 备注

AllowPress 设置按钮是否可以保持按下状态

BtnOrder 设置一组按钮在标题栏上的排列位置

Down 设定按钮是否以按下的形式出现,该特性在

AllowPress特性设为 True的情况下有效

Glyph 设置按钮上的图片

Sign 设置按钮的字符标志

ApplyToMenu 设置按钮是否可以和相应的菜单关联

Caption 设置系统菜单上的文字

SeparatorWidth 设置按钮与其他按钮之间的距离

2.主要事件。 OnClick:鼠标点击按钮时触发。 3.控件性质。 CaptionButton控件为第三方共享控件。 4.下载地址:http://www.appcontrols.com、 http://www.utilmind.com。

注意:Glyph特性设置按钮上的图片,图片格式只能为.bmp,大小为 12像素×11像素。

第一篇 窗口与界面国

– 29 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 3

个 CaptionButton 控 件 , 分 别 命 名 为 capbtnCaptionButton1 , capbtnCaptionButton2 ,capbtnCaptionButton3。加入一个 PopMenu控件,命名为 pmPopMenu1。

2.设置 capbtnCaptionButton1 的 AllowPress 和 Down 特性均为 True,设定capbtnCaptionButton2 的 Glyph 为 BMP 文件,设定 capbtnCaptionButton3 的 Sign 特性为*,SeparatorWidth特性为 10,PopMenu特性为 pmPopMenu1,设置 ApplyToMenu特性为 True。 界面如图 10-2所示。

图 10-2 设计期界面

二、源代码及注释 procedure TForm1.capbtnCaptionButton1ButtonClick(Sender: TObject);

begin

ShowMessage('Click Event');

end;

实例 11 CoolTrayIcon——托盘图标

实例效果 CoolTrayIcon控件用来设置托盘图标,功能强大。托盘图标能够显示提示文字、弹出式菜

单。效果如图 11-1和图 11-2所示。

图 11-1 运行界面图(1) 图 11-12 运行界面图(2)

国 Delphi 7控件实用程序设计 100例

– 30 –

控件说明 1.CoolTrayIcon控件主要属性如表 11-1所示。

表 11-1 控件主要属性 属性 作用 本例设置 备注

Hint 设置托盘图标的提示文字 This is a demo

ShowHint 是否显示提示窗口 True

Icon 设置显示在托盘中的图标

IconVisible 是否显示图标 True

PopupMenu 点击图标时显示的弹出式菜单

LeftPopup 设置是否点击鼠标左键弹出菜单 False

StartMinimized 在程序启动时是否隐藏主窗体 True

IconList 图标列表

IconIndex 指定 IconList中的图标序号

CycleIcons 是否循环显示 IconList中的图标 True

CycleInterval 设置循环显示图标的时间间隔 1000 单位为毫秒 DesignPreview 是否允许在设计期预览图标 True

MinizeToTray 是否最小化主窗体 True

Handle 返回托盘图标的句柄

WindowHandle 返回托盘图标的窗口句柄

2.该控件主要方法。 ShowMainForm:显示主窗体。 HideMainForm:隐藏主窗体。 Refresh:重新绘制托盘图标,改变托盘图标时可以调用该方法。 ShowBalloonHint:显示一个气球形状的提示。 3.主要事件。 OnCycle:在通过 CycleIcons改变图标时触发。 4.控件性质。 CoolTrayIcon控件为免费、提供全部源代码的第三方控件。 5.下载地址:http://www3.ewebcity.com/troels/delphi.asp。 注意:CoolTrayIcon控件的 ShowBalloonHint方法只有在Windows Me、Windows 2000、Windows XP中才有效,在其他版本的Windows中调用该方法将无效。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

CoolTrayIcon控件,为其 Icon属性指定一个图标。 2.在窗体中加入一个 PopupMenu 控件,设定 CoolTrayIcon 的 PopupMenu 属性为这个

第一篇 窗口与界面国

– 31 –

popupMenu控件。 完成界面如图 11-3所示。

图 11-3 设计期界面

二、源代码及注释 //显示主窗体

procedure TForm1.mmiN1Click(Sender: TObject);

begin

ctCoolTrayIcon1.ShowMainForm;

end;

//关闭主窗体

procedure TForm1.N1Click(Sender: TObject);

begin

Form1.Close;

end;

//显示提示

procedure TForm1.N2Click(Sender: TObject);

begin

ctCoolTrayIcon1.ShowBalloonHint('Demo Title', 'this is a demo', bitInfo, 10);

end;

实例 12 LinkButton——超链接按钮

实例效果 LinkButton控件使用比较方便,提供了实现超链接的简单方法,单击 LinkButton控件按钮

就可以打开一个网页,效果如图 12-1所示。

图 12-1 运行界面图

国 Delphi 7控件实用程序设计 100例

– 32 –

控件说明 该控件安装在 Delphi 7的 Standard面板,其主要属性、事件、方法与 Button控件相似。 1.该控件主要属性如表 12-1所示。

表 12-1 控件属性 属性 作用 本例设置 备注

Link 设置 URL http://www.borland.com

2.控件性质。 LinkButton控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.ocloud.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

LinkButton控件。完成界面如图 12-2所示。

图 12-2 设计期界面

二、源代码及注释 本实例完整代码,请见本书光盘。

实例 13 AdvStringGrid——按钮网格界面

实例效果 AdvStringGrid控件是一个十分优秀的界面控件,它可以在每个单元格内显示图标、文字、

按钮,实现超连接以及单元格内显示不同颜色等。它可以用在按钮比较多的通用数据库系统中,

显示多个选项卡中的按钮,效果如图 13-1所示。

控件说明 本例主要讲解 AdvStringGrid控件。该控件是 StringGrid的升级,功能也更强大。

第一篇 窗口与界面国

– 33 –

图 13-1 运行界面图

1.该控件主要属性如表 13-1所示。

表 13-1 fcOutLookBar控件属性 属性 作用 本例设置 备注

ColCount;RowCount 单元格的个数 分别为 9

DefaultColWidth DefaultRowHeight

单元格的宽和高 分别为 64

FixedCols;FixedRows 固定的行和列 1

GridImages 连接单元格要显示的图标 ImageList1

GridLineWidth 单元格的间隔距离 1

2.该控件主要事件。 OnAutoDeleteRow事件:当删除某行时触发此事件。 OnAutoInsertCol事件:当插入某列时触发此事件。 OnAutoInsertRow事件:当插入某行时触发此事件。 3.控件性质:AdvStringGrid控件是免费的第三方控件。 4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

fcOutLookBar控件。 2.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上

选择“ImageList Editor”项,添加相应的.bmp文件。 3.增加一个 AdvStringGrid控件。 完成界面如图 13-2所示。

国 Delphi 7控件实用程序设计 100例

– 34 –

图 13-2 设计期界面

二、源代码及注释 procedure TDemo.InitGraphicGrid;

begin

with AdvStringGrid2 do

begin

//第一列显示的图标和文字

with CreateIcon(1,1,haCenter,vaUnderText) do handle:=LoadIcon(hinstance,'ICON_1');

with CreateIcon(1,2,haCenter,vaAboveText) do handle:=LoadIcon(hinstance,'ICON_2');

with CreateIcon(1,3,haCenter,vaAboveText) do handle:=LoadIcon(hinstance,'ICON_3');

with CreateIcon(1,4,haCenter,vaAboveText) do handle:=LoadIcon(hinstance,'ICON_4');

with CreateIcon(1,5,haCenter,vaAboveText) do handle:=LoadIcon(hinstance,'ICON_5');

addrotated(1,0,90,'Icons');

Cells[1,1]:='cpu';

Cells[1,2]:='trashcan';

Cells[1,3]:='icon';

Cells[1,4]:='floppy';

Cells[1,5]:='audio';

//第二列显示的图标和文字

addimageidx(2,1,0,habeforetext,vaCenter);

addimageidx(2,2,1,haBeforeText,vaCenter);

addimageidx(2,3,2,haBeforeText,vaCenter);

addimageidx(2,4,3,haBeforeText,vaCenter);

addimageidx(2,5,4,haBeforeText,vaCenter);

addrotated(2,0,90,'Imagelist');

Cells[2,1]:='mail';

第一篇 窗口与界面国

– 35 –

Cells[2,2]:='note';

Cells[2,3]:='cancel';

Cells[2,4]:='home';

Cells[2,5]:='web';

//第三列显示的图标和文字

with CreateBitmap(3,1,false,haright,vabottom) do LoadFromResourceName(hinstance,'BITMAP_1');

with CreateBitmap(3,2,false,haright,vabottom) do LoadFromResourceName(hinstance,'BITMAP_2');

with CreateBitmap(3,3,false,haright,vabottom) do LoadFromResourceName(hinstance,'BITMAP_3');

with CreateBitmap(3,4,false,haright,vabottom) do LoadFromResourceName(hinstance,'BITMAP_4');

with CreateBitmap(3,5,false,haright,vabottom) do LoadFromResourceName(hinstance,'BITMAP_5');

Cells[3,1]:='';

Cells[3,2]:='';

Cells[3,3]:='';

Cells[3,4]:='';

Cells[3,5]:='';

addrotated(3,0,90,'Bitmaps');

autonumbercol(0);

//第四列显示的文字

addrotated(4,0,90,'Text');

addrotated(4,1,45,'One');

addrotated(4,2,135,'Two');

addrotated(4,3,225,'Three');

addrotated(4,4,315,'Four');

addrotated(4,5,180,'Five');

//第五、六列显示的标题

addrotated(5,0,90,'Multi Image');

addrotated(6,0,90,'Rich text');

//第五列显示的图标

addmultiimage(5,1,0,haBeforeText,vaCenter);

with CellImages [5,1] do

begin

Add(0);

Add(1);

end;

addmultiimage(5,2,0,haBeforeText,vaCenter);

with CellImages [5,2] do

begin

Add(2);

Add(3);

国 Delphi 7控件实用程序设计 100例

– 36 –

Add(4);

end;

addmultiimage(5,3,0,haBeforeText,vaCenter);

with CellImages [5,3] do

begin

Add(0);

end;

addmultiimage(5,4,0,haBeforeText,vaCenter);

with CellImages [5,4] do

begin

Add(1);

Add(3);

Add(4);

Add(2);

end;

addmultiimage(5,5,0,haBeforeText,vaCenter);

with CellImages [5,5] do

begin

Add(4);

Add(1);

end;

richedit.text:='Rich text';

richedit.Selstart:=0;

richedit.Sellength:=4;

richedit.Selattributes.Color:=clRed;

richedit.Selattributes.Style:=[fsBold];

richedit.Selstart:=5;

richedit.Sellength:=4;

richedit.Selattributes.Color:=clBlue;

richedit.Selattributes.Style:=[fsItalic];

richtocell(6,1,richedit);

richedit.Clear;

richedit.Selattributes.Style:=[];

richedit.Selattributes.Color:=clBlack;

richedit.text:='Superscript';

richedit.Selstart:=0;

richedit.Sellength:=5;

richedit.Selsuperscript;

richedit.Selattributes.Color:=clBlue;

第一篇 窗口与界面国

– 37 –

richtocell(6,2,richedit);

richedit.Clear;

richedit.Selattributes.Style:=[];

richedit.Selattributes.Color:=clBlack;

richedit.text:='Subscript';

richedit.Selstart:=0;

richedit.Sellength:=3;

richedit.Selsubscript;

richedit.Selattributes.Color:=clBlue;

richtocell(6,3,richedit);

richedit.Clear;

richedit.Selattributes.Style:=[];

richedit.Selattributes.Color:=clBlack;

richedit.Selnormal;

richedit.paragraph.Numbering := nsBullet;

richedit.lines.Add('One'#13'Two'#13'Three');

richedit.paragraph.Numbering := nsNone;

richtocell(6,4,richedit);

addrotated(7,0,90,'HTML');

Cells[7,1]:='Easy <B>HTML</B><BR><I>formatting</I>';

Cells[7,2]:='Including <IMG src="idx:0"><FONT color="clred">everywhere</FONT>';

Cells[7,3]:='Enjoy<HR><B>miniHTML</B>';

Cells[7,4]:='<A href="http://www.tmssoftware.Com/minihtml.htm">Click here</A><BR>for more';

Cells[7,5]:='125 <SUP>9</SUP>/<SUB>16</SUB>';

addrotated(8,0,90,'Various');

ints[8,1]:=50;

AddProgress(8,1,clRed,clSilver);

ints[8,2]:=75;

AddProgress(8,2,clBlue,clWhite);

AddComment(8,3,'This is a custom'#13'comment for this cell');

Cells[8,3]:='Cell with<BR><I>comment</I>';

国 Delphi 7控件实用程序设计 100例

– 38 –

Cells[8,4]:='<A href="CELL://R2C1">Link to cell 1,2</A>';

Cells[8,5]:='<A href="CELL://R1C2">Link to cell 2,1</A>';

ints[6,5]:=1;

AddButton(6,5,45,20,'Push me',haBeforeText,vaCenter);

end;

end;

procedure TDemo.FormCreate(Sender: TObject);

begin

InitGraphicGrid;//执行该过程

end;

实例 14 fcOutLookBar——OutLook滚动工具栏

实例效果 fcOutLookBar 控件在切换各组、面板、按钮的时候将是一种平滑并且具有动画效果的效

果,它支持水平和垂直两种滑动方式,效果如图 14-1所示。

图 14-1 运行界面图

控件说明 本例主要讲解 fcOutLookBar 控件。该控件每个单独的组都包括一个容器面板,允许将所

需要的任何控件加入到面板中。 1.该控件主要属性如表 14-1所示。

第一篇 窗口与界面国

– 39 –

表 14-1 fcOutLookBar控件属性 属性 作用 本例设置 备注

ActivePage 返回当前选中的页面和按钮

Animation Enabled Interval Steps

切换页面时的动画效果

是否禁止动画

每帧动画之间的间隔时间

从一页转换到另一页的动画帧数

False 0 1

ButtonSize 设置按钮大小 25

OutlookItems 包含 OutLookBar中各页的数组

PanelAlignment PaDynamic PaTop PaBottons ShowButtons

设置控件的放置位置

设为 True时,当前页显示在所选按钮的下面

所有按钮都在当前页的上面

所有按钮都在当前页的下面

设置为 False时,按钮组中的按钮不显示

True True

表 14-2 fcOutLookList属性 属性 作用 本例设置 备注

Images 设置与页面关联的图像列表

PopupMenu 指定与页面关联的弹出式菜单

ClickStyle 单击页面中的按钮的动作类型

csSelect设置按钮为选中状态

csClick设置为普通的按钮单击方式

2.该控件主要事件。 fcOutlookBarOutlookListItem的 OnClick事件:鼠标点击 OutLookBar中的按钮时触发此事

件。 fcOutlookBarfcShapeBtn 的 OnMouseMove 事件:鼠标从一个页面移动到另外一个页面的

标题时触发此事件。 3.控件性质:fcOutLookBar是著名控件包 1stClass中的一个控件,该控件能够开发出类

似MicroSoft OutLook的界面效果。为商业性的第三方控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

fcOutLookBar控件。 2.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上

选择“ImageList Editor”项,添加相应的.bmp文件。 3.增加一个检查框(CheckBox)和一个 popupMenu控件。 完成界面如图 14-2所示。

国 Delphi 7控件实用程序设计 100例

– 40 –

4.双击 fcOutLookBar控件,出现编辑窗口,增加、删除、修改页面,如图 14-3所示。 5.在各个页面上双击,出现按钮编辑窗口,增加、删除、修改按钮,如图 14-4所示。

图 14-2 设计期界面 图 14-3 页面编辑 图 14-4 按钮编辑

二、源代码及注释 procedure TForm1.outfcOutlookBar1OutlookList1ItemClick(

OutlookList: TfcCustomOutlookList; Item: TfcOutlookListItem);

begin

ShowMessage(Item.Text);

end;

procedure TForm1.outfcOutlookBar1fcShapeBtn1MouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

SetAutoDown((sender as TfcCustomShapeBtn));

end;

//鼠标移动到页面标题时,自动展开该页面的按钮,不需要点击标题部分

procedure TForm1.SetAutoDown(AShapebtn: TfcCustomShapeBtn);

begin

if not AShapebtn.Down and chkSetAutoDown.Checked then

AShapebtn.Down := true;

end;

procedure TForm1.outfcOutlookBar1fcShapeBtn2MouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

SetAutoDown((sender as TfcCustomShapeBtn));

end;

第一篇 窗口与界面国

– 41 –

procedure TForm1.outfcOutlookBar1fcShapeBtn3MouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

SetAutoDown((sender as TfcCustomShapeBtn));

end;

//控制弹出式菜单的显示内容

procedure TForm1.pmPopupMenu1Popup(Sender: TObject);

begin

if (Sender as TPopupMenu).PopupComponent.Name = 'outfcOutlookBar1OutlookList1'

then

begin

mmiN1.Enabled := true;

mmiN2.Enabled := true;

end

else

begin

mmiN1.Enabled := false;

mmiN2.Enabled := false;

end;

end;

实例 15 fcTreeCombo——在下拉列表框中显示树形视图

实例效果 fcTreeCombo控件能够在下拉列表框中显示一个树形视图,有层次地组织和显示项目,并

可以设置节点是否可以被选取。本例中 Delphi 、PB两个节点不可选,效果如图 15-1所示。

图 15-1 运行界面图

国 Delphi 7控件实用程序设计 100例

– 42 –

控件说明 1.fcTreeCombo 控件结合了下拉列表框和树形视图的优点,使用起来比较简单。该控件

主要属性如表 15-1所示。

表 15-1 控件属性 属性 作用 本例设置 备注

DropDownWidth 下拉树形视图的宽度 0 设置为零,将根据树形视图

中的项目宽度自动调整树

形视图的宽度 Items 编辑树形视图中的节点

SelectNode 返回树形视图中所选择的节点

ShowMatchText 是否根据输入的文本进行增量搜索 False

Sorted 是否对树形视图中的项目进行排序 False 如果设置为 true,则树形视图中的层次信息将丢失

2.该控件主要事件。 OnCheckValidItem:选择一个节点时触发此事件,以控制节点是否允许被选择。 3.该控件主要方法。 Function IsValidNode(Node: TfcTreeNode);Boolean;virtual 如果需要自定义节点的选择标准,可以重载此方法。 4.控件性质。 fcTreeCombo控件是著名控件包 1stClass中的一个控件,为商业性的第三方控件。 5.下载地址:http://www.woll2woll.com/。 注意:该控件需要手工把单元 fctreeview加入到单元引用部分,否则会报错。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

fcTreeCombo控件,界面如图 15-2所示。 2.双击 fcTreeCombo控件,出现树形视图的节点编辑器,如图 15-3所示。

图 15-2 设计期界面 图 15-3 节点编辑器

第一篇 窗口与界面国

– 43 –

二、源代码及注释 procedure TForm1.fctvcobfcTreeCombo1CheckValidItem(Sender: TObject;

Node: TfcTreeNode; var Accept: Boolean);

begin

if Node.Text = 'Delphi' then

begin

//不允许选择该节点

Accept := False;

ShowMessage('can not select');

end;

end;

实例 16 MainMenu——主菜单控件

实例效果 在可视化程序开发中,菜单是使用频率最高的界面元素。Delphi中的MainMenu控件是构

造和使用菜单的有利工具。MainMenu控件实现了级联菜单、在菜单项前使用图标、动态加入等菜单项功能,使用效果如图 16-1、图 16-2所示。

图 16-1 运行界面图(1) 图 16-2 运行界面图(2)

控件说明 本例主要讲解MainMenu控件,该控件位于 Delphi 7的 Standard面板。在设计期通过菜单

设计器可以方便地增加、删除、修改各菜单项目的标题和图标等,各菜单项是 TmenuItem 对象,如图 16-3所示。

国 Delphi 7控件实用程序设计 100例

– 44 –

图 16-3 TmenuItem对象

1.MainMenu控件主要属性如表 16-1所示。

表 16-1 MainMenu 控件属性 属性 作用 本例设置 备注

AutoHotkeys 自动给各菜单项增加热键 False

Images 各菜单项使用的图标的图像

列表

OwnerDraw 设定是否允许自绘菜单 False

Items 各菜单项的集合,该特性为

Tmenuitem类型

2.MenuItem控件主要属性如表 16-2所示。

表 16-2 MenuItem 控件属性 属性 作用 本例设置 备注

Caption 菜单项标题

ImageIndex 使用的图像索引号

ShortCut 快捷键

Checked 菜单项是否被选择

3.MenuItem控件的主要事件和方法。 Click事件:当鼠标单击菜单项时发生。 Add方法:用于给指定菜单项增加子项。 调用格式如下: procedure Add(Item: TMenuItem); overload;

procedure Add(const AItems: array of TMenuItem); overload;

Delete方法:用于删除指定索引号的子菜单项。 调用格式如下: procedure Delete(Index: Integer);

注意:使用 MainMenu 控件一般设置 AutoHotkeys 特性为 False,如果设置为 True

则会由系统自动给每个菜单项增加热键,这样不利于对菜单的控制。

第一篇 窗口与界面国

– 45 –

制作步骤

一、窗体界面的建立 1.启动Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加MainMenu

控件,在该控件上单击鼠标右键,使用菜单设计器构造菜单项。 2.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上

选择“ImageList Editor”项,添加相应的.ico图标。 3.设置 MainMenu 的 Images 属性为 ImageList,这样就可以双击 MainMenu 控件,设置

每一个菜单项的 ImageIndex,以使每个菜单项都拥有自己的图标。 完成界面如图 16-4所示。

图 16-4 设计期界面

二、源代码及注释 //动态安装菜单项

procedure TfrmMainMenu.FormCreate(Sender: TObject);

var

mmiTemp: TMenuItem;

begin

//动态加入菜单

mmiTemp := TMenuItem.Create(MainMenu1);

mmiTemp.Name := 'mmiAdd';

mmiTemp.Caption := '动态加入的菜单项’;

mmiTemp.OnClick := OnClickDeleteEvent;

mmiFile.Add(mmiTemp);

//使关于菜单在窗体的右上方显示

ModifyMenu(MainMenu1.Handle, 2, mf_ByPosition or mf_Popup

or mf_Help, mmiAbout.Handle, '关于');

end;

//为动态增加的菜单项定义 Click事件中要执行的动作:删除所选择的菜单项

procedure TfrmMainMenu.OnClickDeleteEvent(Sender: TObject);

var

mmiTemp: TMenuItem;

begin

国 Delphi 7控件实用程序设计 100例

– 46 –

if Sender is TMenuItem then

begin

mmiTemp := sender as TMenuItem;

(mmiTemp).Parent.Delete(mmiTemp.Parent.IndexOf(mmiTemp));

end;

end;

//设置菜单的图标是否显示

procedure TfrmMainMenu.mmiXsClick(Sender: TObject);

begin

mmiXs.Checked := not mmiXs.Checked;

if not mmiXs.Checked then

MainMenu1.Images := nil

else

MainMenu1.Images := ilImageList1;

end;

//在设计期设置菜单项的 Click事件中的动作

procedure TfrmMainMenu.mmiCutClick(Sender: TObject);

begin

ShowMessage('this is a sample');

end;

实例 17 ToolBar2000——工具条

实例效果 本例使用第三方 ToolBar2000控件组,轻松实现了非常优秀的界面效果:把菜单栏、工具

条全部加入背景图片、并且可以把菜单栏、工具条项目全部转换为弹出菜单。使用效果如图

17-1、图 17-2所示。

图 17-1 运行界面图(1) 图 17-2 运行界面图(2)

第一篇 窗口与界面国

– 47 –

控件说明 本例主要讲解ToolBar2000控件组,它是著名的菜单栏、工具条界面效果控件组,包含 TBDock、

TBToolbar、TBToolWindows、TBPopupMenu、TBBackground等控件。TBDock控件主要提供菜单栏、工具条容器,TBToolbar设计菜单栏、工具条项目,TBToolWindows设计浮动式工具窗口,TBPopupMenu设置弹出菜单,TBBackground设置背景图片。

1.TBToolbar控件主要属性如表 17-1所示。

表 17-1 TBToolbar控件属性 属性 作用 本例设置 备注

AutoHotkeys 自动给各菜单项增加热键 False

Images 各菜单项使用的图标的图像列表

OwnerDraw 设定是否允许自绘菜单 False

Items 各菜单项、工具条项的集合,该

特性为 Tmenuitem类型 双击弹出编辑窗口

Background 使用的背景图片 TBBackground1

2.TBBackground控件主要属性如表 17-2所示。

表 17-2 TBBackground控件属性 属性 作用 本例设置 备注

Bitmap 加载背景图片

Transparent 设置透明 False

3.控件的主要事件。 Click事件:当鼠标单击菜单项时发生。 OnDrag事件:拖动时发生。 4.控件性质。 ToolBar2000控件组为商业性的第三方控件。 5.下载地址:http://www.jrsoftware.org。 注意:TBToolbar、TBToolWindows控件一般设置在 TBDock控件之上,并且 AllowDrag属性设置为 True,以便可以拖出形成独立的工具窗口。

若需要设置工具条背景图片,需要先在 TBBackground控件中加载背景图片,然后在 TBToolbar的 Background属性中关联 TBBackground控件。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加一个

TBDock控件,在该控件上添加 3个 TBToolbar控件。分别双击 TBToolbar控件弹出编辑窗口,使用设计器构造菜单与工具项,如图 17-3所示。

国 Delphi 7控件实用程序设计 100例

– 48 –

图 17-3 构造菜单与工具项

2.增加 ImageList控件(Win32组件页),并在其上单击鼠标右键,在弹出的快捷菜单上选择“ImageList Editor”项,添加相.应的.ico图标。

3.设置 TBToolbar 控件的 Images 属性为 ImageList,这样就可以设置每一个菜单项的ImageIndex,以使每个菜单项都拥有自己的图标。 其余设置详见本书光盘,完成界面如图 17-4所示。

图 17-4 设计期界面

二、源代码及注释 procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Text := 'Running on TB2000 version ' + Toolbar2000Version;

Application.OnHint := OnHint;

end;

procedure TForm1.OnHint (Sender: TObject);

begin

StatusBar.Panels[0].Text := Application.Hint;

end;

第一篇 窗口与界面国

– 49 –

procedure TForm1.ItemClick(Sender: TObject);

begin

if Sender is TComponent then

Application.MessageBox (PChar('You selected:'#13#10#13#10 +

TComponent(Sender).Name), 'OnClick handler',

MB_OK or MB_ICONINFORMATION);

end;

procedure TForm1.MRUListClick(Sender: TObject; const Filename: String);

begin

Application.MessageBox (PChar(Format('You selected "%s" from the MRU list.',

[Filename])), 'MRUListClick', MB_OK or MB_ICONINFORMATION);

end;

procedure TForm1.VMenuClick(Sender: TObject);

begin

VStatusBar.Checked := StatusBar.Visible;//设置可见

end;

procedure TForm1.VStatusBarClick(Sender: TObject);

begin

{ 使得状态栏始终位于底部}

StatusBar.Top := ClientHeight;

{设置状态栏可见性}

StatusBar.Visible := not StatusBar.Visible;

end;

procedure TForm1.AlignClick(Sender: TObject);

begin

AlignLeftItem.Checked := (Sender = actAlignLeft);

CenterItem.Checked := (Sender = actCenter);

AlignRightItem.Checked := (Sender = actAlignRight);

end;

procedure TForm1.BulletsItemClick(Sender: TObject);

begin

BulletsItem.Checked := not BulletsItem.Checked;

end;

procedure TForm1.BoldItemClick(Sender: TObject);

begin

BoldItem.Checked := not BoldItem.Checked;//显示单击效果

end;

procedure TForm1.ItalicItemClick(Sender: TObject);

国 Delphi 7控件实用程序设计 100例

– 50 –

begin

ItalicItem.Checked := not ItalicItem.Checked;

end;

procedure TForm1.UnderlineItemClick(Sender: TObject);

begin

UnderlineItem.Checked := not UnderlineItem.Checked;

end;

procedure TForm1.PopupMenuBarButtonClick(Sender: TObject);

var

P: TPoint;

begin

P := Memo1.ClientToScreen(Point(8, 8)); //设置弹出菜单位置

MenuToolbar.Items.Popup (P.X, P.Y, True);// 主菜单形成弹出菜单

end;

procedure TForm1.PopupToolbarButtonClick(Sender: TObject);

var

P: TPoint;

begin

P := Memo1.ClientToScreen(Point(8, -60));//设置弹出菜单位置

MainToolbar.Items.Popup (P.X, P.Y, True);// 工具条形成弹出菜单

end;

实例 18 AbcWelcomeTipsDialog——每日提示对话框

实例效果 在程序启动以后,显示一个每日提示对话框,效果如图 18-1所示。

图 18-1 效果图

第一篇 窗口与界面国

– 51 –

控件说明 本例主要讲解 AbcWelcomeTipsDialog 控件,该控件用于在程序中显示一个欢迎或者每日

提示样式的对话框,能够在设计期对提示进行编辑和预览。 1.主要属性如表 18-1所示。

表 18-1 控件属性 属性 作用 本例设置 备注

AutoShow 设为 True时,程序加载以后自动显示对话框 False

CaptionGreeting 此属性设置对话框顶部的标题文本 每日提示

CaptionShowNext 对话框中下一次显示的复选框的标题 下次显示吗?

CaptionTip 对话框内提示区域内标签的标题 日积月累

IniFileName 指定内容出自的文件。提示索引和程序开始显示

的值也保存在该文件中 Demo.ini

IniLocal 当 INI文件可执行文件所在目录时,设置此特性为 True

True

ShowOnStartup 设为 True时,程序加载时自动显示对话框 False

TipIndex 此特性用来标明或改变当前的提示。当每读一个

新的提示,此特性值增加一次

VisibleButtons 设置在对话框中显示哪些按钮:

atbNextTip:示下一个提示按钮

atbHelpContents:显示帮助内容按钮

atbHelpWhatsNew:显示新内容

atbClose:显示关闭按钮

2.该控件主要方法。 Execute:显示欢迎提示对话框 ExecuteIFSelected:当用户选择了在“开始时显示”的复选框,调用此方法显示对话框。 GetNextTips:返回下一条提示 3.主要事件。 OnGetShow:如果没有使用 INI文件,可以在此对 ShowOnStartup特性进行设置。 OnSetShow:如果没有使用 INI文件,可以在此事件存储 ShowOnStartup特性的值。 OnGetTip:如果没有使用 INI文件,此事件可以用来提供提示的文本和调整提示的索引。 4.控件性质。 该控件是商业套件 ABC中的一个控件,为商业性的第三方控件。 5.下载地址:http://www.obsof.com。

制作步骤 启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

AbcWelcomeTipsDialog控件,在该控件上点击鼠标右键,在如图 18-2快捷菜单上选择 Edit INI Tip Text项,可以编辑 Tip文本,点击 Preview Tip Dialog可以预览提示对话框。

国 Delphi 7控件实用程序设计 100例

– 52 –

完成界面如图 18-3所示。

图 18-2 快捷菜单 图 18-3 设计期界面

实例 19 wwCheckBox——图形复选框

实例效果 wwCheckBox控件是一个复选框控件,有选中、没选中、激活 3种形式,比 CheckBox控

件美观得多。它有很多种表现效果,如图 19-1、19-2所示。

图 19-1 运行界面图(1) 图 19-2 运行界面图(2)

控件说明 本例主要讲解了 wwCheckBox 控件,该控件是一个界面控件,它可以起到美化界面的效

果。每个单独的组都包括一个容器面板,允许将所需要的任何控件加入到面板中。 1.该控件主要属性如表 19-1所示。

表 19-1 wwCheckBox控件属性 属性 作用 本例设置 备注

AllowGrayed 是否允许灰色

Checked 是否选中

DataSource 设置数据源 25

第一篇 窗口与界面国

– 53 –

续表

属性 作用 本例设置 备注 DataField 设置数据字段

Images 设置选中图标

State 设置 3种状态。 CbChecked CbGrayed cbUnchecked

2.该控件主要事件。 OnClick事件:鼠标选中此按钮时触发此事件。 OnMouseMove事件:鼠标从一个控件移动到另外一个控件时触发此事件。 3.控件性质。 wwCheckBox是著名控件包 Infopower中的一个控件,该控件为商业性的第三方控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加数个

wwCheckBox控件,以实现它的不同效果。由于该实例使用到的控件很多,但都是常见的。所以在此不在一一介绍。完成界面如图 19-3所示。

图 19-3 设计期界面

二、源代码及注释 procedure TCheckBoxDemo.TabSheet2Show(Sender: TObject);

begin

if Image2.Picture.Bitmap.Empty then

Image2.Picture.Assign(Image1.Picture);

国 Delphi 7控件实用程序设计 100例

– 54 –

end;

procedure TCheckBoxDemo.TabSheet3Show(Sender: TObject);

begin

if Image3.Picture.Bitmap.Empty then

Image3.Picture.Assign(Image1.Picture);

end;

实例 20 fcImageForm——异形图形界面

实例效果 fcImageForm控件是著名控件包 1stClass中的一个界面控件,它可以把界面设置成任何形

状,简化了程序员的编码工作,使用非常简便。下面是我们用 fcImageForm控件做出来的程序运行效果演示,如图 20-1、20-2所示。

图 20-1 运行界面图(1)

图 20-2 运行界面图(2)

第一篇 窗口与界面国

– 55 –

控件说明 本例主要讲解了 fcImageForm控件,该控件是一个界面控件,它可以把界面分割成任何形

状,同时也是一个容器面板,允许将所需要的任何控件加入到面板中,并且还能显示该控件的

形状。 1.该控件主要属性如表 20-1所示。

表 20-1 fcImageForm控件属性 属性 作用 本例设置 备注

Align 设置该控件的在界面上的排列

CaptionBarControl 设置不透明的控件

Picture 设置一幅图片

TransparentColor 设置透明颜色 ClBtnText

2.该控件主要事件。 OnClick事件:当鼠标单击该控件时触发此事件。 OnDblClick事件:当鼠标双击该控件时触发此事件。 fcImageForm是著名控件包 1stClass中的一个界面控件,为商业性的第三方控件。 3.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一个

fcImageForm控件以及一些相关控件。完成界面如图 20-3所示。

图 20-3 设计期界面

二、源代码及注释 procedure TOrderForm.CloseBtnClick(Sender: TObject);

begin

国 Delphi 7控件实用程序设计 100例

– 56 –

Close;//关闭窗体

end;

//选中 fcOutlookBar1的某个页

procedure TOrderForm.PricesButtonClick(Sender: TObject);

begin

fcOutlookBar1.ActivePage := Prices;

end;

procedure TOrderForm.OrderingButtonClick(Sender: TObject);

begin

fcOutlookBar1.ActivePage := Ordering;

end;

procedure TOrderForm.AboutButtonClick(Sender: TObject);

begin

fcOutlookBar1.ActivePage := About;

end;

{Get RichEdit Word From Point}

function TOrderForm.GetWordFromPoint(CurRichEdit:TCustomRichEdit; X, Y: Integer): String;

type TCharSet = Set of Char;

var CurSel: Integer;

Line: Integer;

LineIndex: Integer;

CurLineStr: string;

Offset: Integer;

p: TPoint;

startWord: integer;

//获得当前文档的位置.

function GetStartOfWord(Subset: TCharSet; s: string; Index: integer): integer;

begin

if Index = 0 then Index := Length(s);

for result := Index - 1 downto 1 do

if s[result] in Subset then break;

end;

begin

p := Point(x, y);

CurSel := SendMessage(CurRichEdit.Handle, EM_CHARFROMPOS, 0, LParam(@p));

Line := SendMessage(CurRichEdit.Handle, EM_EXLINEFROMCHAR, 0, CurSel);

CurLineStr := CurRichEdit.Lines[Line];

LineIndex := SendMessage(CurRichEdit.Handle, EM_LINEINDEX, Line, 0);

Offset := CurSel - LineIndex;

第一篇 窗口与界面国

– 57 –

if (Offset > 0) and (CurLineStr[Offset] = ' ') then inc(Offset);

startWord:= GetStartOfWord([' ',#9], CurLineStr, Offset + 1) + 1;

//Loop from current offset til next whitespace.

while not (curLineStr[offset] in [' ', #9, #13, #10]) do begin

inc(offset);

if (offset>=length(curLineStr)) then break;

end;

result := Copy(CurLineStr, startWord, offset-startWord)

end;

//当鼠标移动到 RichEdit控件上时,改变鼠标图形

procedure TOrderForm.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

if (GetWordFromPoint((Sender as TCustomRichEdit),X,Y) = 'http://www.woll2woll.com') or

(GetWordFromPoint((Sender as TCustomRichEdit),X,Y) = '[email protected]') then

(Sender as TCustomRichEdit).Cursor := crHandPoint

else

(Sender as TCustomRichEdit).Cursor := crDefault;

end;

procedure TOrderForm.RichEdit1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

{Check for url links and execute them}

if GetWordFromPoint((Sender as TCustomRichEdit),X,Y) = 'http://www.woll2woll.com' then

//超连接网址

ShellExecute(Handle, 'OPEN',

PChar('https://www.he.net/cgi-bin/suid/~wol2wol/ordering/order.cgi'), nil, nil, sw_shownormal)

else if GetWordFromPoint((Sender as TCustomRichEdit),X,Y) = '[email protected]' then

ShellExecute(Handle, 'OPEN',

PChar('mailto:[email protected]'), nil, nil, sw_shownormal)

end;

实例 21 TMS Skin Factory——播放器皮肤

实例效果 相信读者都用过 MP3 最好的播放器 Winamp吧(没用过的话还不赶快 Download)!不是

国 Delphi 7控件实用程序设计 100例

– 58 –

它的原生界面吸引我们,而是下载那些漂亮的皮肤插件吸引我们,各式各样的皮肤插件让人目

不暇接。本实例做了一个类似 MP3播放器的界面,界面效果绝对一流,可能读者会认为它就是一个播放器,其实它只是一个界面没有实质内容。读者如果喜欢为什么不用它编一个播放器

呢!界面效果如图 21-1、21-2所示。

图 21-1 运行界面图(1) 图 21-2 运行界面图(2)

控件说明 本例主要讲解 TMS Skin Factory控件组里的皮肤控件,整个控件组可以实现很多漂亮界

面。本例就是用它们实现 Winamp的界面效果,下面我们主要讲解 VsSkin控件的属性事件。 该控件同时还是一个容器面板,允许将所需要的任何皮肤控件加入到面板中。

1.该控件主要属性如表 21-1所示。

表 21-1 VsSkin控件属性 属性 作用 本例设置 备注

Composer 设置 VsComposer控件

GraphicName 选择图片(VsComposer控件必须设置图片之后)

MaskColor 设置背景色

AutoSave 保存文件

FormDrag 设置窗体是否拖动 true

2.该控件主要事件。 OnClick事件:鼠标点击该控件时触发此事件。 OnSkinRead事件:当读取皮肤时触发此事件。 OnSkinWrite事件:当更换皮肤时触发此事件。 3.控件性质。 该控件是控件包 TMS 中的一个皮肤控件,它还包括:VsComposer、VsCheckBox、

VsImageClip、VsButton、VsLabel、VsRadioButton、VsSlider、VsImage、VsProgressBar、VsLed、VsImageText、VsHotSpot等 13个控件,能做出Winamp的界面效果。为免费性的第三方控件。

4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上首先添

第一篇 窗口与界面国

– 59 –

加一个 VsSkin控件(注意:为什么要首先添加 VsSkin控件,因为某些皮肤控件必须放到 VsSkin控件之上)。再添加一些皮肤控件,以及一个 Timer控件和一个 OpenDialog控件,最重要的是还必须放一个 VsComposer控件。

2.设置 VsComposer控件的 Graphics属性即添加一幅图片,双击该控件也可以,它们都会出现 Graphics Editor编辑框。如图 21-3所示。 完成界面如图 21-4所示。

图 21-3 Graphics Editor编辑框 图 21-4 设计期界面

二、源代码及注释 procedure TForm1.Timer1Timer(Sender: TObject);

begin

if VsProgressBar1.Position < VsProgressBar1.MaxValue then

VsProgressBar1.StepIt

else VsProgressBar1.Position := VsProgressBar1.MinValue;

VsLed1.Active := not VsLed1.Active;

Inc(Cnt);

VsImageText1.Text := Format('%.4d', [Cnt]);

end;

//程序最小化

procedure TForm1.VsButton1Click(Sender: TObject);

begin

Application.Minimize;

end;

//结束整个工程

procedure TForm1.VsButton2Click(Sender: TObject);

begin

Application.Terminate;

国 Delphi 7控件实用程序设计 100例

– 60 –

end;

// 设置 VsLabel3控件是否可见

procedure TForm1.VsCheckBox1Click(Sender: TObject);

begin

VsLabel3.Visible := VsCheckBox1.Checked;

end;

// 设置 VsLabel4控件是否可见

procedure TForm1.VsCheckBox2Click(Sender: TObject);

begin

VsLabel4.Visible := VsCheckBox2.Checked;

end;

//更换皮肤

procedure TForm1.VsButton8Click(Sender: TObject);

begin

OpenDialog1.InitialDir := GetCurrentDir;

if OpenDialog1.Execute then

VsSkin1.ReadSkin(OpenDialog1.FileName);

end;

实例 22 fcButtonGroup——动画效果切换选项卡

实例效果 fcButtonGroup 控件在切换各组、面板、按钮的时候将产生一种平滑并且具有动画效果的

效果,比起 PageControl控件,效果更漂亮,界面友好。效果如图 22-1、图 22-2、图 22-3所示。

图 22-1 运行界面图(1) 图 22-2 运行界面图(2)

第一篇 窗口与界面国

– 61 –

图 22-3 运行界面图(3)

控件说明 本例主要讲解了 fcButtonGroup 控件,该控件功能类式 PageControl 控件,但更图形化,

让用户操作起来很方便,同时界面也非常友好漂亮。 1.该控件与 fcButtonGroupfcImageBtn控件配合使用,主要属性如表 22-1、表 22-2所示。

表 22-1 fcButtonGroup控件属性 属性 作用 本例设置 备注

ButtonClassName 按钮继承某个类 TfcImageBtn

ButtonItems 创建按钮

ClickStyle 单击页面中的按钮的动作类型 bcsRadioGroup

Columns 分几列显示按钮 1

ControlSapcing 按钮间的距离 1

LayOut 显示方式(垂直还是水平) loHorizontal

表 22-2 fcButtonGroupfcImageBtn属性 效果 作用 本例设置 备注

Image 设置与页面关联的图像列表

ImageDown 按钮按下时所显示的图片

Color 按钮的颜色 clBtnFace

2.该控件主要事件。 OnChange事件:鼠标点击 fcButtonGroup中的按钮时触发此事件。 OnMouseMove事件:鼠标从一个页面移动到另外一个页面的标题时触发此事件。 3.控件性质。 fcButtonGroup是著名控件包 1stClass中的一个控件,该控件为商业性的第三方控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

fcButtonGroup控件。以及增加几个 fcLabel控件和 Shape控件。完成界面如图 22-4所示。

国 Delphi 7控件实用程序设计 100例

– 62 –

图 22-4 设计期界面

2.双击 fcButtonGroup控件,出现编辑窗口,增加、删除、修改页面,如图 22-5所示。

图 22-5 页面编辑

二、源代码及注释 procedure TTabBtnGroupForm.fcButtonGroup1Change(ButtonGroup: TfcCustomButtonGroup;

OldSelected, Selected: TfcButtonGroupItem);

begin

PageControl1.ActivePage :=

(FindComponent('TabSheet'+IntToStr(Selected.Button.Tag)) as TTabSheet);

end;

procedure TTabBtnGroupForm.FormShow(Sender: TObject);

begin

PageControl1.ActivePage := TabSheet1;

end;

第二篇 图形处理

Delphi 7控件技术的优势,突出地表现在图形处理技术上。使用 Delphi 7图形处理控件,可以设计出类似 PhotoShop滤镜效果的图形,可以方便地设计出播放WAV、AVI、MIDI、MPEG等文件的播放器,几乎可以播放所有主流多媒体文件,可以实现高级的屏幕抓图与图块网格,

相关操作技术简洁明了,代码开发效率高,周期短,易于维护与升级。可以说,几乎所有流行

的图形处理与多媒体技术在Delphi 7中都可以实现,充分表现了Delphi 7在此方面的强大功能。 本部分将重点介绍 Delphi 7图形处理技术,讲述如何利用 DrawGrid、DBChart、StringGrid、

Layer等图形控件设计图形栅格、数据库图表、图块网格、分层图形等。同时还为读者提供了Delphi 7图形处理的其他一些常用技巧,使读者对 Delphi 7图形控件技术有较深刻的理解。

本部分主要有以下精彩内容:

DrawGrid——图形栅格;

DBChart——数据库图表;

Layer——分层图形;

ScreenCapture——屏幕抓图。

国 Delphi 7控件实用程序设计 100例

– 64 –

实例 23 PaintBox——画图

实例效果

本例使用 PaintBox 控件,演示了画图功能,介绍 PaintBox很多有用的功能。通过使用简短的代码,轻松实现了在图形上画矩形、椭圆和直线的功能,还可以显示鼠标在图形上

的位置和坐标,放大图形等,功能相当强大,图 23-1、图 23-2、图 23-3所示分别演示了打开、画矩形、椭圆和直线、放大图形的效果。

图 23-1 效果图(1)

图 23-2 效果图(2) 图 23-3 效果图(3)

控件说明 1.本例主要讲解了 PaintBox控件,该控件主要属性如表 23-1所示。

表 23-1 控件属性 属性 作用 本例设置 备注

Canvas 用于在图形控制上作图或绘画 在代码里设置 Align 设置控件放置窗体的位置 AlNone

Enabled 设置控件是否可用 True

第二篇 图形处理国

– 65 –

2.主要方法。 Paint:产生一个 OnPaint事件。 3.主要事件。 DblClick:当鼠标双击时发生。 MouseUp:当鼠标放开时发生。 MouseDown:当鼠标按下时发生。 MouseMove:当鼠标移动时发生。 OnPaint:当画布需要重画时发生。 4.控件性质:该控件为 Delphi自带控件(在 System组件页上)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 1

个 ScrollBox控件(Additiona组件页),然后在其上添加 5个 SpeedButton控件(Additional组件页),依次排列,并将其 Glyph属性上分别加入 5幅类似图形。

2.在 Form1 上添加一个 PaintBox 控件(System 组件页),放置在 ScrollBox1 里,Name属性设为 bild,添加一个 MainMenu控件(菜单设计详见光盘)、一个 ComboBox控件、一个GroupBox控件、一个Memo控件等(在 Standard组件页),添加一个 OpenDialog(Dialogs组件页),设置 Name属性为 open,添加一个 Statusbar(Win32组件页),设置 Name属性为 bar。 最后完成界面如图 23-4所示。

图 23-4 设计期界面

二、源代码及注释 var

Form1: TForm1;

myimg : array [-1..4] of tbitmap;

map : tstrings;

points : tstrings;

mode : integer = 1;

ismode : boolean = false;

国 Delphi 7控件实用程序设计 100例

– 66 –

oldx,oldy : integer;

pts : array [0..500] of tpoint;

ptix : integer = 0;

allownext : boolean = true;

allowchange : boolean = true;

canchange : boolean = true;

const zoom : array [-1..3] of byte = (1,1,2,4,8);

{ Private-Deklarationen }

function getzoom : integer; //设置选择 combobox 的索引值

procedure updatebild; //设置选择 paintbox宽度和高度

procedure getimgs;

procedure gettbmp;

procedure settbmp;

procedure addmap(x,y:integer);

function gv (a,x:integer):string;

procedure drawmap(s:string);

function gc (var s : string):integer;

end;

//在 paintbox双击事件加入以下代码

procedure TForm1.bildDblClick(Sender: TObject);

begin

if ismode then if mode = 3 then addmap(0,0);//如果选中,且为整数,就调用 addmap过程

ismode := false;

ptix :=0;

allownext := false;

end;

//在 paintbox鼠标按下事件加入以下代码

procedure TForm1.bildMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if not allownext then begin

allownext := true;

exit;

end;

if not ismode then gettbmp;

oldx := x;

oldy := y;

if not ismode then ptix := 0;

ismode := true;

第二篇 图形处理国

– 67 –

if mode = 3 then begin

if ptix > 500 then exit;

pts [ptix].x := x div getzoom*getzoom;//调用函数

pts [ptix].y := y div getzoom*getzoom;

inc (ptix);

end;

end;

//在 paintbox鼠标移动事件加入以下代码

procedure TForm1.bildMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

var t : integer;

begin

bar.Panels[0].Text := 'X: '+inttostr(x div getzoom)+' Y: '+inttostr(y div getzoom);//显示坐标

if not ismode then exit;

//设置画笔

with bild.canvas do begin

pen.mode := pmnot;

pen.width := 0;

settbmp;

case mode of

//调用矩形(rectangle)和椭圆(ellipse)函数

1 : rectangle ( oldx div getzoom*getzoom,oldy div getzoom*getzoom,x div

getzoom*getzoom,y div getzoom*getzoom);

2 : ellipse(oldx div getzoom*getzoom,oldy div getzoom*getzoom,x div getzoom*getzoom,

(oldy+(x-oldx)) div getzoom*getzoom);

3 : begin

if ptix = 0 then exit;

pen.width := getzoom;

t := 0;

moveto(pts[0].x,pts[0].y);

if ptix > 1 then begin

for t := 1 to ptix -1 do

lineto(pts[t].x,pts[t].y); //画直线

end;

lineto(x div getzoom*getzoom,y div getzoom*getzoom); //画直线

end;

end;

end;

end;

国 Delphi 7控件实用程序设计 100例

– 68 –

//在 paintbox释放鼠标事件加入以下代码:

procedure TForm1.bildMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if ismode then if mode <> 3 then addmap(x,y);

if mode <> 3 then ismode := false;

end;

procedure TForm1.bildPaint(Sender: TObject);

var t : integer;

begin

bild.canvas.pen.mode := pmblack; //设置画笔模式;

bild.canvas.draw(0,0,myimg[combobox1.itemindex]); //绘图,调用 combobox里的值

bild.canvas.pen.mode := pmnot;

if map.count > 0 then for t := 0 to map.count -1 do

drawmap(map[t]); //调用过程。

gettbmp;//调用过程。

end;

注意:涉及到的调用过程、调用函数,请参阅本书光盘,这里只讲述 PaintBox 的用法以及实现的功能。

实例 24 DrawGrid——图形栅格

实例效果 在图形栅格编程中,DrawGrid 控件有很大的用途。本例用简短的代码轻松实现了五子棋

游戏。其中一方使用白棋,另外一方使用黑棋,哪一方的棋子先连成了五颗,哪一方就算赢,

如图 24-1所示。

图 24-1 效果图

第二篇 图形处理国

– 69 –

控件说明 1.DrawGrid控件主要属性如表 24-1所示。 表 24-1 控件属性 属性 作用 本例设置 备注

Canvas 用于在图形控制上作图或绘画 在代码里设置 ColCount 指示栅格中的列数 19

RowCount 指示栅格中的行数 20

ScrollBar 设置滚动条 有 4种设置。ssNone 不设置滚动条;ssBoth 控件同时有水平和垂直滚动条;ssHorizontal 水平滚动条;ssVertical 垂直滚动条

2.主要方法。 MouseToCell:返回由屏幕坐标点(X、Y)指定单元的行与列。其中 X和 Y参数指定鼠

标单元的列和行,放在 Acol和 Arow参数中。 Invalidate :结束,使控件不可用。 3.主要事件。 DrawCell:当需重新画单元格时,触发该事件。 MouseDown :当鼠标按下时,触发该事件。 4.控件性质:该控件为 Delphi自带控件(在 Additional组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 Panel控件(Standard组件页),然后在它上面加一个 DrawGrid控件(Additional组件页). 2.设置 Panel 控件的 BevelInner 属性为 Bvraised、BevelOuter 属性为 Bvlowered、

BorderStyle属性为 bsSingle,DrawGrid控件的 RowHeight属性为 20、RowHeight属性为 20、Drawing属性为 false、FixedCols属性为 0、FixeDrows属性为 0、RowCount属性为 19、ColCount属性为 19、ScorllBars属性为 ssNone。

3.该程序要用到 Drawgrid控件的 OnDrawCell和 OnMouseDown事件,其中 OnDrawCell事件在需要新画单元格时触发。而 OnMouseDown事件是当鼠标在单元格上按下时触发。

图 24-2 设计期界面

国 Delphi 7控件实用程序设计 100例

– 70 –

二、源代码及注释 Private

tag:array[0..18,0..18] of integer; //1代表黑子,2代表白子

IsBlack:bcolean; ///设置画笔颜色

Public

function iswin(isblack:Boolean):Boolean; //用于判断是否胜利

//在 OndrawCell事件加入以下代码,主要是在需要重新绘图时,设置画笔的颜色

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

begin

drawgrid1.Canvas.Pen.Color :=clblack; //设置画笔的颜色

drawgrid1.Canvas.Brush.Color :=clblack; //设置画刷的颜色

if tag[acol,arow]=1 then

drawgrid1.Canvas.Ellipse(acol*21,arow*21,(acol+1)*21,(arow+1)*21);//调用椭圆(Ellipse)函数

else if tag[acol,arow]=2 then

drawgrid1.Canvas.Arc(acol*21,arow*21,(acol+1)*21,(arow+1)*21,acol*21,arrow *21,acol*21,

arow*21);

//调用弧(Arc)函数

else

begin

drawgrid1.Canvas.Pen.Color :=clwhite;

drawgrid1.Canvas.brush.Color :=clwhite;

drawgrid1.Canvas.Ellipse(acol*21,arow*21,(acol+1)*21,(arow+1)*21);

end;

end;

//在 DrawGrid控件的MouseDown事件中绘棋子并判断是否有一方连成了五子

procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

col,row:integer;

i,j:integer;

begin

drawgrid1.Canvas.Pen.Color :=clblack; //设置画笔颜色

drawgrid1.Canvas.brush.Color :=clblack; //设置画刷颜色

drawgrid1.MouseToCell(x,y,col,row);

if tag[col,row]=0 then

begin

if isblack then

begin

第二篇 图形处理国

– 71 –

drawgrid1.Canvas.Ellipse(col*21,row*21,(col+1)*21,(row+1)*21);

//调用椭圆(Ellipse)函数

tag[col,row]:=1;

end

else

begin

drawgrid1.Canvas.Arc(col*21,row*21,(col+1)*21,(row+1)*21,col*21,row*21,col*21,row*21);

// 调用弧(Arc)函数

tag[col,row]:=2;

end;

//判断那方胜利,如果胜利,则清空棋盘,开始下一盘

if iswin(isblack) then //调用函数

begin

if isblack then

if messagedlg('黑方胜利',mtinformation,[mbok],0)=mrok then

begin

for i:=0 to 18 do

for j:=0 to 18 do

begin

tag[i,j]:=0;

end;

drawgrid1.Invalidate ;// drawgrid被禁止

end;

if not isblack then

if messagedlg('白方胜利',mtinformation,[mbok],0)=mrok then

begin

for i:=0 to 18 do

for j:=0 to 18 do

begin

tag[i,j]:=0;

end;

drawgrid1.Invalidate ;

end;

end;

isblack:=not isblack;

end;

end;

注意:调用函数 iswin的代码请参阅本书光盘。

国 Delphi 7控件实用程序设计 100例

– 72 –

实例 25 Chart用法

实例效果 Chart 控件在数据的图表化显示方面,应用得非常广泛,比如统计、股票分析图形显示、

温控显示等,它不仅用法简单,而且效果非常直观,让人一目了然。同时它的颜色搭配得很好,

不管有多少个数据,它都能用不同的颜色显示。本例就用 Chart来显示一组数据,修改数据后,单击按钮,可以更新 Chart 图表显示,并在图表上显示数据,如图 25-1、图 25-2、图 25-3所示。

图 25-1 效果图(1)

图 25-2 效果图(2)

图 25-3 效果图(3)

第二篇 图形处理国

– 73 –

控件说明 1. Chart控件主要属性如表 25-1所示。

表 25-1 控件主要属性 属性 作用 本例设置 备注

Color 设置控件的颜色 ClBtnFace BorderStyle 边框的类型 bsSingle BackImage 加载一副背景图片 BackImageInside 加载的背景图片是否显示在控件内 False

2.主要方法。 Series :设置图形串行。 3.主要事件。 OnPageChange :当改变页的时候,此事件发生。 OnMouseDown :当鼠标按下时产生。 4.控件性质:该控件为 Delphi自带控件(在 Additional组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上面添加

一个 Chart 控件(Additional组件页),设置 BevelInner属性设为 BvSpace,BevelOuter属性设为 bvRaised,BorderStyle属性设为 bsSingle。

2.Form1上放置一个 StringGrid1控件和一个 BitBtn控件(设置 Name属性为 updateButton、Kind属性为 bkRetry),一个 CheckBox控件(设置 Name属性为 ChBoxMarks)。

最后完成界面如图 25-4所示。

图 25-4 设计期界面

二、源代码及注释 主要代码如下: //当修改完数据之后,单击数据更新

国 Delphi 7控件实用程序设计 100例

– 74 –

procedure TForm1.UpdateButtonClick(Sender: TObject);

var

I, J: Integer;

begin

for I := 1 to 4 do

begin

Chart1.Series [I-1].Clear;

for J := 1 to 5 do

Chart1.Series [I-1].Add (StrToInt (StringGrid1.Cells [J, I]),

'', Chart1.Series [I-1].SeriesColor);

end;

end;

//显示数据值

procedure TForm1.ChBoxMarksClick(Sender: TObject);

var

I: Integer;

begin

for I := 1 to 4 do

Chart1.Series [I-1].Marks.Visible :=ChBoxMarks.Checked; //选中之后显示数据值

end;

procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,

ARow: Integer; var Value: String);

begin

Value := '09;0';

end;

procedure TForm1.FormCreate(Sender: TObject);

var

I, J: Integer;

begin

with StringGrid1 do

begin

for I := 1 to 5 do

Cells [I, 0] := Format ('Group%d', [I]);//格式化组的数据

for J := 1 to 4 do

begin

Cells [0, J] := Format ('Series%d', [J]);

Chart1.Series [J-1].Title := Format ('Series%d', [J]); //Chart某行的标题

end;

Randomize; //随机产生

第二篇 图形处理国

– 75 –

for I := 1 to 5 do

for J := 1 to 4 do

Cells [I, J] := IntToStr (Random (100)); //随机产生的单元在 100范围内

end;

UpdateButtonClick (self); //调用更新事件

end;

本实例完整代码,请见本书光盘。

实例 26 ColorGrid——调色板

实例效果 读者可能对 Windows 里自带的画板非常熟悉,经常用它来画图。Delphi 里的调色板

ColorGrid控件,同样可以实现 Windows 程序里的画图功能,需要哪种颜色,只要用鼠标选中它就可以了。本程序就用 ColorGrid控件实现了画图功能,图形可以是直线、矩形、圆形、圆角矩形、折线等,还可以实现是否填充颜色。效果如图 26-1、图 26-2、图 26-3所示。

图 26-1 效果图(1)

图 26-2 效果图(2)

国 Delphi 7控件实用程序设计 100例

– 76 –

图 26-3 效果图(3)

控件说明 1. ColorGrid控件主要属性如表 26-1所示。

表 26-1 控件主要属性 属性 作用 本例设置 备注

Constraints 控制控件的大小 0 若它们同时设置为“0”,则表示不限制控件大小。 MaxHeight 最大高度 MaxWidth 最大宽度 MinHeight 最小高度 MinWidth 最小宽度

GridOrdering 控件排列方式 Go2*8 Go16*1 Go1*16 Go2*8 Go4*4 Go8*2

Backgroundindex 背景的索引值 15 BackgroundEnable 前景是否激活 True

2.主要方法。 ForeGroundColor:设置前景颜色。 BackGroundColor:设置背景颜色。 3.主要事件。 On Change:当颜色改变时,此事件发生。 OnMouseDown:当鼠标按下时产生。 4.控件性质:该控件为 Delphi自带控件(在 Samples组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上面添加

第二篇 图形处理国

– 77 –

一个 Colorgrid控件(Samples组件页),设置 Name属性为 cgDrawingColors。 2.在 Form1上放置 1个MainMenu控件(菜单设置见本书光盘)、1个 OpenDialog控件、

1个 Bevel控件、1个 CheckBox控件、1个 Image控件、1个 PaintBox控件、4个 Panel控件、1个 RadioGroup控件、1个 SaveDialog控件、6个 SpeedButton控件、1个 ScrollBox控件、1个 StatusBar控件,详细设置见本书光盘。 最后完成界面如图 26-1所示。

图 26-4 设计期界面

二、源代码及注释 主要代码如下: procedure TMainForm.cgDrawingColorsChange(Sender: TObject);

{ This method draws the rectangle representing fill and border colors

to indicate the users selection of both colors. pnlFgBgInner and

pnlFgBgBorder are TPanels arranged one on to of the other for the

desired effect }

begin

pnlFgBgBorder.Color := cgDrawingColors.ForeGroundColor;//设置颜色

pnlFgBgInner.Color := cgDrawingColors.BackGroundColor;

SetDrawingStyle; ////调用过程,设置绘画类型

end;

//画矩形

procedure TMainForm.sbLineClick(Sender: TObject);

begin

// First erase the cliprect if current drawing type

if DrawType = dtClipRect then

DrawToImage(MouseOrg, NextPoint, pmNotXOR);

{ 现在设置到那部分由调用这个方法的 TSpeedButton 指定了的 DrawType }

if Sender is TSpeedButton then

DrawType := TDrawType(TSpeedButton(Sender).Tag);

//现在保证 dtClipRect 风格不擦掉先前的图画

国 Delphi 7控件实用程序设计 100例

– 78 –

if DrawType = dtClipRect then begin

EraseClipRect := False;

end;

////调用过程.设置绘画的风格

SetDrawingStyle;

end;

//画圆

procedure TMainForm.sbLineClick(Sender: TObject);

begin

//首先擦掉 cliprect 如果当前绘画的类型

if DrawType = dtClipRect then

DrawToImage(MouseOrg, NextPoint, pmNotXOR);

if Sender is TSpeedButton then

DrawType := TDrawType(TSpeedButton(Sender).Tag);

if DrawType = dtClipRect then begin

EraseClipRect := False;

end;

SetDrawingStyle; //调用过程

end;

//填充与否

procedure TMainForm.RgGrpFillOptionsClick(Sender: TObject);

begin

FillSelected := RgGrpFillOptions.ItemIndex = 0;

BorderSelected := cbxBorder.Checked;

SetDrawingStyle;//调用过程

end;

//定义了一个过程

procedure TMainForm.SetDrawingStyle;

{ This method sets the various drawing styles based on the selections

on the pnlFillStyle TPanel for Fill and Border styles }

begin

with imgDrawingPad do

begin

if DrawType = dtClipRect then

begin

Canvas.Pen.Style := psDot;

Canvas.Brush.Style := bsClear;

Canvas.Pen.Color := clBlack;

end

第二篇 图形处理国

– 79 –

else if FillSelected then

Canvas.Brush.Style := bsSolid

else

Canvas.Brush.Style := bsClear;

if BorderSelected then

Canvas.Pen.Style := psSolid

else

Canvas.Pen.Style := psClear;

if FillSelected and (DrawType <> dtClipRect) then

Canvas.Brush.Color := pnlFgBgInner.Color;

if DrawType <> dtClipRect then

Canvas.Pen.Color := pnlFgBgBorder.Color;

end;

end;

实例 27 DBChart——数据库图表

实例效果 如果要显示数据库里的数据,用 DBChart 控件是一种非常不错的选择,比如统计一个公

司里员工的工资情况、不同地区人口分布情况等,应用非常广泛。DBChart控件使用简单,图形直观,立体效果也非常好。本例使用 DBChart控件来显示 Delphi自带的 DBDEMOS数据库Country.db表里的国家面积和人口情况,同时还可以修改面积和人口数据,并在 DBChart控件里自动更新,如图 27-1、图 27-2、图 27-3所示。

图 27-1 效果图(1)

国 Delphi 7控件实用程序设计 100例

– 80 –

图 27-2 效果图(2)

图 27-3 效果图(3)

控件说明 1.DBChart控件主要属性如表 27-1所示。

表 27-1 控件主要属性 属性 作用 本例设置 备注

Title 设置标题 在程序中设置 Monochrome 是否黑白图像 false PrintProportional 是否成比例的打印 true Series 设置图形串行 RefreshInterval 刷新图形的时间间隔 0 它只能填 0到 60,0为默认值 View3D 图形是否成 3D true

2.该控件主要方法和主要事件同 Chart控件一样,在此不在赘述,详见实例 25。

第二篇 图形处理国

– 81 –

3.控件性质:该控件为 Delphi自带控件(在 Data Controls组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上面添加

一个 DBChart控件(Data Controls组件页)。把它的 BevelInner属性设为 bvLowered,BevelOuter属性设为 bvLwered,同时在它上面放置两个 RadioButton,设置 Name属性分别为 RadioArea、RadioPopulation。

2.在 Form1上放置一个 DBGrid控件、一个 Table控件、一个 DataSource控件;首先把Table1控件的 DatabaseName连接到 DBDEMOS,把 TableName连接到 Country.db,最后不要忘了把 Active 属性设为 True;再把 DataSource 控件的 DataSet 连接到 Table1;还有就是把DBGrid控件的 DataSource连接到 DataSource1。

3.设置 DBGrid1 控件的 Columns 属性,单击虚点按钮,如图 27-4 所示,将会出现一个对话框,如图 27-5所示。

图 27-4 Columns属性 图 27-5 Columns属性设置

选中某个标题,就可以在 Title属性里修改它的名称,设置它的颜色等。如图 27-6所示。 最后完成界面如图 27-7所示。

图 27-6 Title属性 图 27-7 设计期界面

二、源代码及注释 主要代码如下: //当修改完数据之后,就改变图形比例

国 Delphi 7控件实用程序设计 100例

– 82 –

procedure TForm1.DataSource1StateChange(Sender: TObject);

var

Title: string;

begin

case Table1.State of

dsBrowse: Title := '浏览';

dsEdit: Title := 'Edit';

dsInsert: Title := 'Insert';

else

Title := 'Other state';

end;

Caption := '用 DBChart' + Title;

end;

//显示的是国土面积图形比例

procedure TForm1.RadioAreaClick(Sender: TObject);

begin

DBChart1.Title.Text [0] := 'Area of Countries';

(DBChart1.Series [0] as TPieSeries).

PieValues.ValueSource := 'Area';

end;

//显示国家的人口图形比例

procedure TForm1.RadioPopulationClick(Sender: TObject);

begin

DBChart1.Title.Text [0] := 'Population of Countries';

(DBChart1.Series [0] as TPieSeries).

PieValues.ValueSource := 'Population';

end;

本实例完整代码,请见本书光盘。

实例 28 Shape——形状

实例效果 编程中经常用到很多形状,比如圆、矩形、椭圆形、圆角矩形、圆角正方形等。Shape控

件既可以画几何图形的形状,又可以填充颜色,还可以设置图形轮廓线的颜色,是一个很好的

几何图形编程工具。如图 28-1、图 28-2、图 28-3所示。

第二篇 图形处理国

– 83 –

图 28-1 效果图(1) 图 28-2 效果图(2) 图 28-3 效果图(3)

控件说明 1.DBChart控件主要属性如表 28-1所示。 表 28-1 控件主要属性 属性 作用 本例设置 备注

Brush 画刷,指定颜色和图案,用于填充形状 在代码里设置 Pen 画笔,指定画轮廓线的笔 在代码里设置 Shape 指定几何图形的形状 在代码里设置 StCircle 圆形

StEllipse 椭圆 StRectangle 矩形 StRoundRect 圆角矩形 StRoundSquare 圆角正方形 StSquare正方形

Constraints 控制控件的大小 都为 0 它们同时设置为“0”表示不限制控件大小 MaxHeight 最大高度 MaxWidth 最大宽度 MinHeight 最小高度 MinWidth 最小宽度

2.该控件主要属性是 Shape属性,它可设置很多不同图形。方法和事件都是通用的,在此不在叙述。

3.控件性质:该控件为 Delphi自带控件(在 Additional组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,首先在 Form1上添

加一个 Shape控件(Additional组件页)。 2.在窗体上放置两个 Radiogroup控件和一个 BitBtn控件。把 BitBtn控件的 Kind属性设

置为 bkRetry,并 Caption属性设置为刷新,刷新以便重新显示图形。 3.在 Radiogroup1控件的 Items属性里分行填入圆、椭圆、圆角矩形、圆角正方形等,并

把 Radiogroup1控件 Caption属性设置为图形。在 Radiogroup2控件的 Items属性里分行填入红色、绿色、蓝色、黄色等,再把 Radiogroup2控件 Caption属性设置为颜色。

国 Delphi 7控件实用程序设计 100例

– 84 –

最后完成界面如图 28-4所示。

图 28-4 设计期界面

二、源代码及注释 主要代码如下: procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

if radiogroup1.ItemIndex =0 then

shape1.Shape :=stcircle //圆形

else if radiogroup1.ItemIndex =1 then

shape1.Shape :=stellipse //椭圆形

else if radiogroup1.ItemIndex =2 then

shape1.Shape :=stroundrect //圆角矩形

else

shape1.Shape :=stroundsquare; //圆角正方形

end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin

if radiogroup2.ItemIndex =0 then

begin

shape1.Pen.Color :=clnavy ; //设置轮廓边的颜色

shape1.Brush.Style :=bsclear; //设置填充的类型

shape1.Brush.Color :=clred; //设置填充的颜色

end

else if radiogroup2.ItemIndex =1 then

begin

shape1.Pen.Color :=clblue;

shape1.Brush.Style :=bsfdiagonal;

shape1.Brush.Color :=clgreen;

end

else if radiogroup2.ItemIndex =2 then

第二篇 图形处理国

– 85 –

begin

shape1.Pen.Color :=clred;

shape1.Brush.Style :=bshorizontal;

shape1.Brush.Color :=clblue;

end

else

begin

shape1.Pen.Color :=cllime;

shape1.Brush.Style :=bsvertical;

shape1.Brush.Color :=clyellow;

end

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

{当点击刷新时,shape控件返回程序启动时的原样.包括它的填充颜色、类型、画笔轮廓的颜色等}

radiogroup1.ItemIndex :=-1;

radiogroup2.ItemIndex :=-1;

shape1.Brush.Color :=clwhite;

shape1.Brush.Style :=bssolid;

shape1.Pen.Color :=clblack;

shape1.Pen.Mode :=pmcopy;

shape1.pen.style:=pssolid;

shape1.Shape :=strectangle;

end;

实例 29 StringGrid——图块网格 实例效果 本例编写了一个拼图游戏,使用 StringGrid控件来显示图块。把一张完整的图分成很多小

块并打乱,然后就可以用鼠标点击小的图块,把它拼成一张完整的图。为了提示游戏者,可以

把每一小块图编号。拼图的同时记下所用的时间,以便排名次。可以自己任意选择一幅图形打

乱之后进行拼图。运行界面如图 29-1、图 29-2所示。

图 29-1 效果图(1)

国 Delphi 7控件实用程序设计 100例

– 86 –

图 29-2 效果图(2)

控件说明 1.StringGrid控件主要属性如表 29-1所示。

表 29-1 控件主要属性 属性 作用 本例设置 备注

Cells 指示栅格中的单元 在代码里设置 Cols 代表栅格中某一列 在代码里设置 Rows 代表栅格中某一行 在代码里设置 ColCount 指示栅格中的列数 5 FixedCols 用于设置固定列的列数 0 Options 栅格选项,规定显示或动作行为等 false 总共有 15项,如下:

goFixedVerline goFixedHorzLine goVerLine goHorzLine goDrawFocusSelected goRowSizing goColSizing goRowMoving goEditiong goTabs goRowselect goAlwaysShowEditor goThumbTracking goRangSelect goColMoving

ScrollBar 该属性是用于设置栅格的滚动条 ssNone 有四种设置,

ssNone 不设置滚动条

ssBoth 控件同时有水平和垂直滚动条

ssHorizontal 水平滚动条 Ssvertical 垂直滚动条

Canvas 画布属性 在代码里设置

2.该控件主要方法。 refresh:刷新。

第二篇 图形处理国

– 87 –

3.该控件主要事件。 DrawCell:当需重新画单元格时,触发该事件。 SelectCell:在单元格将被选择时,发生该事件。 4.控件性质:该控件为 Delphi自带控件(在 Additional组件页)。 注意:StringGrid控件的 FixedCols和 FixedRows属性一定要设为 0,ScrollBars属性也要设为 ssNone,否则的话,就会有栅格。另外可以取消每个图片里的数字,以增加难度。Image2的作用是显示完整的图片,用以提示游戏者.

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,首先在 Form1上添

加一个 StringGrid1控件(Additional组件页)。 2.在窗体上放置 5个 SpeedButton、5个 label控件、5个 Image控件、1个 Timer、1个

ColorDialog控件、1个 OpenPictureDialog1控件和 1个 Panel控件,其中把 Image2放入 Panel。 3.设置StringGrid控件的ColCount属性为 4,FixedCols和FixedRows属性为 0 ,ScrollBars属

性为 ssNone。Panel控件的 bevelOuter属性为 bvraised,把显示数字的 SpeedButton控件的 Down属性设置为 True,最后在 Image1控件的 Picture属性中载入一幅图片。 其余详细设置见本书光盘,完成界面如图 29-3所示。

图 29-3 设计期界面

二、源代码及注释 procedure TForm1.Timer1Timer(Sender: TObject);

begin

count:=count+1;//自动增加.

label3.caption:='时间:'+inttostr(count div 60)+'分'+inttostr(count mod 60)+'秒';//显示所用时间

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

begin

if (acol<6) or (arow<1) then begin

stringgrid1.Canvas.Brush.Style:=bsDiagCross;//定义 stringgrid画刷的类型.

国 Delphi 7控件实用程序设计 100例

– 88 –

stringgrid1.canvas.brush.Color:=clblue;//定义 stringgrid画刷的颜色.

stringgrid1.Canvas.fillrect(rect);

if stringgrid1.Cells[acol,arow]<>'0' then

stringgrid1.Canvas.CopyRect(rect,image1.canvas,bounds(((strtoint(stringgrid1.cells[acol,arow])-1) mod

6)*60,((strtoint(stringgrid1.cells[acol,arow])-1) div 6)*60,60,60));

if speedbutton5.down then

stringgrid1.Canvas.TextOut(rect.left+2,rect.top+2,stringgrid1.cells[acol,arow]);

end else begin

stringgrid1.Canvas.Brush.Style:=bsDiagCross;

stringgrid1.canvas.brush.Color:=clblue;

stringgrid1.Canvas.fillrect(rect);

end;

end;

//当拼完图形,就会提示保存

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

var st:string;

begin

if speedbutton3.Down then begin

changit(acol,arow);

if winit then//调用 winit函数.

begin

speedbutton3.Down:=false;

n4.checked:=false;//N4不选中

timer1.Enabled:=false;//时间停止

messagebox(handle,pchar('您真是太棒了!'+#13+'共用了'+inttostr(count div 60)+'分'+inttostr(count

mod 60)+'秒'),'拼图',0);

if InputQuery('请输入您的大名:','您的姓名:',st) then

begin

readrecord; //调用的是 readrecord过程

if st='' then st:='未名';

uprecord(st,count);//调用的是 uprecord过程

writerecord;//调用的是 writerecord过程

end;

count:=0;

label3.caption:='时间:0分 0秒';

end;

end;

end;

第二篇 图形处理国

– 89 –

实例 30 Timer用法

实例效果 本例使用 7个 Timer控件来实现霓虹灯的效果。字体依次显示出来,同时字体的背景色和

颜色都随机地变换,效果很像街道上的霓虹灯,如图 30-1、图 30-2、图 30-3所示。

图 30-1 效果图(1)

图 30-2 效果图(2) 图 30-3 效果图(3)

控件说明 1.本例主要讲解了 Timer控件,该控件主要属性如表 30-1所示。

表 30-1 控件主要属性 属性 作用 本例设置 备注

Enabled 激活定时器 Timer1和 Timer7的 Enabled属性设为 true,其余设为 false

Interval 二次 Timer事件时间间隔值,以毫秒为单位

Timer7设为 1000,其余的设为 5

注意:如果该属性设为

0,表示禁止定时器 Tag 它能被用于存储附加的整数值 0

2.该控件主要方法。 Create:构造函数,创建并初始化一个定时器控件。它初始化以下内容。 设置 Enabled属性为真。 设置 Interval属性为 1000。 分配一个窗口句柄。

Destroy:析构函数。销毁定时器控件,释放内存。

国 Delphi 7控件实用程序设计 100例

– 90 –

3.该控件主要事件。 OnTimer:当定义的时间间隔到后,触发该事件。 4.控件性质:该控件为 Delphi自带控件(在 System组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加七

个 Timer控件(System组件页),其中 Timer1和 Timer7的 Enabled属性设为 true,其余设为false。Timer7的 Interval 属性设为 1000,其余的设为 5。

2.在窗体上放置 6个 Label控件,它们的 Caption属性依次设置为 D、E、L、P、H、I。 最后完成界面如图 30-4所示。

图 30-4 设计期界面

二、源代码及注释 procedure TForm1.Timer1Timer(Sender: TObject);

begin

if label1.Left>15 then //字左边距离大于 15

label1.Left:=label1.Left-5

else

begin

timer1.Enabled:=false; //timer1控件停止使用

timer2.Enabled:=true; //timer2控件使用

end;

end;

// timer2 、timer3 、timer4 、timer5 、timer6代码类似

procedure TForm1.Timer2Timer(Sender: TObject);

begin

if label2.Left>70 then

label2.Left:=label2.Left-5

else

begin

第二篇 图形处理国

– 91 –

timer2.Enabled:=false;

timer3.Enabled:=true;

end;

end;

procedure TForm1.Timer3Timer(Sender: TObject);

begin

if label3.Left>128 then

label3.Left:=label3.Left-5

else

begin

timer3.Enabled:=false;

timer4.Enabled:=true;

end;

end;

procedure TForm1.Timer4Timer(Sender: TObject);

begin

if label4.Left>186 then

label4.Left:=label4.Left-5

else

begin

timer4.Enabled:=false;

timer5.Enabled:=true;

end;

end;

procedure TForm1.Timer5Timer(Sender: TObject);

begin

if label5.Left>244 then

label5.Left:=label5.Left-5

else

begin

timer5.Enabled:=false;

timer6.Enabled:=true;

end;

end;

procedure TForm1.Timer6Timer(Sender: TObject);

begin

if label6.Left>302 then

label6.Left:=label6.Left-5

else

国 Delphi 7控件实用程序设计 100例

– 92 –

begin

timer6.Enabled:=false;

end;

end;

procedure TForm1.Timer7Timer(Sender: TObject);

begin

label1.Color:=random(450000); //字的背景颜色随机产生

label2.Color:=random(300000);

label3.Color:=random(450000);

label4.Color:=random(350000);

label5.Color:=random(300000);

label6.Color:=random(450000);

label1.Font.Color:=random(30000); //字体的颜色随机产生

label2.Font.Color:=random(35000);

label3.Font.Color:=random(45000);

label4.Font.Color:=random(30000);

label5.Font.Color:=random(35000);

label6.Font.Color:=random(45000);

end;

实例 31 Layer——分层图形 实例效果 本例使用 Layer控件组,实现类似 Photoshop 的层的效果,如图 31-1所示。

图 31-1 效果图

控件说明 本例主要讲解了 Layer控件组,该控件组包括 4个控件 :Layer、ImageLayer、

第二篇 图形处理国

– 93 –

ButtonLayer、ImageLibrary,Layer 控件设置分层容器,ImageLayer 控件设置分层图形,ButtonLayer控件设置分层按钮,ImageLibrary提供图形库。

1.ImageLayer主要属性如表 31-1所示。

表 31-1 控件主要属性 属性 作用 本例设置 备注

Image 加载图形 ImageAlign 图形对齐方式 aCenter 注意:如果该属性设为 0,表示禁止定时器 MaskImage 蔗罩图形 0 Scale 填充方式 jsFullSize 共 4 种:jsFullSize、jsEighth、jsHalf、jsQuarter

2.该控件主要方法。 Create:构造函数,创建并初始化控件。它初始化以下内容: 设置 Enabled属性为真。 分配一个窗口句柄。

Destroy:析构函数。销毁控件,释放内存。 RGBChannel:设置 RGB图形通道,这也是此控件最有用的方法之一。 3.该控件主要事件。 MaskImage :当蔗罩图形定义时,触发该事件。 4.控件性质:Layer控件组是免费性的第三方控件。 5.下载地址:http://www.51Delphi.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 ImageLayer控件,设置其 Scale属性为 jsFullSize,在 Image属性上加载一幅图片。添加六个 ButtonLayer控件。

2.添加一个 Layer 控件,在其上添加一个 ImageLayer 控件,设置其 Scale 属性为jsQuarter,在 Image属性上加载一幅图片。

其余详细设置见本书光盘,最后完成界面如图 31-2所示。

图 31-2 设计期界面

国 Delphi 7控件实用程序设计 100例

– 94 –

二、源代码及注释 unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Layers, jpeg;

type

TForm1 = class(TForm)

ImageLayer1: TImageLayer;

ButtonLayer1: TButtonLayer;

ButtonLayer2: TButtonLayer;

ButtonLayer3: TButtonLayer;

ButtonLayer4: TButtonLayer;

ButtonLayer5: TButtonLayer;

ButtonLayer6: TButtonLayer;

Layer1: TLayer;

ImageLayer2: TImageLayer;

procedure ButtonLayer1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ButtonLayer1Click(Sender: TObject);

begin

Caption := Caption + '+'; //单击按钮时窗口标题变化

end;

end.

实例 32 AMClock——图形时钟 实例效果 本例使用 AMClock控件,编写了一个图形时钟,计时精度可以随意调整,还可以更换时

钟的背景图形,如图 32-1所示。

第二篇 图形处理国

– 95 –

图 32-1 效果图

控件说明 1.AMClock控件主要属性如表 32-1所示。

表 32-1 控件主要属性 属性 作用 本例设置 备注

Picture 加载时钟的背景图形 HoursHand 设置时针属性 BackRadius: 指针反向伸出长度

Color:指针颜色 Radius: 指针半径 Whidth:指针宽度

MinutesHand 设置分针属性 SecondsHand 设置秒针属性 Interval 时针精度设置 250

2.该控件主要方法。 Create:构造函数,创建并初始化控件。它初始化以下内容: 设置 Enabled属性为真。 取得系统时间。

Destroy:析构函数。销毁控件,释放内存。 3.该控件主要事件。 OnTime:一个时间事件发生时。 OnHour:小时变化时,触发该事件。 OnMinute:分钟变化时,触发该事件。 OnSecond:秒钟变化时,触发该事件。 4.控件性质:AMClock控件是免费性的第三方控件。 5.下载地址:http://www.51Delphi.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

国 Delphi 7控件实用程序设计 100例

– 96 –

个 AMClock控件,在 Picture属性上加载一幅图片。 2.添加一个 TrackBar控件,设置Max属性为 1000。 其余详细设置见本书光盘,最后完成界面如图 32-2所示。

图 32-2 设计期界面

二、源代码及注释 unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, AMClock, ComCtrls, StdCtrls;

type

TForm1 = class(TForm)

AMClock1: TAMClock;

TrackBar1: TTrackBar;

Label1: TLabel;

procedure TrackBar1Change(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

第二篇 图形处理国

– 97 –

implementation

{$R *.dfm}

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

AMClock1.Interval:= TrackBar1.Position;//调整精度

end;

实例 33 ScreenCapture——屏幕抓图

实例效果 读者可能用过屏幕截图软件,或使用过键盘上的“Print”键来截图吧!本例为大家介绍

Delphi 第三方控件 ScreenCapture,它是一个很好的截图控件,可以轻松抓取任意大小(全屏当然行)、任意位置的图形,还可以设置所截图像的形状以及截图模式。本实例演示的是用

TcmWindow 模式截图。首先启动程序,点击“Start Capture!”按钮,程序自动最小化,鼠标移动到哪儿,它会自动判断所截区域,并且该区域显示出红色边框,比如要截取 Delphi 的控件栏,鼠标移动到控件栏,控件栏周围自动显示出红色边框,并自动提示截取的方法是

“Ctrl+Click=Capture”,如图 33-2,即按下“Ctrl”键再点击红色区域内的任何地方,都可把区域的图形截获,运行效果如图 33-3、图 33-4、图 33-5所示。

图 33-1 运行效果图

图 33-2 显示出红色边框

国 Delphi 7控件实用程序设计 100例

– 98 –

图 33-3 图形截取

图 33-4 设置所截图像的形状

图 33-5 设置所截图像的形状

控件说明 1. ScreenCapture控件主要属性如表 33-1所示。

第二篇 图形处理国

– 99 –

表 33-1 ScreenCapture控件主要属性 属性 作用 本例设置 备注

version 显示版本信息 在代码里设置 CaptureMode 截取屏幕的模式 TcmWindow TcmFixedRegion//固定区域

TcmFreeRegion//自定义区域 TcmWindow//全屏区域

ApplicationMinimize 应用程序是否最小化 True True or False SaveToFile 保存图像 False True or False Shape 截取图像的形状 TisRectangle

tisLeftPaperEgde tisEllipse

TisAutoShape//自动设置图形 tisEllipse//椭圆 tisLeftPaperEgde//左边撕裂 tisRectangle//矩形 tisRightPaperEgde右边撕裂 tisRoundRect//圆角矩形

ImageShadow 是否显示图像影子 True True Or False CursorShadow 是否显示鼠标影子 False True Or False Image 设置图像显示的地方 Image1

2.该控件主要方法。 Start:开始截取屏幕。 Stop:停止截取图像。 DLLAvailable:截取屏幕使用的通用动态库"ectntcap.dll"被载入。 3.该控件主要事件。 OnCaptureSuccess:当截取屏幕成功时,此事件发生。 OnCapture Error:当错误发生(没有足够的内存支持截取屏幕)时,此事件发生。 OnUserCancelled:当用户按“Esc”键,即取消屏幕截取时,此事件发生。 4.控件性质: ScreenCapture控件是免费性的第三方控件。 5.下载地址:http://www.51Delphi.com/。

制作步骤 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置一个 ScrollBox 控件,在它之上添加一个 Image 控件;向窗体添加一个

Panel控件,在它之上添加一个 Button控件,其 Caption属性设为“BtnStart”。 3.向窗体上放置一个 ScreenCapture控件,其 ImageShadow属性设为 True,其 CursorShadow

属性设为 False,其 SaveToFile 属性设为 False,其 ApplicationMinimize 属性设为 True,其CaptureMode 属性设为 TcmWindow ,其 Shape 属性依次设为 TisRectangle、tisEllipse 和tisLeftPaperEgde,其 Image属性连接到 Image1,详细设置请参见光盘,最后完成界面如图 33-6所示。

国 Delphi 7控件实用程序设计 100例

– 100 –

图 33-6 设计期界面

二、源代码及注释 procedure TForm1.BtnStartClick(Sender: TObject);

begin

ScreenCapture1.start;//开始截图

end;

//当截取屏幕成功时,此事件发生

procedure TForm1.ScreenCapture1Capture(Sender: TObject; Bitmap: TBitmap);

begin

Scrollbox1.HorzScrollBar.Range := Image1.width;

Scrollbox1.VertScrollBar.Range := Image1.height;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

BtnStart.enabled := ScreenCapture1.dllavailable; //载入 ectntcap.dll文件

caption := 'T.N.T Screen Capture DLL Version ' + ScreenCapture1.version; //显示版本信息

end;

//当没有足够的内存支持截取屏幕时,此事件发生

procedure TForm1.ScreenCapture1Error(Sender: TObject);

begin

MessageDlg('An error occured during screen capture! Please close other programs to make more

memory available.mtError, [mbOK], 0);

end;

//当用户按"Esc"键,即取消屏幕截取时,此事件发生

procedure TForm1.ScreenCapture1UserCancelled(Sender: TObject);

begin

MessageDlg('User cancelled screen capture.',

mtInformation, [mbOK], 0);

end;

第三篇 多媒体

多媒体技术作为计算机技术发展的潮流和趋向之一,是任何一种编程语言都不可忽视的。

Delphi 7控件技术的优势在多媒体处理技术上表现也相当突出。使用Delphi 7多媒体控件技术,可以方便地设计出播放 WAV、AVI、MIDI、MPEG 等文件的播放器,几乎可以播放所有主流多媒体文件,可以实现高级的三维动画、TTS 语音引擎、图像特效等。相关操作技术简洁明了,代码开发效率高,周期短,易于维护与升级。 本部分将重点介绍 Delphi 7 多媒体处理技术,讲述如何利用 MediaPlay、GLVisir、

TTSEnglish、AbcEffectsImage 等 Delphi 7 丰富的多媒体控件设计多媒体播放程序、三维动画程序、TTS语音引擎、制作图像特效集合等。同时还为读者提供了 Delphi 7多媒体处理的其他一些常用技巧,使读者对 Delphi 7多媒体控件技术有较深刻的理解。

本部分主要有以下精彩内容:

MediaPlay——多媒体播放;

GLVisir——三维动画;

TTSEnglish——TTS语音引擎;

AbcEffectsImage——图像特效集合。

国 Delphi 7控件实用程序设计 100例

– 102 –

实例 34 MediaPlay——多媒体播放

实例效果 本例使用MediaPlay控件,制作了一个多媒体播放器,具有编写代码简单、方便、快捷等

优点。该控件由一组控件按钮组成,如播放、暂停、退出、重播等。该控件可以控制多种多媒

体设备,如 CD-ROM 驱动器、VCR 等。本例使用 Panel 控件来显示图像,程序运行时,MediaPlay

控件设为不可见。播放画面非常流畅,效果很好,如图 34-1、图 34-2、图 34-3所示。

图 34-1 效果图(1)

图 34-2 效果图(2) 图 34-3 效果图(3)

控件说明 本例主要讲解了 MediaPlay 控件,在程序中使用 MediaPlayer 控件,可以避免与复杂的

MCI 接口打交道,这就使我们的程序更加简单明了,同时又能充分发挥处在Windows 下开发多媒体程序的优越性。mediaPlayer 控件为我们提供了与Windows MCI驱动程序的接口,这样,只要在 Windows 系统中安装了某种文件的 MCI 驱动程序,就可以用 MediaPlayer 控件来播放了。

MediaPlayer组件主要是用于控制MCI(MediaControlInterface)设备,该控件对 CD 播放、AVI 影片播放、Fic、Fli 动画文件、Midi 音乐文件播放与Wave 声音播放文件录入等功能全

第三篇 多媒体国

– 103 –

部都可以轻松地实现。 1.该控件主要属性如表 34-1所示。

表 34-1 控件主要属性 属性 作用 本例设置 备注

AutoEnable 确定是否自动激活和禁止控件的个别按钮 AutoRewind 画笔,指定画轮廓线的笔 ColoredButtons 确定那些按钮具有颜色 EnabledButtons 设置当前那些按钮可用或不可用 FileName 用于指定要播放的媒体文件名 Mode 返回设备的当前状态 VisibleButtons 用于设置媒体播放器,那些按钮是否显示 TimeFormat 用于设置一些属性的时间格式

DeviceID 设备的标识 ID

DeviceType 指定要打开设备的类型 Autoselect 根据 Filename 中所指定的文件类型自

动对应媒体设备 AutoOpen 设置是否自动打开设备。决定在程序执行时,使某

一媒体设备自动处于打开状态 False

Open 打开设备(是否打开一设备)

Display 决定当媒体播放时,显示的区域在哪个控制控件上

2.主要事件。 OnClick:单击事件。 OnEnter:激活这一控件之后发生。 OnExits:退出时产生。 OnNotify:执行各功能时发生。 3.主要方法。 Open 方法:用于打开一个多媒体设备。在调用该方法之前,必须确保在 MediaPlayer 组

件的 DeviceType(设备类型)属性中设定正确的多媒体设备类型。 Save方法:用于将当前装入的媒体内容保存到由 FileName属性指定的文件中。对于不能

用媒体存取的设备(如 Videodiscs),Save方法被忽略。 Rewind方法:用于设定当前位置到媒体的开始处,也就是用 Start属性保存的值的位置。 Resume方法:用于重新开始播放或录制当前被暂停的多媒体设备。 Close方法:用于关闭当前已打开的多媒体设备。 PauseOnly方法:仅仅用于暂停多媒体设备,如果该设备已经暂停,则当 PauseOnly方法

被调用时,设备仍旧保持暂停状态。 Open方法:打开设备。 Play方法:开始播放多媒体。 注意:使用 Play方法播放多媒体文件时,必须首先调用 Open方法,打开设备;停止播放多媒体文件时,需要调用 Close方法关闭设备,以便别的程序可以使用多媒体播放设备。

国 Delphi 7控件实用程序设计 100例

– 104 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,首先在 Form1上添

加一个MediaPlay控件(System组件页)。 2.在窗体上放置一个 Panel 控件、一个 DriveComboBox1 控件、一个 FilterComboBox1

控件、一个 DirectoryListBox1控件、一个 FileListBox1控件和两个 BitBtn控件。 3.把 FilterComboBox1 控件的 FileList 属性连接到 FileListBox1,同时它的 Filter 属性只

设置*.wav 、*.avi和*.mid三种文件格式。再把 DirectoryListBox1控件的 fileList 属性连接到FileListBox1,DriveComboBox1 控件的 DirList 属性连接到 DirectoryListBox1,最后就是把FileListBox1的Mask属性设为*.wav;*.avi;*.mid。 最后完成界面如图 34-4所示。

图 34-4 设计期界面

二、源代码及注释 //首先在 private定义:

FileExt:String[4];{存放文件扩展名}

procedure TMainForm.FileListBox1Click(Sender: TObject);//选择文件播放

begin

FileExt:=AnsiLowerCase(ExtractFileExt(FileListBox1.FileName));//文件扩展名小写化

if FileExt='.wav' then {是声音}

begin

Panel1.Caption:='播放声音';

MediaPlayer1.Close;

MediaPlayer1.FileName:=FileListBox1.FileName;//播放的文件名和选中的文件名相同。

MediaPlayer1.Open;//打开。

MediaPlayer1.Play;//开始播放。

end

else

if FileExt='.avi' then{是动画}

第三篇 多媒体国

– 105 –

begin

with MediaPlayer1 do

begin

Close;

display:=Panel1;{播放窗口}

FileName:=FileListBox1.FileName;

Panel1.Caption:='';

Open;

Rewind;

Play;

end;

end

else

if FileExt='.mid' then{是音乐}

begin

Panel1.Caption:='播放音乐';

MediaPlayer1.Close;

MediaPlayer1.FileName:=FileListBox1.FileName;

MediaPlayer1.Open;

MediaPlayer1.Play;

end;

end;

procedure TMainForm.BitBtn1Click(Sender: TObject);

begin

if FileListBox1.ItemIndex <>-1 then

begin

mediaplayer1.Rewind;//返回。

MediaPlayer1.Play;

end

else

messagedlg('请选择你要播放的文件!',mtwarning,[mbyes],0);

end;

实例 35 Animate——播放 AVI文件 实例效果 本例使用 Animate 控件,演示了播放动画的效果,如图 35-1所示。

国 Delphi 7控件实用程序设计 100例

– 106 –

图 35-1 效果图

控件说明 本例主要讲解了 Animate控件,Animate控件用于播放 AVI文件,其功能比较简单,该控

件位于 Delphi 7的Win32面板,通过该控件的 FileName特性指定一个 AVI文件,然后调用有关的方法,即可以播放。

1.该控件主要属性如表 35-1所示。 表 35-1 控件属性

属性 作用 本例设置 备注 Active 确定是否将播放 AVI剪辑 在代码里设置 Center 确定是否 AVI的画面在动画控制的中央 alclient CommonAVI 确定是否播放由 Shell32.dll提供的公共

Windows AVI剪辑 在代码里设置

FileName 指定 AVI文件名.该文件必须包括无声的AVI剪辑

在代码里设置

FrameCount 返回 AVI文件的总帧数 在代码里设置 Timers 指示播放 AVI画面时,是否采用定时器 false StartFrame 指定播放时的开始帧 0

StopFrame 指定播放时的结束帧 12

Transparent 指示背景是否透明 true

2.该控件主要方法。 Play方法:设置播放指定范围内的帧。 调用格式: Animate1.Play (0, Animate1.FrameCount, 1); 使用 Play方法,其中’0’表示起始帧, Animate1.FrameCount定义了结束帧,’1’表示重复次数。 Stop方法:停止播放。 Seek方法:指定一个帧。 注意:Animate控件只能用于播放 AVI文件,如果需要对其他类型的媒体文件进行操作应使用MediaPlayer控件。

第三篇 多媒体国

– 107 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 1

个 Animate控件。 2.加入 1个 OpenDialog控件,设置 Filter属性为 avi|*.avi。 3.加入 3个 Button控件,设置 Caption属性分别为 btnOpen、btnPlay、btnStop。 4.加入 1个 UpDown控件和 1个 Edit控件。设置 UpDown控件的 AssoCiate属性为 Edit

控件。 5.加入 1个 Label控件。 完成界面如图 35-2所示。

图 35-2 设计期界面

二、源代码及注释 //播放 AVI文件

procedure TForm1.btnPlayClick(Sender: TObject);

begin

Animate1.Play(StrToInt(edtEdit1.Text), Animate1.FrameCount, 1);//从加减控制制定的位置进行播放

btnPlay.Enabled := false;

btnStop.Enabled := Enabled;

btnOpen.Enabled := false;

end;

//打开 AVI文件

procedure TForm1.btnOpenClick(Sender: TObject);

begin

if odgOpenDialog1.Execute then

begin

国 Delphi 7控件实用程序设计 100例

– 108 –

Animate1.FileName := odgOpenDialog1.FileName;

btnOpen.Enabled := false;

btnPlay.Enabled := true;

udUpDown1.Max := Animate1.FrameCount;//设置加减控制的最大范围为 AVI文件的帧数

udUpDown1.Min := 0;

end

else

btnStop.Enabled := false;

end;

//初始化按钮

procedure TForm1.FormCreate(Sender: TObject);

begin

btnPlay.Enabled := false;

btnStop.Enabled := false;

btnOpen.Enabled := true;

end;

//停止播放

procedure TForm1.btnStopClick(Sender: TObject);

begin

Animate1.Stop;

btnStop.Enabled := false;

btnOpen.Enabled := True;

if Animate1.FileName <> '' then

btnPlay.Enabled := true

else

btnPlay.Enabled := false;

end;

实例 36 GIFImage——GIF动画制作与显示

实例效果 GIF动画是当今应用最广泛的动画格式,以其文件小、背景可透明等优秀特点而在网页上

广为应用。GIF动画制作与显示也成为一项专用的技术,有不少专业 GIF动画制作软件,这里介绍的第三方控件 GIFImage,仅用简短的代码就轻松实现了 GIF动画制作与显示,并且可以实现设置 GIF颜色数、AVI转化 GIF、BMP与 GIF相互转化、GIF动画、从资源文件中提取GIF动画等功能,图 36-1、图 36-2、图 36-3所示分别演示了如何生成、保存 GIF动画。

第三篇 多媒体国

– 109 –

图 36-1 效果图(1) 图 36-2 效果图(2)

图 36-3 保存 GIF文件

控件说明 1. GIFImage控件主要属性如表 36-1所示。 表 36-1 控件属性

属性 作用 本例设置 备注 AutoSize 自动缩放 False

Proportional 比例缩放 True *

Stretch 拉伸 False

Transparents 透明 False

2.该控件事件、方法请参阅示例文件(Demo)使用方法。 3.控件性质: 该控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.playicq.com/。 注意:使用 GIFImage 控件特别需要注意的是属性表备注栏中带“*”号的属性项,它们对本控件作用的正常实现至关重要,其中 Proportional 必须设置为 True ,才能起到比例缩放的功能。另外,该控件示例文件(Demo)包括 GIF颜色数、AVI转化GIF、BMP与 GIF相互转化、GIF动画、从资源文件中提取、GIF动画浏览等程序,图 36-4所示为 GIF动画参数浏览器,可以将 GIF头文件中所包含的格式、颜色数、调色板等参数一目了然地显示出来。

国 Delphi 7控件实用程序设计 100例

– 110 –

图 36-4 GIF动画参数浏览器

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 ScrollBox控件(Additional组件页),然后在其上添加 6个 Image控件(Additional组件页),依次排列,并将其 Picture属性上分别加入 6幅类似图形。

2.在 Form1上添加 3个 Panel控件(Standard组件页),名称分别为 Panel、Pane2、Pane3,其中 Pane2、Pane3放置在 Panel之上,然后在 Pane2上添加 2个按钮控件(Standard组件页)、1个 SaveDialog控件(Dialog组件页);在 Pane3上添加 1个 Image控件(Additional组件页)。 最后完成界面如图 36-5所示。

图 36-5 设计期界面

二、源代码及注释 完整编译代码略,详见本书光盘。

第三篇 多媒体国

– 111 –

实例 37 GLVisir——三维动画

实例效果 本例主要讲解了 Glvisir 控件,Glvisir 控件主要用于播放动画和显示静态场景,该控件使

用 OpenGL技术描述三维动画场景,是三维图像表面设计和三维动画制作的好工具。效果如图37-1所示。

图 37-1 效果图

控件说明 本例主要讲解了 Glvisir控件的用法,GLVisir控件是一个集成了很多按钮、面板、对话框

的庞大控件,该控件具有以下特点: 三维对象的每一幕都可以旋转、缩放、移动;在运行时可以改变显示风格;完善动画播放

功能界面,即时显示动画;可以存储 3D场景;调整背景颜色;设置透明属性;显示坐标轴。 该控件封装了大量功能,使用比较方便。在控件中定义了动画的播放、停止、前进、后退、

循环播放按钮,还可以调节播放速度。 1.该控件主要属性如表 37-1所示。 表 37-1 控件属性 属性 作用 本例设置 备注

Caption 在控件顶端的面板上显示的字符串 演示程序

BackgroundColor 背景颜色 ClBack

Style 设置画多边形的方法

Wired:只画边界

Filled:用一种颜色填充多边形

Combined:混合使用

国 Delphi 7控件实用程序设计 100例

– 112 –

续表

属性 作用 本例设置 备注 AxisNamesColor 定义坐标轴名称的字符的颜色

AxixXName X轴名称

AxixYName Y轴名称

AxixZName Z轴名称

2.该控件主要方法。 Clear:清除之前加入的所有帧。 AddModelToNewFrame:在新的帧中间加入新的模式。 AddModelToFrame:在已经存在的帧中间加入新的模式。 Fit:放缩使所有的帧调节到合适的大小。 Update:重画。 3.控件性质:该控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.aidaim.com。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程 2.在 Form1上添加 Panal控件、工具条及按钮组、滑动条、下拉列表,个数及设置详见

本书光盘。 3.加入一个 GLVisir控件、两个 button控件。 完成界面如图 37-2所示。

图 37-2 设计期界面

二、源代码及注释 //创建金字塔形(锥体)

第三篇 多媒体国

– 113 –

procedure TForm1.SingleBtnClick(Sender: TObject);

var mdl:TModelRec; //定义 3D模式

begin

mdl.nv := 5; // 5 个顶点

SetLength(mdl.v,mdl.nv); //给顶点分配内存

mdl.np := 5; // 5 面体

SetLength(mdl.p,mdl.np); // 给多面体分配内存

//-填充记录

//---多边体的顶点---

mdl.v[0].x := -1; mdl.v[0].y := -1; mdl.v[0].z := 0;

mdl.v[1].x := -1; mdl.v[1].y := 1; mdl.v[1].z := 0;

mdl.v[2].x := 1; mdl.v[2].y := 1; mdl.v[2].z := 0;

mdl.v[3].x := 1; mdl.v[3].y := -1; mdl.v[3].z := 0;

mdl.v[4].x := 0; mdl.v[4].y := 0; mdl.v[4].z := 1;

//---多边体的面 ---

// 基面

mdl.p[0].numVertexes := 4; mdl.p[0].col := clRed;

mdl.p[0].n[0] := 0; mdl.p[0].n[1] := 1; mdl.p[0].n[2] := 2; mdl.p[0].n[3] := 3;

//--- 边面

mdl.p[1].numVertexes := 3; mdl.p[1].col := clRed;

mdl.p[1].n[0] := 0; mdl.p[1].n[1] := 1; mdl.p[1].n[2] := 4;

mdl.p[2].numVertexes := 3; mdl.p[2].col := clRed;

mdl.p[2].n[0] := 1; mdl.p[2].n[1] := 2; mdl.p[2].n[2] := 4;

mdl.p[3].numVertexes := 3; mdl.p[3].col := clRed;

mdl.p[3].n[0] := 2; mdl.p[3].n[1] := 3; mdl.p[3].n[2] := 4;

mdl.p[4].numVertexes := 3; mdl.p[4].col := clRed;

mdl.p[4].n[0] := 3; mdl.p[4].n[1] := 0; mdl.p[4].n[2] := 4;

// 删除存在的帧

GLVisir1.Clear;

// 增加新模式

GLVisir1.AddModelToNewFrame(mdl);

// 居中和大小缩放模式

GLVisir1.Fit(false, // 不移动正交坐标系的原点

false // 保持比例

);

end;

//创建动画帧序列

procedure TForm1.MultiBtnClick(Sender: TObject);

var mdl:TModelRec; //动画帧模式

国 Delphi 7控件实用程序设计 100例

– 114 –

i:integer;

begin

// 删除存在的帧

GLVisir1.Clear;

for i:=0 to 9 do

begin

//准备四面体

mdl.nv := 5;

SetLength(mdl.v,mdl.nv); // 分配内存

mdl.np := 5; // 5 Faces - polygons

SetLength(mdl.p,mdl.np); //分配内存

mdl.v[0].x := -1; mdl.v[0].y := -1; mdl.v[0].z := 0;

mdl.v[1].x := -1; mdl.v[1].y := 1; mdl.v[1].z := 0;

mdl.v[2].x := 1; mdl.v[2].y := 1; mdl.v[2].z := 0;

mdl.v[3].x := 1; mdl.v[3].y := -1; mdl.v[3].z := 0;

mdl.v[4].x := 0; mdl.v[4].y := 0; mdl.v[4].z := i;

//基面

mdl.p[0].numVertexes := 4; mdl.p[0].col := clRed;

mdl.p[0].n[0] := 0; mdl.p[0].n[1] := 1; mdl.p[0].n[2] := 2; mdl.p[0].n[3] := 3;

//边面

mdl.p[1].numVertexes := 3; mdl.p[1].col := clRed;

mdl.p[1].n[0] := 0; mdl.p[1].n[1] := 1; mdl.p[1].n[2] := 4;

mdl.p[2].numVertexes := 3; mdl.p[2].col := clRed;

mdl.p[2].n[0] := 1; mdl.p[2].n[1] := 2; mdl.p[2].n[2] := 4;

mdl.p[3].numVertexes := 3; mdl.p[3].col := clRed;

mdl.p[3].n[0] := 2; mdl.p[3].n[1] := 3; mdl.p[3].n[2] := 4;

mdl.p[4].numVertexes := 3; mdl.p[4].col := clRed;

mdl.p[4].n[0] := 3; mdl.p[4].n[1] := 0; mdl.p[4].n[2] := 4;

//增加新的帧

GLVisir1.AddModelToNewFrame(mdl);

mdl.nv := 5;

SetLength(mdl.v,mdl.nv);

mdl.np := 5;

SetLength(mdl.p,mdl.np);

mdl.v[0].x := -i; mdl.v[0].y := -i; mdl.v[0].z := 0;

mdl.v[1].x := -i; mdl.v[1].y := i; mdl.v[1].z := 0;

mdl.v[2].x := i; mdl.v[2].y := i; mdl.v[2].z := 0;

mdl.v[3].x := i; mdl.v[3].y := -i; mdl.v[3].z := 0;

mdl.v[4].x := 0; mdl.v[4].y := 0; mdl.v[4].z := -i;

第三篇 多媒体国

– 115 –

mdl.p[0].numVertexes := 4; mdl.p[0].col := clYellow;

mdl.p[0].n[0] := 0; mdl.p[0].n[1] := 1; mdl.p[0].n[2] := 2; mdl.p[0].n[3] := 3;

mdl.p[1].numVertexes := 3; mdl.p[1].col := clYellow;

mdl.p[1].n[0] := 0; mdl.p[1].n[1] := 1; mdl.p[1].n[2] := 4;

mdl.p[2].numVertexes := 3; mdl.p[2].col := clYellow;

mdl.p[2].n[0] := 1; mdl.p[2].n[1] := 2; mdl.p[2].n[2] := 4;

mdl.p[3].numVertexes := 3; mdl.p[3].col := clYellow;

mdl.p[3].n[0] := 2; mdl.p[3].n[1] := 3; mdl.p[3].n[2] := 4;

mdl.p[4].numVertexes := 3; mdl.p[4].col := clYellow;

mdl.p[4].n[0] := 3; mdl.p[4].n[1] := 0; mdl.p[4].n[2] := 4;

GLVisir1.AddModelToFrame(mdl,i);

end;

//居中和缩放模式

GLVisir1.Fit(false, //不要移动坐标系到 0点, 保持比例

false

);

end;

实例 38 TTSEnglish——TTS语音引擎 实例效果 TTS 是微软推出的语音朗读引擎,以往开发人员都是通过直接调用 TTS 的属性和方法来

实现语音朗读功能的,这需要用户对 TTS十分了解,TTSEnglish 给我们提供了使用 TTS的一个较好的途径,只需要调用 TTSEnglish 控件的属性和方法就可以方便地实现语音朗读功能。

控件说明 本例主要讲解了 TTSEnglish控件的用法,该控件封装了 TTS的属性和方法,用户不需要

了解 TTS的接口即可实现语音朗读功能。 1.该控件主要属性如表 38-1所示。 表 38-1 控件属性

属性 作用 本例设置 备注 Active 设置 TTS语音引擎为有效(注意:

你最好在运行期设置它为 True) True

Selected 选择的颜色值

Style 列表框的类型

StatusString 状态列表 StatusLabel 状态 Label EnginesCount 发音引擎个数 Speed 语音速度

国 Delphi 7控件实用程序设计 100例

– 116 –

续表

属性 作用 本例设置 备注 SpeedMin 语音最小速度 SpeedMax 语音最大速度 Pitch 发音频率 PitchMin 发音最小频率 PitchMax 发音最大频率 Volume 音量 VolumeMin 最小音量 VolumeMax 最大音量 EnginesList 发音引擎列表 EnginesIndex 选择语音引擎的序号 SpeakText 要读的文本

2.该控件主要方法。 Speak:朗读。AudioPause:暂停。AudioReset:重置。 3.控件性质:该控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://wind520.delphibbs.com/。 注意:在使用本控件之前请先安装 TTS 语音引擎,在 Delphi 中导入所需的 TTS 的ActiveX控件。TTS语音引擎一般在金山词霸等类软件中能够找到。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 TTSEnglish控件。 2.加入 Label控件、Memo控件、Edit控件、列表框及按钮,个数及设置详见本书光盘。 完成界面如图 38-1所示。

图 38-1 设计期界面

第三篇 多媒体国

– 117 –

二、源代码及注释 procedure TForm1.Button1Click(Sender: TObject);

var

i: integer;

begin

TTSEnglish1.Active := true;

j := TTSEnglish1.StatusString.Count - 1;

for i := 0 to TTSEnglish1.StatusString.Count - 1 do

memo1.lines.add(TTSEnglish1.StatusString.Strings[i]); //状态列表

label1.Caption := TTSEnglish1.StatusLabel; //状态 Label

label2.Caption := inttostr(TTSEnglish1.EnginesCount); //发音引擎个数

label3.Caption := inttostr(TTSEnglish1.Speed); //语音速度

label4.Caption := inttostr(TTSEnglish1.SpeedMin); //语音最小速度

label5.Caption := inttostr(TTSEnglish1.SpeedMax); //语音最大速度

label6.Caption := inttostr(TTSEnglish1.Pitch); //发音频率

label7.Caption := inttostr(TTSEnglish1.PitchMin); //发音最小频率

label8.Caption := inttostr(TTSEnglish1.PitchMax); //发音最大频率

label9.Caption := inttostr(TTSEnglish1.Volume); //音量

label10.Caption := inttostr(TTSEnglish1.VolumeMin); //最小音量

label11.Caption := inttostr(TTSEnglish1.VolumeMax); //最大音量

Combobox1.Items := TTSEnglish1.EnginesList; //发音引擎列表

Button1.Enabled := false;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

i: integer;

begin

TTSEnglish1.SpeakText := edit1.Text;

//要读的文本

TTSEnglish1.Speak; //读

label1.Caption := TTSEnglish1.StatusLabel;

for i := j to TTSEnglish1.StatusString.Count - 1 do

memo1.lines.add(TTSEnglish1.StatusString.Strings[i]);

j := TTSEnglish1.StatusString.Count - 1;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

var

i: integer;

begin

国 Delphi 7控件实用程序设计 100例

– 118 –

TTSEnglish1.EnginesIndex := ComboBox1.ItemIndex; //选择语音引擎的序号

label12.Caption := inttostr(TTSEnglish1.EnginesIndex);

for i := j to TTSEnglish1.StatusString.Count - 1 do

memo1.lines.add(TTSEnglish1.StatusString.Strings[i]);

j := TTSEnglish1.StatusString.Count - 1;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Button1Click(Sender);

end;

实例 39 NKImageForm——图形窗体

实例效果 本例演示了 NKImageForm控件的用法,该控件使窗体以图形的方式显示,而且该控件还

支持对窗体的拖放。效果如图 39-1所示。

图 39-1 效果图

控件说明 本例主要讲解了 NKImageForm控件的用法,该控件放置到一个窗体中后,通过相应的设

置可以使窗体以图形的方式显示,而且该控件还支持对窗体的拖放。 1.该控件主要属性如表 39-1所示。

表 39-1 控件属性 属性 作用 本例设置 备注

TransparentColor 设置图像的透明色 clBack

MoveForm 是否允许通过鼠标拖拉图像来移动窗体 true

AutoRender 设置当窗体创建或者改变时的着色方式 arColor

Picture 设置在窗体中显示的图像

2.该控件主要方法。 Render:以当前的 TransparentColor对窗体着色。

第三篇 多媒体国

– 119 –

调用格式: Render(color:tcolor):将 TransparentColor设为 color色,并对窗体着色 Render(x,y:integer):将 TransparentColor设为(x,y)处的像素值,并对窗体着色 3.控件性质:该控件为免费、提供全部源代码的第三方控件。 4.下载地址:联系 [email protected]

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

NKImageForml控件。 界面如图 39-2所示。

图 39-2 设计期界面

二、源代码及注释 此处略。

实例 40 IAgaloLED——有光晕的 LED面板

实例效果 LED 面板是程序中经常使用的功能,IAgaloLED 控件提供了 6 种形状,更为特别的是其

表面模拟了透明玻璃面板的显示效果,灯的周围可以生成各色光晕。在本例中通过下拉列表框

中的选择项改变 IAgaloLED 控件的形状。效果如图 40-1所示。

图 40-1 效果图

国 Delphi 7控件实用程序设计 100例

– 120 –

控件说明 本例主要讲解了 IAgaloLED 控件的用法,IAgaloLED 控件是单个 LED 灯型控件。它提供六

种不同外型,包括矩形、圆形、菱形、半圆、三角、梯形等,更为特别的是其表面模拟了透明

玻璃面板的显示效果,灯的周围可以生成各色光晕。该控件主要用于各种颜色和形状的 LED

的模拟显示。 1.该控件主要属性如表 40-1所示。

表 40-1 控件属性

属性 作用 本例设置 备注 LedPlasticColor 设定显示颜色 clLime

LedClass 设定显示形状

ialcTriangle 共 6种形状。

ialcRect:矩形

ialcRound:圆形

ialcRomb:菱形

ialcHalfCircle:半园形

ialcTriangle:三角形

ialcTrapezium:梯形

2.该控件无事件和方法。 3.控件性质:该控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.playicq.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 IAgaloLED控件。 2.加入一个下拉列表框,设置其Items属性为:矩形、圆形、菱形、半园、三角、梯形。 完成界面如图 40-2所示。

图 40-2 设计期界面

第三篇 多媒体国

– 121 –

二、源代码及注释 procedure TForm1.cbComboBox1Change(Sender: TObject);

begin

with IAgaloLED1 do

begin

case cbComboBox1.ItemIndex of

0: LedClass := ialcRect;

1: LedClass := ialcRound;

2: LedClass := ialcRomb;

3: LedClass := ialcHalfCircle;

4: LedClass := ialcTriangle;

5: LedClass := ialcTrapezium;

end;

end;

end;

实例 41 FcImage——图像特效

实例效果 本例使用 FcImage控件,对一幅图像采取多种特效处理,如浮雕、水平反转、垂直反转、

高斯模糊效果等,如图 41-1所示。

图 41-1 效果图

控件说明 本例主要讲解了 FcImage控件的用法,该控件是控件包 1stClass中的一个,能够方便地实

国 Delphi 7控件实用程序设计 100例

– 122 –

现一些图像特效。通过简单设置该控件的一些属性,即可实现一些优秀的图像特效处理效果。 1.该控件主要属性如表 41-1所示。

表 41-1 控件属性 属性 作用 本例设置 备注

AutoSize 设为 True时使 FcImage控件的尺寸与图像的尺寸一样大小

True

BitmapOption 设置对图像进行处理的不同方式的集合

DrawStyle 设置图像的贴图方式 dsNormal

Picture 设置所要显示的图像

SmoothStretching 设为 True时当图像伸展时将采用一种耗时更长的算法,这能大大提高显示效果

True

Transparent 设为 True时当 Image重画时将不画所指定的透明颜色

False

TransparentColor 当 Transparent设为 True时才使用此属性,由它设置图像中何种颜色可以被“看透”

clNone

2.主要方法、事件略。 3.控件性质:该控件为商业控件,是控件包 1stClass中的一个。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 FcImage控件。 2.加入 3个 RadioButton,设置其 Caption分别为浮雕、水平反转、垂直反转。 3.加入一个 TrackBar,用于设置高斯模糊效果。 4.加入一个 Button,用于执行复原功能。 完成界面如图 41-2所示。

图 41-2 设计期界面

第三篇 多媒体国

– 123 –

二、源代码及注释 //设置浮雕效果

procedure TForm1.rbFdClick(Sender: TObject);

begin

fcImager1.BitmapOptions.Embossed := rbFd.Checked;

end;

//设置水平反转

procedure TForm1.rbSpfzClick(Sender: TObject);

begin

fcImager1.BitmapOptions.HorizontallyFlipped := rbSpfz.Checked;

end;

//设置垂直反转

procedure TForm1.rbCzfzClick(Sender: TObject);

begin

fcImager1.BitmapOptions.VerticallyFlipped := rbCzfz.Checked;

end;

//设置高斯模糊效果

procedure TForm1.tbrTrackBar1Change(Sender: TObject);

begin

fcImager1.BitmapOptions.GaussianBlur := tbrTrackBar1.Position;

end;

procedure TForm1.btnButton1Click(Sender: TObject);

begin

with fcImager1.BitmapOptions do

begin

GaussianBlur := 0;

Embossed := false;

HorizontallyFlipped := False;

VerticallyFlipped := false;

end;

tbrTrackBar1.Position := 0;

end;

实例 42 ShockwaveFlash——播放 Flash动画

实例效果 本例使用 ShockwaveFlash控件,实现在 Delphi播放 Flash动画。效果如图 42-1所示。

国 Delphi 7控件实用程序设计 100例

– 124 –

图 42-1

控件说明 SWFlash.ocx是 ActiveX控件,ActiveX控件在Windows里是通用的,Visual Basic、Visual

Foxpro、Delphi等同样支持。 首先在 IE中要自动安装播放 Flash动画的 SWFlash.ocx,或在机器在中要装有 Flash播放

软件,这样 SWFlash.ocx 自动安装在系统内。该控件在 Win98 的$Windows\System\Macromed \Flash

目录下或者在WIN2000/WINXP的$Windows\System32\ Macromed\Flash目录下。 运行 Delphi后,选择菜单 Component→Import ActiveX Control,找到 SWFlash. ocx文件进

行安装。安装完成后,ActiveX面板里出现 ShockwaveFlash控件,这是 Delphi对 SWFlash. ocx的封装调用,现在就可以用这个控件来播放 Flash了。

1.该控件主要属性如表 42-1所示。 表 42-1 控件属性 属性 作用 本例设置 备注

ReadyState 读一个 flash文件时的状态,其中包括 0=Loading、1=Uninitialized、2=Loaded、3=Interactive和4=Complete

代码中设置

TotalFrames 总帧数,只有当 ReadyState = 4时才能访问该属性

FrameNum 当前播放的帧

Playing 播放或暂停一个 flash

Quality 指定当前渲染的质量,包括 0=Low, 1=High、2=AutoLow、3=AutoHigh

ScaleMode 缩放模式,0=ShowAll、1= NoBorder、2 = ExactFit

AlignMode 对齐模式,Left=+1、Right=+2、Top=+4、Bottom=+8

BackgroundColor 背景色,-1为默认颜色

Loop 是否循环

Movie 指定播放的 flash文件路径,可以为一个 URL

ScaleMode 缩放模式,0=ShowAll、1= NoBorder、2 = ExactFi ShowAll

AlignMode 对齐模式,Left=+1、Right=+2、Top=+4、Bottom=+8 0

第三篇 多媒体国

– 125 –

2.主要方法。 Play():开始播放动画。 Stop();停止播放动画。 Back();播放前一帧动画。 Forward():播放后一帧动画。 Rewind():播放第一帧动画。 SetZoomRect(int left, int top, int right, int bottom):设置缩放的区域。 Zoom(int percent):按百分比缩放。 Pan(int x, int y, int mode):缩放播放面板,其中模式 0为按像数、1为按窗口百分比。 3.主要事件。 OnProgress(int percent):读取一个 flash时触发。 OnReadyStateChange(int state):状态改变时触发。 states 的值可以为 0=Loading、

1=Uninitialized、2=Loaded、3=Interactive和 4=Complete。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加

ShockwaveFlash控件,设置其Movie属性为一个.swf文件。 2.加入两个 Button按钮,设置其 Caption分别为播放、停止。 完成界面如图 42-2所示。

图 42-2 设计期界面

二、源代码及注释 procedure TForm1.btnButton1Click(Sender: TObject);

begin

ShockwaveFlash1.Play;//播放

end;

国 Delphi 7控件实用程序设计 100例

– 126 –

procedure TForm1.btnButton2Click(Sender: TObject);

begin

ShockwaveFlash1.Stop;//停止

end;

实例 43 AbcEffectsImage——图像特效集合

实例效果 AbcEffectsImage 控件可以实现 140 种令人眼花缭乱的变换特效。该控件使用极其简单,

它提供了一个很好的特效选择器,提供了简明直观的预览方式,在该控件上点击鼠标右键,从

弹出式菜单上选择 Choose Effect选项,将打开此选择器,只需要展开目录数,点击任何一个节点就能看到特效的演示。该编辑器还可改变控件的其他属性,通过右击目录树还可以建立一

个所选特效的列表。

图 43-1 效果图

控件说明 该控件能够直接调用 Windows API 函数,仅在必要时才调用特效的子函数,所以执行效

率比较高,由于特技效果较多,故在本例中仅说明部分使用方法。 1.该控件主要属性如表 43-1所示。 表 43-1 控件属性 属性 作用 本例设置 备注

Effect 此属性用来设置变换效果的样式,可以直接从

下拉列表中选择也可以从特效选择器中选择 atfSelectionSequence

EffectSize 用来设置在一次效果变换中每步处理的尺寸 8

EffectSpeed 设定特效的绘制速度 430

2.主要方法、事件略。 3.控件性质:该控件为商业控件,是控件包 ABC套件中的一个。

第三篇 多媒体国

– 127 –

4.下载地址:http://www.obsof.com。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在 Form1上添加一个 AbcEffectsImage控件,加入一幅图片。 界面如图 43-2所示。

图 43-2 设计期界面

二、源代码及注释 略。

实例 44 ActiveMovie——播放.mov文件

实例效果 本例使用 ActiveMovie控件,实现.mov文件的播放,效果如图 44-1所示。

图 44-1 效果图

国 Delphi 7控件实用程序设计 100例

– 128 –

控件说明 运行 Delphi后,选择菜单 Component→Import ActiveX Control,找到 mov.ocx 文件进行安

装。安装完成后,ActiveX面板里出现 ActiveMovie控件,现在我们就可以用这个控件来播放mov文件了。

1.该控件主要属性如表 44-1所示。

表 44-1 控件属性 属性 作用 本例设置 备注

AutoStart 是否自动播放,设为 True则程序运行以后自动播放 mov文件

False

FileName 要播放文件名称

2.主要方法。 Run:播放。 Stop:停止播放。 Pause:暂停。 3.控件性质:该控件为免费控件。 4.下载地址:http://www.playicq.com。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一个

ActiveMovie控件。界面如图 44-2所示。

图 44-2 设计期界面

二、源代码及注释 略。

第四篇 网络 在“电脑就是网络”的时代,任何一种编程技术都不能忽视在网络上的应用,而 Delphi 7

恰恰在这一点上,表现得优为突出。它在信息安全、Web 服务、GUID 应用、DCOM 远程数据访问、WebSnap及 ActiveForm技术、WAP手机无线应用、自动化控制器等网络应用的前沿尽展风采,并且可以跨平台、跨开发语言使用。在某些方面,甚至连以网络应用为主题的

Microsoft的.NET架构也自叹不如。 本部分将重点介绍 Delphi 7网络控件技术,讲述如何利用 NmFtp、Socket、WebUpdate、

GeoWhoIs等 Delphi 7丰富的网络控件进行文件上传以及下载,网络通信和数据传输,在线升级,网址定位器等流行制作。同时还为读者提供了 Delphi 7远程访问的其他一些常用技巧,使读者对 Delphi 7远程数据访问技术有较深刻的理解与掌握。

本部分主要有以下精彩内容:

CEFileOperations——文件上传以及下载;

WebUpdate——在线升级专家;

GeoWhoIs——网址定位器;

WebCopy——网络拷贝。

国 Delphi 7控件实用程序设计 100例

– 130 –

实例 45 WebBrowser——浏览器

实例效果 本例利用WebBrowser控件,制作了一个与微软的 IE浏览器相似的Web浏览器,效果如

图 45-1所示。

图 45-1 效果图

控件说明 本例主要讲解了WebBrowser控件,WebBrowser控件位于 Delphi 7的 Internet面板,通过

提供一系列的方法和属性实现浏览器功能, 1.该控件主要属性如表 45-1所示。

表 45-1 控件属性 属性 作用 本例设置 备注

LocationURL 指定浏览路径 可以为 URL,本机磁盘驱动器、目录或网络上的路径

2.该控件主要方法。 GoBack:浏览上一页。 GoForward:浏览下一页。 GoHome:浏览首页。 GoSearch:搜索。 Navigate:浏览 URL或磁盘驱动器目录。 Navigate2:高级浏览,除可以浏览 URL或磁盘驱动器目录外,还可以浏览桌面以及我的

第四篇 网络国

– 131 –

计算机。 Refresh:刷新。 Refresh2:高级刷新。 Stop:停止浏览。 3.主要事件。 OnNavigateComplete2(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant):当前页

面下载完毕触发此事件。 注意:LocationURL属性如果指定的是本机磁盘驱动器、目录或网络上的路径,那么它的显示方式是以 UNC格式表示,表 45-2为举例示意。

表 45-2 LocationURL与 UNC格式的比较 LocationURL UNC格式

C:磁盘驱动器 File:///c:/

Windows目录 File:///c:/windows

我的文档 File:///c:/my%20documents

我的文档中的Word文件 File:///c:/my%20documents/test.doc

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个WebBrowser控件。 2.添加一个 Toolbar控件,在 ToolBar控件上单击鼠标右键,添加 6个 ToolButton,分别

设置其 Caption属性为上页、下页、停止、刷新、首页、搜索。 3.在窗体中添加一个 Edit控件,该控件用于输入 URL地址。 完成界面如图 45-2所示。

图 45-2 设计期界面

国 Delphi 7控件实用程序设计 100例

– 132 –

二、源代码及注释 //浏览本地机器

procedure TForm1.FormCreate(Sender: TObject);

begin

WebBrowser1.Navigate('c:\');

end;

//取得当前浏览下载完毕的地址

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;

const pDisp: IDispatch; var URL: OleVariant);

begin

edtUrl.Text := WebBrowser1.LocationURL;

end;

//上页

procedure TForm1.tbtnToolButton1Click(Sender: TObject);

begin

WebBrowser1.GoBack;

end;

//下页

procedure TForm1.tbtnToolButton2Click(Sender: TObject);

begin

WebBrowser1.GoForward;

end;

//停止

procedure TForm1.tbtnToolButton3Click(Sender: TObject);

begin

WebBrowser1.Stop;

end;

//刷新

procedure TForm1.tbtnToolButton4Click(Sender: TObject);

begin

WebBrowser1.Refresh;

end;

//首页

procedure TForm1.tbtnToolButton5Click(Sender: TObject);

begin

WebBrowser1.GoHome;

end;

//搜索

procedure TForm1.tbtnToolButton6Click(Sender: TObject);

第四篇 网络国

– 133 –

begin

WebBrowser1.GoSearch;

end;

//响应回车键

procedure TForm1.edtUrlKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

//如果按下回车键则浏览网页

if Key = vk_return then

WebBrowser1.Navigate(edtUrl.Text);

end;

实例 46 Socket——网络通信和数据传输

实例效果 本实例利用 Socket控件制作一个网上聊天(chat)的工具,在文本编辑框中输入文字,执

行相应菜单操作即可把其发送到服务器端。为供演示,本例连接到本机(IP地址:127.0.0.1),所以刚才发送的文字在下面的文本编辑框中显示出来,效果如图 46-1所示。

图 46-1 效果图

控件说明 本例主要讲解了 Socket控件,Socket控件包括客户端和服务端 Socket控件,它们分别是

ClientSocket和 ServerSocket,它们封装了 Winsock的大部分 API函数,使得 Winsock编程大大简化,ClientSocket和 ServerSocket控件位于 Delphi 7的 Internet面板,分别用于操纵客户端

国 Delphi 7控件实用程序设计 100例

– 134 –

和服务端的 Socket 连接与通信。根据连接发起的方式以及本地 Socket 要连接的目标,Socket之间的连接可以分为客户端连接、监听连接和服务端连接。 客户端连接是由客户端 Socket提出连接请求,连接的目标是服务端 Socket。 监听连接是指服务端 Socket 并不定位具体的客户端 Socket,而是处于等待连接的状态。

当服务端 Socket监听到客户端 Socket的连接请求时,它就响应客户端的 Socket请求,建立一个新的 Socket句柄并与客户端连接,而服务端 Socket继续处于监听状态,这样就可以继续监听其他客户端 Socket的连接请求。 服务端连接是指当服务端 Socket接收到客户端 Socket的连接请求后,就把服务端 Socket

的描述发给客户端,一旦客户端确认了此描述,连接就建立了。 1.ClientSocket控件、ServerSocket控件的主要属性分别如表 46-1、表 46-2所示。

表 46-1 ClientSocket控件属性 属性 作用 本例设置 备注

Port 指定通信端口 1024

ClientType 设置 Socket的工作方式是阻塞(ctBlocking)还是非阻塞方式(ctNonBlocking)

ctNonBlocking

表 46-2 ServerSocket控件属性 属性 作用 本例设置 备注

Port 指定通信端口 1024

Connections 由当前活动的 Socket连接(TserverClientWinSocket)组成的数组

2.ClientSocket控件主要事件。 OnConnect:当客户端 Socket与服务端 Socket取得连接以后,触发此事件。 OnRead:当客户端 Socket收到服务端 Socket发送的信息时,触发此事件。 3.ServerSocket控件主要事件。 OnAccept:当服务端 Socket与客户端 Socket建立连接时,触发此事件。 ClientConnect:当服务端 Socket与客户端 Socket建立连接以后,触发此事件。 注意:客户端 Socket 工作方式有阻塞(ctBlocking)和非阻塞方式(ctNonBlocking),在阻塞方式下可以响应异步读写事件(OnSocketEvent)。在进行读或写的操作时,不影响其他线程的执行。如果在阻塞方式下工作,则读或写的操作必须在两端同步进行,最

好把所有涉及到读或写的操作放在一个单独的线程中,这样,在 Windows 环境中能够最大限度地减少对其他线程的影响。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 ClientSocket控件、一个 ServerSocket控件。 2.添加两个Memo控件。 3.添加一个MainMenu控件,并建立菜单项,详细设置参阅本书光盘。 完成界面如图 512所示。

第四篇 网络国

– 135 –

图 46-2 设计期界面

二、源代码及注释 private

{ Private declarations }

server: string; //保存服务端地址

FServerFlag: boolean; //保存与服务端连接状态

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//切换监听状态

procedure TForm1.N2Click(Sender: TObject);

begin

mmiListen.Checked := not mmiListen.Checked;

if mmiListen.Checked then

begin

cskClientSocket1.Active := false;

sskServerSocket1.Active := true;

stbStatusBar1.Panels[0].Text := 'listening...';

end

else

begin

if sskServerSocket1.Active then

sskServerSocket1.Active := false;

stbStatusBar1.Panels[0].Text := '';

国 Delphi 7控件实用程序设计 100例

– 136 –

end;

end;

//连接服务器

procedure TForm1.N1Click(Sender: TObject);

begin

if cskClientSocket1.Active then

cskClientSocket1.Active := false;

if InputQuery('连接服务器', '服务器地址:', server) then

if Length(server) > 0 then

with cskClientSocket1 do

begin

Host := server;

Active := true;

end;

end;

procedure TForm1.cskClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket);

begin

stbStatusBar1.Panels[0].Text := '连接到服务器' + server;

end;

procedure TForm1.sskServerSocket1ClientConnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Memo2.Lines.Clear;

end;

procedure TForm1.sskServerSocket1Accept(Sender: TObject;

Socket: TCustomWinSocket);

begin

FServerFlag := true;

stbStatusBar1.Panels[0].Text := '连接到:' + Socket.RemoteAddress;

end;

//按下回车键时向客户端发送信息

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if key = vk_return then

if FServerFlag then

sskServerSocket1.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.count - 1])

else

第四篇 网络国

– 137 –

cskClientSocket1.Socket.SendText(Memo1.Lines[Memo1.Lines.count - 1]);

end;

//把接收到的信息增加到Memo2中

procedure TForm1.cskClientSocket1Read(Sender: TObject;

Socket: TCustomWinSocket);

begin

Memo2.Lines.Add(Socket.ReceiveText);

end;

//处理异常

procedure TForm1.cskClientSocket1Error(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

Memo2.Lines.Add('连接错误' + server);

ErrorCode := 0;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

mmiListen.Click;

end;

实例 47 WebNavigator——网页浏览器

实例效果 本例使用WebNavigator控件,实现网页浏览功能,运行效果如图 47-1所示。

图 47-1 效果图

国 Delphi 7控件实用程序设计 100例

– 138 –

控件说明 本例主要讲解了WebNavigator控件,这是一个实用的网页浏览器控件。。该控件方法、属

性很少,使用方法十分简单。它通过调用Webbrows.dll中的函数来实现浏览器功能。 1.该控件主要属性如表 47-1所示。 表 47-1 控件属性

属性 作用 本例设置 备注 URLAddress 连接域名

2.该控件主要方法。 Execute:执行操作。 3.控件性质:WebNavigator控件是共享性质的第三方控件。 4.下载地址:http://www.em-quicksoft.com。 注意:使用该控件时需要把 Webbrows.dll 复制到应用程序所在目录或者将其加入到系统目录(例如 c:\windows\system等)。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击 File/New Application项,新建一个工程,加入WebNavigator控件。

二、源代码及注释 program prjNavigator;

uses

WebNavigator,

Forms;

var

WebNav: TWebNavigator;

begin

WebNav := TWebNavigator.Create(Application);

try

WebNav.Execute;

finally

WebNav.Free;

end;

end.

实例 48 WebUpdate——在线升级专家 实例效果 本例使用 WebUpdate 控件实现了程序的在线升级功能,WebUpdate 控件能够自动检索

第四篇 网络国

– 139 –

Internet上的升级版本,可以刷新可执行程序本身或者正在被应用程序使用的 DLL文件,如果软件提供新的文档、说明等可以一并显示,可以自动下载和解压 CAB文件,运行效果如图 48-1所示。

图 48-1 效果图

控件说明 本例主要讲解了 WebUpdate 控件,WebUpdate 控件实现了软件的在线升级功能,它拥有

小巧的结构和简单的接口,不需要任何的 dll或者 ocx,极大地方便了应用软件的发布和升级。 使用WebUpdate控件可以分为以下几个步骤:首先通过 UpdateType属性选择网络升级的

方式是 Http、Ftp 或 File-based;接着根据升级方式不同分别设置相应的网络属性值,然后构建执行升级的控制文件,这是一个 ini文件,最后使用 DoUpdate方法进行升级。

1.该控件主要属性如表 48-1所示。

表 48-1 控件属性 属性 作用 本例设置 备注

DateFormat 用于说明 ini文件中日期的格式

DateSeparator 设置日期分隔符

ExtractCAB 设置为 True,则 CAB文件在下载以后将自动解压 True

FTPdirectory 在 FTP-based时设置 FTP路径

FTPPassive 设置为 True时,FTP模式被选择

HOST 在 FTP-based时设置 FTP主机

LastURLEntry 指示保留的升级地址

Password 在 FTP模式时设置 FTP服务器口令

Port 连接 FTP主机的端口号

PostUpdateInfo 保留升级信息

Proxy 当需要时指示代理服务器

ProxyPassword 使用代理服务器时的口令

ProxyUserId 使用代理服务器时的用户名

2.该控件主要方法。

国 Delphi 7控件实用程序设计 100例

– 140 –

Connected:指示网络是否接通,Boolean型。 DoPosUpdateInfo:发送 Update信息,在 DoUpdate或 DoThreadUpdate方法中自动调用。 DoThreadUpdate:使用一个独立的线程进行升级。 DoUpdate:开始升级。 UpdateDateGet:从注册表重新得到上次升级的时间。 3.主要事件。 OnAppDoClose:在应用程序为升级而关闭之前触发。 OnAppRestart:在应用程序重新启动之前触发。 OnFileDownloaded:在文件下载之后触发该事件。 OnFileProgress:在文件下载时触发该事件,可以用于指示进度。 OnStatus:该事件给出升级过程中的状态信息。 OnProgress:在升级进程中触发。 OnThreadUpdateDown:在独立线程升级下载结束以后触发该事件。 4.控件性质:WebUpdate控件是免费性的第三方控件。 5.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个WebUpdate控件。 2.增加一个 ListBox控件,用于显示升级信息。 3.增加两个 Button控件,用于执行升级和独立线程方式升级功能。 4.增加 3个 Edit控件,用于设置代理服务器的有关信息。 5.增加一个 CheckBox控件,用于设置是否保存代理服务器信息。 6.增加一个 StatusBar控件,用于显示升级过程中的提示信息。 界面如图 48-2所示。

图 48-2 设计期界面

第四篇 网络国

– 141 –

二、源代码及注释 procedure TForm1.WebUpdateFileProgress(Sender: TObject; filename: string;

pos, size: Integer);

begin

statusbar1.simpletext := 'Downloading ' + filename + ' ' + inttostr(pos);

end;

procedure TForm1.WebUpdateStatus(Sender: TObject; statusstr: string;

statuscode, errcode: Integer);

begin

statusbar1.simpletext := statusstr;

listbox1.items.add(statusstr);

application.processmessages;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

webupdate1.LastURLEntry.Save := checkbox1.checked;

webupdate1.proxyuserid := usr.text;

webupdate1.proxypassword := pwd.text;

webupdate1.Proxy := proxy.text;

webupdate1.doupdate;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

webupdate1.LastURLEntry.Save := checkbox1.checked;

webupdate1.proxyuserid := usr.text;

webupdate1.proxypassword := pwd.text;

webupdate1.Proxy := proxy.text;

webupdate1.dothreadupdate;

end;

procedure TForm1.WebUpdate1ThreadUpdateDone(Sender: TObject);

begin

messagedlg('独立线程方式升级完毕', mtinformation, [mbok], 0);

end;

实例 49 WebCopy——网络拷贝 实例效果 本例演示了使用WebCopy控件实现网络拷贝的功能,运行该控件时会显示一个进度和提

示对话框,方便用户的使用,并节省了编程的工作量。而且在控件运行时,下载是按线程执行

国 Delphi 7控件实用程序设计 100例

– 142 –

的,可以同时下载多个文件。运行效果如图 49-1所示。

图 49-1 效果图

控件说明 本例主要讲解了 WebCopy控件,该控件使用 WinInet API函数从网络上下载文件,可以

通过 HHTP或者 FTP下载因特网或者局域网上的文件。 1.其主要属性如表 49-1所示。 表 49-1 控件属性 属性 作用 本例设置 备注

AlwaysOnTop 设置是否总是将进度对话框显示在最上层,如果是 True则显示在最上层

True

DlgCaption 设置进度对话框的提示信息 “下载”

DlgDwnLoad 操作为下载时进度对话框的标题 “正在下载”

FormClosed 当设置为 True时,进程对话框在操作退出、打开文件和文件夹时会自动关闭

true

FTPPassive 当设为 true时,所有的 ftp传输都由被动方式完成

ProgressBar 设置进度条连接

Proxy 设置代理服务器名称

ProxyPassword 设置代理服务器密码

ProxyUserID 设置代理服务器用户 ID

ShowCompietion 设为 True时,在进度对话框中显示拷贝完成的百分比 True

ShowDialog 设为 True时显示进度对话框 True

ShowOpenFile 设为 True时,“open file”按钮显示在进度对话框

ShowOpenFolder 设为 True时,“open folder”按钮显示在进度对话框 True

ShowTime 设为 True时,对剩余时间的估计将显示在进度对话框中 True

Items 设置控件所要完成任务的列表

第四篇 网络国

– 143 –

2.该控件主要方法。 CancelCopy:退出拷贝进程。 DoCopy:执行完全拷贝。 Execute:执行列表中的所有拷贝过程。 ThreadExecuteAndWait:打开一个线程进行拷贝操作直至线程完成。 ThreadExecute:用线程完成列表中所有的拷贝工作。 3.该控件主要事件。 OnConnectError:连接失败时触发。 OnCopyCancel:取消拷贝时触发。 OnCopyDown:列表中所有的拷贝完成以后触发。 OnCopyProgress:在下载过程中触发,用来显示下载进度。 OnError:在下载过程中发生错误时触发。 OnFileDown:在列表中的每一个文件下载完毕以后都触发该事件。 OnFileStart:在列表中的每一个文件下载开始时触发该事件。 OnURLNotFound:在 URL没有找到时触发该事件。 4.控件性质:WebCopy控件是免费性的第三方控件。 5.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个WebCopy控件。 2.添加一个 Edit控件,用于设置下载文件的存放路径。 3.添加一个字符串栅格(StringGrid),用于显示下载列表。 4.添加一个 Button,用于执行下载功能。 完成界面如图 49-2所示。

图 49-2 设计期界面

国 Delphi 7控件实用程序设计 100例

– 144 –

二、源代码及注释 procedure TForm1.FormCreate(Sender: TObject);

begin

with stringgrid1 do

begin

cells[1,0]:='URL';

cells[1,1]:='http://www.tmssoftware.com/ADVGRID1.ZIP';

cells[1,2]:='http://www.tmssoftware.com/ADVGRID2.ZIP';

cells[1,3]:='http://www.tmssoftware.com/ADVGRID3.ZIP';

cells[1,4]:='http://www.tmssoftware.com/ADVGRID4.ZIP';

cells[1,5]:='http://www.tmssoftware.com/ADVGRID5.ZIP';

end;

end;

procedure TForm1.WebCopy1FileDone(Sender: TObject; idx: Integer);

begin

stringgrid1.cells[0,idx+1]:='*';

end;

procedure TForm1.Button1Click(Sender: TObject);

var

i:integer;

begin

webcopy1.items.clear;

for i:=1 to stringgrid1.rowcount-1 do

begin

stringgrid1.cells[0,i]:='';

if stringgrid1.cells[1,i]<>'' then

with webcopy1.items.add do

begin

url:=stringgrid1.cells[1,i];

targetdir:=tgt.text;

end;

end;

webcopy1.threadexecute;

end;

实例 50 GeoWhoIs——网址定位器 实例效果 本例使用 GeoWhoIs控件,通过网络查询域名所在地理位置,并以地图方式显示。该控件

第四篇 网络国

– 145 –

查询的地理位置数据库位于“cello.cs.uiuc.edu”上的免费域名地理数据库,并使用查询后反馈的信息调用 “mapweb.parc.xerox.com”上相应的地图显示域名的相应位置。效果如图 50-1、图 50-2所示(由于本机器未连入因特网,故未出现地图)。

图 50-1 运行界面图

图 50-2 效果图

控件说明 本例主要讲解了 GeoWhoIs 控件,该控件很容易使用,只需要写入域名,再调用 Execute

方法,就可以将域名所在地理位置显示在世界地图中,对域名定位监控起到强有力的作用。 1.该控件主要属性如表 50-1所示。

表 50-1 控件属性 属性 作用 本例设置 备注

Domain 设置域名

Projection 设置地图显示方式 Rectangular表示平面地图;Elliptical表示球面地图

ZoomFactor 设置显示地图的范围 以经纬度为单位,分别为 15、30、50、120

2.该控件主要方法。 Execute:执行检索。 3.该控件主要事件。

国 Delphi 7控件实用程序设计 100例

– 146 –

OnDomainStatus:在域名查询时触发该事件。 4.控件性质:GeoWhoIs控件是免费性的第三方控件。 5.下载地址:http://www.torry’s.com。 注意:由于该控件是通过调用因特网上的域名数据库来实现查询功能,故在未连入因

特网时该控件不能实现查询。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 GeoWhoIs控件。 2. 加入一个 Edit控件,用于输入需要查询的网址。 3.加入一个 Button控件,用于执行查询功能。 4.添加 6个无线按钮(Radiobutton),分别用于设定地图的显示方式和显示范围。 5.添加一个Memo控件,用于显示查询信息。 完成界面如图 50-3所示。

图 50-3 设计期界面

二、源代码及注释 procedure TMainForm.btnWhoisClick(Sender: TObject);

begin

if edtDomain.Text <> '' then

with GeoWhois do

begin

if rbRectangular.Checked then

Projection := Rectangular

else

Projection := Elliptical;

if rb15.Checked then

ZoomFactor := a15Degrees;

if rb30.Checked then

ZoomFactor := a30Degrees;

if rb50.Checked then

第四篇 网络国

– 147 –

ZoomFactor := a50Degrees;

if rb120.Checked then

ZoomFactor := a120Degrees;

Domain := edtDomain.Text;

Execute;

end

else

ShowMessage('网址不能空白!');

end;

procedure TMainForm.GeoWhoisDomainStatus(Sender: TObject; aError: Integer;

aDomain: String);

begin

if aError = 0 then

mmoStatus.Lines.Add('查询结果 ' + aDomain)

else

mmoStatus.Lines.Add('错误 ' + Errors[aError] + ', 网址 ' + aDomain);

end;

实例 51 WebImage——Web网络图片 实例效果 WebImage控件可以通过Web网络显示实时图片,图片在切换各组、面板、按钮的时候将

产生一种平滑并且具有动画效果的效果,它支持水平和垂直两种滑动方式,效果如图 51-1 所示。本例显示的是通过卫星观察到的地面图形,要看到效果,该计算机必须连接 Internet,该控件通过 yahoo网站 24小时实时播放世界各地区卫星云图。

图 51-1 运行界面图

国 Delphi 7控件实用程序设计 100例

– 148 –

控件说明 WebImage控件可以通过Web网络显示实时图片,每个单独的组都包括一个容器面板,允

许将所需要的控件加入到面板中。 1.该控件主要属性如表 51-1所示。 表 51-1 WebImage控件属性

属性 作用 本例设置 备注 Animate 是否变动 False

Async 是否异同 False

CheckContentLength 是否检查长度 False

PicturePostion 设置显示的位置 bpCenter

URL 设置图片所在网址

WebPicture 显示WEB图片

2.该控件主要事件。 OnChang事件:当改变节点时触发此事件。 OnCollapsing事件:当节点伸缩时触发此事件。 OnCustomDrawItem事件:当绘画节点时触发此事件。 3.控件性质:该控件为免费性的第三方控件。 4.下载地址:http://www.tmssoftware.com/。 注意:要看到效果,该计算机必须连接 Internet。如仍然显示不出图片,那可能就是图片的位置有变化(即网址连接有变化),读者可自行查找。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 Panel控件,在它之上添加一个WebImage控件。 2.添加一个 ListBox控件和一个 Button控件。完成界面如图 51-2所示。

图 51-2 设计期界面

第四篇 网络国

– 149 –

二、源代码及注释 //找到图片的位置

procedure TForm1.Button1Click(Sender: TObject);

var

url:string;

begin

case Regions.ItemIndex of

0:url:='http://weather.yahoo.com/graphics/satellite/europe.jpg';

1:url:='http://weather.yahoo.com/graphics/satellite/africa.jpg';

2:url:='http://weather.yahoo.com/graphics/satellite/central_asia.jpg';

3:url:='http://weather.yahoo.com/graphics/satellite/usa.jpg';

4:url:='http://weather.yahoo.com/graphics/satellite/central_america.jpg';

5:url:='http://weather.yahoo.com/graphics/satellite/south_america.jpg';

end;

if not wi.webpicture.Busy then wi.webpicture.loadfromURL(url);

end;

//设置进度显示

procedure TForm1.wiDownLoadProgress(Sender: TObject; dwSize,

dwTotSize: Cardinal);

begin

pb.position:=dwSize;

pb.max:=dwTotSize;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

regions.itemindex:=0;

end;

实例 52 CEFileOperations——文件上传和下载

实例效果 CEFileOperations控件是 TMS software CE Tools控件组中的一个控件。该控件组有 12个

控件,我们只讲解 CEFileOperations控件。它可以上传文件和下载文件,效果如图 52-1所示。

控件说明 本例主要讲解了 CEFileOperations控件,该控件主要用来上传和下载文件。该控件在网络

上很好用,读者可以自己试试。

国 Delphi 7控件实用程序设计 100例

– 150 –

图 52-1 运行界面图

1.该控件主要属性如表 52-1所示。

表 52-1 CEFileOperations控件属性 属性 作用 本例设置 备注

FileNames 文件名称

Operation 操作方式 coCopyDesktopToCE

SourceFilename 源文件

TargetFilename 目标文件

TargetDirectory 目标路径

2.该控件主要事件。 OnConnectError事件:当连接发生错误时触发此事件。 OnProgress事件:当上传或下载进度开始时触发此事件。 3.控件性质:CEFileOperations控件是免费性的第三方控件。 4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一个

CEFileOperations控件以及其他同类控件。 完成界面如图 52-2所示。

图 52-2 设计期界面

第四篇 网络国

– 151 –

二、源代码及注释 procedure TForm1.Button2Click(Sender: TObject);

begin

//保存文本

Memo1.Lines.SaveToFile(GetCurrentDir + '\memo.txt');

//文件的源文本

CEFileOperations1.SourceFilename := GetCurrentDir + '\memo.txt';

//保存的目标路径

CEFileOperations1.TargetFilename := '\My Documents\memo.txt';

//操作方式

CEFileOperations1.Operation := coCopyDesktopToCE;

//执行操作

if CEFileOperations1.Execute then

ShowMessage('Copied memo file on the CE device')

else

ShowMessage('Failed to copy memo file on the CE device');

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

CEFileOperations1.TargetFilename := GetCurrentDir + '\memo.txt';

CEFileOperations1.SourceFilename := '\My Documents\memo.txt';

CEFileOperations1.Operation := coCopyCEToDesktop;

if CEFileOperations1.Execute then

begin

Memo1.Lines.LoadFromFile(GetCurrentDir + '\memo.txt');

ShowMessage('Copied memo file from CE device to PC');

end

else

ShowMessage('Failed to copy memo file from CE device');

end;

第五篇 数据库与报表 Delphi 7控件技术的优势,突出地表现其对数据库的操作上。使用 Delphi 7数据库控件技

术,可以方便地与 Access、Paradox、Oracle、SQL Server等所有主流数据库建立连接,进行数据显示、存取、动态编辑、分类查询、报表生成等操作。它在传统数据库操作技术基础上,加

入大量原来用于算法语言、图形处理、甚至文档处理的优秀技术,如把流(Tstream)技术用于读写数据、把书签概念应用到数据库浏览等,这一系列优秀的数据库高级操作技术,大大扩

展了数据库操作的灵活性、智能性及与用户的交互性,相关操作技术简洁明了,代码开发效率

高,周期短,易于维护与升级,充分表现了 Delphi 7在数据库控件方面的强大功能。可以说,几乎所有流行的数据库技术使用 Delphi 7数据库控件都可以实现。 本部分将重点介绍 Delphi 7数据库控件技术,为读者提供 Delphi 7数据库操作的一些常用

技巧,使读者对 Delphi 7数据库控件技术有较深刻的理解。

本部分主要有以下精彩内容:

TclientDataSet——瘦客户型控件;

TbatchMove——数据批量操作;

万能查询控件WNQuery;

报表控件 FastReport。

国 Delphi 7控件实用程序设计 100例

– 154 –

实例 53 TclientDataSet——瘦客户型控件

实例效果 大家知道,Delphi具有强大的数据库应用程序开发功能,其 Client/Sever版本可以开发从

一般的单机数据库应用系统到普通 Client/Sever应用系统、瘦客户型 Client/Sever应用系统直到基于 Web 的多层应用,这离不开 Borland 数据库引擎(BDE)的功劳。不过需要注意的是在分发应用程序的时候必须同时分发 BDE文件,Borland(Inprise)公司建议用户使用 Delphi附带的 InstallShield 制作安装程序,以免遗漏 BDE 文件或 BDE 文件配置不正确。所需 BDE 文件根据应用程序所操纵的数据库对象有所不同,最少也需要数兆的空间。这对于大型应用系统来

说无足轻重,可是,对于只操纵有限几个数据表并且应用程序(.exe)本身只有几百 KB的小型单机数据库应用系统来说似乎有头重脚轻之感。

在本实例中我们用 TCientDataSet控件开发了“瘦”单机应用程序,如图 53-1所示,其运行时与使用 BDE引擎时一样,但却没有使用 BDE麻烦,其中的数据记录储存在一个扩展名为Cds的文件中,此文件只要与应用程序在同一目录下即可。

图 53-1 运行界面图

控件说明 TCientDataSet是 Delphi Client/Sever版本提供的控件,该控件本来是用来开发多层应用中

的瘦客户端程序的。我们可以用它来代替 BDE及其他数据集元件(TBDEDataSet、TDBDataSet及其派生类)用于单机(单层)应用,只不过在设计期(编程时)操作稍微复杂一些。 该控件主要的属性、事件和方法可参见 Delphi中的 Object Inspector,在此不再赘述,只

是将实现的原理说明一下。 TTable 控件的直接上级是 TDBDateSet 控件,TDBDataSet 的直接上级是 TBDEDataSet

控件,在 TBDEDataSet元件中封装了 BDE的 API,因此要在运行期操纵 TTable元件就必须使用 BDE。而 TClientDataSet 元件的直接上级是与 TBDEDataSET 的直接上级一样的 TDataSet

第五篇 数据库与报表国

– 155 –

元件,无须使用 BDE。我们在设计期将 TTable 等 TDataSet 元件中操控的数据复制到TClientDataSet 元件,并保存在数据文件(.cds)中,这样就跳过了 BDE,应用程序直接对数据文件(.cds)进行读写。而 TClienDataSet 元件所封装的对数据进行操纵处理的功能(有很多是重载于 TDataSet的虚拟抽象方法和属性)并不比 TBDEDataSet元件及其派生类差多少,基本上能满足单机数据库应用的要求。 注意:在设置 ClientDataSet1控件时,步骤比较烦琐,要注意一下,不过了解了其原理之后可能会减少一些失误。本实例代码及数据库文件详见本书光盘。

制作步骤

一、窗体界面的建立 新建一个窗体,分别拖动 Data Access控件板上的 DataSource、TClientDataSet控件、 BDE 控件板上的 Table 控件、Data Controls 控件板上的 DBGrid、DBNavigator 控件等 5

个控件到 Form1上,然后再增加两个 Button按钮用于进行控制操作。

二、控件属性设置 1.将Table1的DatabaseName属性设置为 “DEMO”,TableName 属性设置为“Students.DB”

(数据库文件可自行设定)。 2.在 Form1上选定 ClientDataSet1,点击鼠标右键弹出选单,从中选定“Assign local data”

命令打开 ClientDataSet1 Data 对话框,可以发现 Table1已在列表框中,选取并确定。这样一来,就将 Table1 中的数据表完全复制到 ClientDataSet1 中去了。重新选定 ClientDataSet1,点击鼠标右键弹出选单,从中选定“Save binary Mybase File ”命令打开保存文件对话框,如图53-2所示,将 ClientDataSet1中的数据保存到一个以 cds为默认扩展名的文件中,这里我们取名为MyThin.cds。

图 53-2 保存文件

3.双击 ClientDataSet1控件,在字段编辑器中右击激活弹出式菜单,单击 Add all Fields命令,创建数据文件的所有字段对象,这时可以修改各字段对象的DisplayLabel属性使DBGrid1中各字段具有具体明了的含义。

国 Delphi 7控件实用程序设计 100例

– 156 –

4.将 Table1从 Form1中删除,此时对于单机应用而言,它已完全没有用场了。 5.设置 DataSource1的 DataSet属性为 ClientDataSet1。 6.把 DBGrid1、DBNavigator1的 DataSource属性设为 DataSource1。 7.设置两个 Button按钮的 Caption分别为“打开表”和“关闭表”。 8.设置完后,窗体界面如图 53-3所示。

图 53-3 设计期界面图

三、源代码及注释 1.在 Form1的 OnCreat事件中加入如下代码: procedure TForm1.FormCreate(Sender: TObject);

begin

ClientDataSet1.LoadFromFile('mythin.cds');//读入数据记录

end;

2.相应的,在 Form1的 OnDestroy事件中加入以下代码: procedure TForm1.FormDestroy(Sender: TObject);

begin

ClientDataSet1.SaveToFile('mythin.cds');//将所作更改保存

end;

3.双击 Button1按钮,加入以下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

ClientDataSet1.Open;//显示数据记录

end;

4.双击 Button2按钮,加入以下代码: procedure TForm1.Button2Click(Sender: TObject);

begin

ClientDataSet1.Close;//不显示数据记录

end;

第五篇 数据库与报表国

– 157 –

实例 54 TUpdateSQL——控件的使用

实例效果 本实例使用 TUpdataSQL 控件实现数据缓存更新,如图 54-1 所示,本实例运行时,数据

表中原来有 5条记录,当进行了一系列的改动后,如图 54-2所示,改变了一条记录的编号,并插入了一条新纪录(可从更新状态看出)。如果想保留改动,可以单击“申请更新”按钮,

则窗体如图 54-3所示,否则,单击“取消更新”按钮,则又恢复为图 54-1所示。

图 54-1 运行界面图(1) 图 54-2 运行界面图(2)

图 54-3 运行界面图(3)

控件说明 数据缓存更新(Cached Update)能够使用户从数据库中检索数据、缓存和局部编辑数据,

然后应用缓存对数据库更新。当使用数据缓存更新功能时,数据修改首先是在内部缓存中保存,

而不是直接写到数据库中;当数据修改完成时,应用程序请求数据缓存更新方法将数据写到数

据库中,并清除缓存区。使用数据缓存更新需要有 3个方面的考虑: 缓存数据对于应用是局部的,不是在事务的控制之下。

在主细表情况下,管理应用缓存更新的顺序是非常复杂的。

国 Delphi 7控件实用程序设计 100例

– 158 –

应用数据缓存更新到基于查询的只读数据集,则需要使用缓存更新对象。

TUpdataSQL 控件是一个使用 SQL 陈述更新数据集的缓存更新控件,它实际上封装了 3个 TQuery控件,每一个分别完成 UpdataSQL、InsertSQL、DeleteSQL陈述。 该控件主要的属性有 5个,如图 54-4所示,其中的 Name属性和 Tag属性不必细说,其

他 3个属性中,正如前面所述,其实是封装了 3个 TQuery控件,每一个分别完成 UpdataSQL、InsertSQL、DeleteSQL陈述,设置格式是一些 SQL语句。

图 54-4 属性表

使用 TUpdataSQL控件,必需将其与数据集控件关联起来。关联 TUpdataSQL与数据集有两种方法:一是设置数据集控件的 UpdateObject 属性,另一方法是设定 TUpdataSQL 控件的DataSet 属性。使用哪一种方法取决于更新的数据表是一个基本表,还是多个数据表。如果使用 UpdateObject属性,则自动执行,如果使用 DataSet属性,则需要通过编程来实现更新。

本实例中使用的是第一种方法。

制作步骤

一、窗体界面的建立 新建一个窗体,分别拖动 Data Access 控件板上的 TDataSource 控件,BDE 控件板上的

TQuery、TDatabase、TUpdateSQL控件,Data Contrls控件板上的 TDBGrid控件、TDBNavigator控件到 Form1上,然后再增加 3个 TButton按钮,用于进行控制操作。

二、控件属性设置 1.设置 DBNavigator1和 DBGrid1的 DataSource属性均为 DataSource1,设置 DataSource1

的 DataSet属性为 Query1,设置 Database1的 AliasName属性为所要连接的数据库的别名,本例中为“DEMO”。然后设置 DatabaseName属性为 CacheDB,Translsolation属性为 tiDirtyRead,最后设置 Connected属性为 True。

2.设置 Query1的 DatabaseName为 CacheDB,SQL属性为如下所示: select Table3.Num,Table3.Name //Table3为要查询的数据表

From

Table3 Table3

order by

Table3.Num

第五篇 数据库与报表国

– 159 –

双击 Query1控件,在字段编辑器中右击激活弹出式菜单,单击 Add all Fields命令,创建Item.db的所有字段对象;双击 Query1控件,在字段编辑器中右击激活弹出式菜单,单击 New Field命令,则出现 New Field对话框,建立一个类型为 Strings的计算字段 UpdateStatus,然后为所有的字段对象设置 DisplayLabel属性,分别为“编号”、“姓名”和“更新状态”;

设置 UpdateSQL1的 InsertSQL、DeleteSQL和ModifySQL属性分别如下: • delete from Table3 where Num = :OLD_Num and Name = :OLD_Name

• insert into Table3 (Num, Name) values (:Num, :Name)

• update Table3

set

Num = :Num,

Name = :Name

where

Num = :OLD_Num and

Name = :OLD_Name

3.设置 3 个按钮的 Caption 属性分别为“申请更新”、“取消更新”和“恢复记录”;设置完后窗体界面如图 54-5所示。

图 54-5 设计期界面图

三、代码和注释 1.在单元文件的变量声明部分添加一个类型为 TDBDataSet的变量 FDataSet; 2.在 Form1的 OnCreate事件中加入以下代码: procedure TForm1.FormCreate(Sender: TObject);

begin

FDataSet := DataSource1.DataSet as TDBDataSet;

FDataSet.CachedUpdates :=True;

FDataSet.UpdateObject := UpdateSQL1; //关联

FDataSet.Open; //显示

end;

3.双击Button1按钮,加入以下代码:

国 Delphi 7控件实用程序设计 100例

– 160 –

procedure TForm1.Button1Click(Sender: TObject);

begin

FDataSet.Database.ApplyUpdates([FDataSet]);//申请更新

end;

4.双击Button2按钮,加入以下代码: procedure TForm1.Button2Click(Sender: TObject);

begin

FDataSet.CancelUpdates;//取消更新

end;

5.双击Button3按钮,加入以下代码: procedure TForm1.Button3Click(Sender: TObject);

begin

FDataSet.RevertRecord;// 对当前记录所作的修改将被取消

end;

6.在Query1的OnCalcFields事件中加入以下代码: //显示记录的状态

procedure TForm1.Query1CalcFields(DataSet: TDataSet);

Const

UpdateStatusStr: array[TUpdateStatus] of string = ('Unmodified', 'Modified','Inserted', 'Deleted');

//用于记录状态的数组

begin

If Query1.CachedUpdates then

Query1UpdateStatus.Value := UpdateStatusStr[Query1.UpdateStatus];

end;

实例 55 TBatchMove——数据批量操作

实例效果 Delphi提供了数据批量搬移与复制功能,这为开发网络数据库应用程序、使用服务器部分

复制数据带来极大的方便。Delphi自带的 TBatchMove控件可以完成数据的复制任务,还可以与 TQuery控件结合进行有选择的复制数据。 本实例运行时,如图 55-1 所示,窗体中的两个数据栅格分别显示了两个数据表的记录,

当单击 Copy按钮时,左边栅格中的记录便追加到右边的栅格中,同时在底部的状态条中显示了复制的记录数,如图 55-2所示。

第五篇 数据库与报表国

– 161 –

图 55-1 运行界面图(1) 图 55-2 运行界面图(2)

控件说明 1.TBatchMove控件的属性 (1)Source和 Destination属性 TBatchMove控件的 Source和 Destination属性确定数据的源数据集和目的数据集,可以设

置为 Table或 Query控件,它们分别连接相应的数据表。如果是 Query控件,则 TBatchMove在执行数据 SQL查询以后,再用查询结果进行数据复制。 (2)Mode属性 TBatchMove控件的Mode属性设定数据复制的方式,有以下几种类型: • batAppend 将源表数据附加在目的表的后面,目的表必需存在,且两个表不能有重复的

记录,这是缺省的模式; • batUpdate 使用源表中与目的表中匹配的记录进行替换,目的表必须存在且有一个匹配

索引;

• batAppendUpdate 如果目的表中有记录与源表记录匹配,则用源记录替换它,否则,将该记录附加到目的表中,目的表必须存在且有一个匹配索引;

• batCopy 创建一个与源表相同结构的数据表,如果目的表存在,则删除目的表的全部记录,然后复制源表记录;

• batDelete 删除目的表中与源表中数据匹配的记录,目的表必须存在且有一个匹配索引。 (3)Mapping属性 Mapping 属性用于设定复制匹配关系。缺省情况下按字段顺序进行复制;

(4)RecordCount、CommitCount和MovedCount属性 RecordCount属性设定复制的最大记录数;CommitCount属性设定在一个事务发生之前复

制的记录数;MovedCount属性报告复制过程中记录数。 2.TBatchMove控件的方法 TBatchMove的 Ececute方法执行数据批复制任务;Destory方法撤消 TBatchMove及其复

制任务。

国 Delphi 7控件实用程序设计 100例

– 162 –

制作步骤

一、窗体界面的建立 新建一个窗体,分别放置源数据集 Table1、目的数据集 Table2、BatchMove1 控件、按钮

Button1和 StatusBar1控件,另外,为了观察数据,分别放置两个显示控件 DBGrid1和 DBGrid2,以及对应的 DataSource1和 DataSource2控件。

二、控件属性设置 1.分别设置 Table1和 Table2对应的数据表,本例中为“DEMO”数据库下的 Table1.DB

和 Table2.DB。 2.设置 Datasource1和 DataSource2的 DataSet属性分别为 Table1和 Table2。 3.设置 DBGrid1和 DBGrid2的 DataSource属性分别为 DataSource1和 DataSource2。 4.设置 BatchMove1的 Source为 Table1,Destination为 Table2,Mode为 batAppendUpdate。 5.设置 Button1的 Caption属性为“Copy”。设置完成后窗体界面如图 55-3所示。

图 55-3 设计期界面图

三、源代码及注释 1.在 Form1的 OnCreate事件中加入以下代码: procedure TForm1.FormCreate(Sender: TObject);

begin //显示原始数据

Table1.Active:=True;

Table2.Active:=True;

end;

2.双击 Buton1按钮,加入以下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

with BatchMove1 do

begin

Execute;//执行数据复制任务

StatusBar1.SimpleText:=inttostr(MovedCount-KeyViolCount)+'Records Added';//显示状态

第五篇 数据库与报表国

– 163 –

end;

end;

实例 56 TDBCtrlGrid——扩展的数据栅格

实例效果 作为 Delphi 数据库应用程序开发中主要的数据记录显示控件,TDBGrid 控件的特点是一

行只显示一个记录,但可以设置每一列的属性。而 Delphi 中提供的另一个特殊的数据栅格控件 TDBCtrlGrid,其特点是每一行都是一个窗格(TPanel 对象),可以在窗格上放一些控件。例如,可以把一个 TDBEdit 控件放到窗格上,让它显示某个字段的值,还可以在编辑框的旁边加一个 Tlabel控件作为标签。TDBCtrlGrid的另一个特点是一行上可以有多个窗格,也就是说,一行可以显示多个记录,窗格的高度和宽度都是可以调整的。 在本实例中,使用 Delphi 自带 TDBCtrlGrid 控件开发一个简单的显示数据表中记录的程

序,如图 56-1 所示,在“信息学院部分学生统计表”窗体中,当单击“打开”按钮时,便会在窗体的 TDBGtrlGrid控件中以比较详细和直观的方式显示数据表中的记录,如图 56-2所示。

图 56-1 运行界面图(1)

图 56-2 运行界面图(2)

国 Delphi 7控件实用程序设计 100例

– 164 –

控件说明 要把一个 TDBCtrlGrid构件放到窗体上,设置它的 DataSource属性指定一个 TDataSource

构件。刚开始的时候,TDBCtrlGrid 构件有三行和一列。接着,要把一些数据控件放到TDBCtrlGrid构件的“设计单元”上,设置这些数据控件的 DataField属性指定要显示的字段。“设计单元”通常是最上边或最左边的单元,与其他单元在外观上的区别是它没有斜线底纹。

注意:1.只能把数据控件放到 TDBCtrlGrid 构件的“设计单元”上,当程序编译运行后,会自动把“设计单元”上的数据控件复制到其他单元,从而每个单元显示不同

的记录。 2.每个 TDBCtrlGrid 控件的右侧均带有滚动条,在此例中将其相互覆盖即可,

最后一个 TDBCtrlGrid控件的滚动条可以控制所有的 TDBCtrlGrid控件; 3.TDBCtrlGrid 控件的 DataSource 属性一旦设定,其上数据显示控件的

DataSource属性就不用再设置,也就是应该先设置 TDBCtrlGrid的 DataSource属性。

制作步骤

一、窗体界面的建立 新建一个窗体,在窗体的最上部分放置一个 TLabel控件用于说明程序内容(可选),然后

添加一个 TTable 控件,一个 TDataSource 控件用于连接数据库根据所要显示的数据表的字段数目确定要添加的 TDBCtrlGrid控件(Data Ctrls控件页)的数目,如本例中要显示的数据表Studnets.DB中有 6个字段,所以添加 6个 TDBCtrlGrid 控件,并且在每个 TDBCtrlGrid控件上添加一个 TDBEdit控件和一个 TLabel控件。最后再添加两个 TButton控件用于控制。

二、控件属性设置 1.将 Table1的DatabaseName属性设置为 “DEMO”,TableName 属性设置“Students.DB”

(数据库文件可自行设定)。 2.将 DataSource1的 DataSet属性设置为 Table1。 3.把 6个 TDBCtrlGrid控件的DataSource属性均设置为DataSource1,ColCount均设为 1。 4.依据要显示的数据表的字段属性设置好 TDBEdit控件的 DataField属性和 TLable控件

的 Caption属性。 5.设置两个 TButton按钮的 Caption属性为“打开”和“关闭”,窗体界面如图 56-3所示。

图 56-3 设计期界面图

第五篇 数据库与报表国

– 165 –

三、源代码及注释 1.双击 Button1按钮,加入以下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

Table1.Open;//打开数据表

end;

2.双击 Button2按钮,加入以下代码: procedure TForm1.Button2Click(Sender: TObject);

begin

Table1.Close;//关闭数据表

end;

实实实例例例 555777 通用报表工具 SReport

实例效果 本例演示了第三方报表控件 Sreport 的使用方法,简单设置数据源后,保持打开状态,如

图 57-1 所示,单击“设计及打印报表”按钮,则会弹出如图 57-2 所示的窗口,可以看到,设

计及打印报表、导入与导出各项功能在运行期均可以由用户设置,图 57-3 所示是预览窗口。

图 57-1 运行界面图 图 57-2 设计及打印报表

图 57-3 预览窗口

国 Delphi 7控件实用程序设计 100例

– 166 –

控件说明 SReport是一个自称为“万能”的报表设计控件。它的直接作用包括两个方面:一是将商

务管理软件开发人员的报表设计工作量降为零;二是为最终用户提供“简单易用”解决方案,

对于报表设计来讲,这一点很重要,SReport控件提供功能强大、灵活方便的报表自定义途径。用户可以轻松、随心所欲的设计打印自己的报表。

在 Delphi开发数据库应用程序时,多数是以数据集 Dataset为对象,如 Query、Table,一般是单一数据表,或是一个主表对一个明细表,或是多主表对一个明细表。这时需要程序员做

的仅仅是为控件提供需要打印的数据集名称,并保证它处于打开状态。其他一切问题就由控件

自己搞定。SReport控件可实现的功能包括: (1)自定义页面、边距、字体; (2)自定义标题和页眉页脚; (3)在表头尾可以打印任何相关数据主表中的数据和自定义标签; (4)可以定义明细数据中要打印的字段、标题、宽度、对齐方式、字体; (5)可以定义明细数据是否页计、是否累计、是否总计、是否大写字段; (6)实现针打中的卷纸打印--打多少内容,走多少纸。(报表和页面等长); (7)直接生成文本文件、EXCEL格式文件、HTML网页格式文件; (8)用户可以自己定义是否要打印报表顶端的单位信息标志; (9)支持同一报表多格式并存,按用户的选择输出不同的报表。 1.该控件主要属性如表 57-1所示。 表 57-1 控件主要属性

序号 属性名 性质 说明 1 UserFormName string 默认窗体的 Name,可改,标识一个报表的依据 2 UserFormCaption string 默认窗体的 Caption,可改,弹出窗口的 Caption 3 SubDetailDataSet TDataSet 报表明细的数据源,可空 4 MainDataSetOne TDataSet 报表主数据源之一,可空 5 MainDataSetTwo TDataSet 报表主数据源之二,可空 6 MainDataSetThree TDataSet 报表主数据源之三,可空 7 MainDataSetFour TDataSet 报表主数据源之四,可空 8 MainDataSetFive TDataSet 报表主数据源之五,可空 9 MainDataSetOneCaption String 主数据源之一的提供给用户查看的名称,可空 10 MainDataSetTwoCaption String 主数据源之二的提供给用户查看的名称,可空 11 MainDataSetThreeCaption String 主数据源之三的提供给用户查看的名称,可空 12 MainDataSetFourCaption String 主数据源之四的提供给用户查看的名称,可空 13 MainDataSetFiveCaption String 主数据源之五的提供给用户查看的名称,可空 14 ModelInfoFilesName String 记录各个报表的模板个数,名称用使用状态 15 SaveDirectory String 存放报表信息文件的目录(相对于可执行的目录) 16 PrintMemoRows integer 表尾附注信息的行数(开发者控制) 17 PrintMemoString string 附注信息的内容(开发者控制)

第五篇 数据库与报表国

– 167 –

2.该控件主要事件和方法如表 57-2所示。

表 57-2 主要事件和方法 序号 方法名 性质 说明

1 SRep_Setting 方法 打印报表设置窗口 2 SRep_Print 方法 选用默认模板,将报表发往打印机 3 SRep_Preview 方法 选用默认模板,将报表发往屏幕(预览) 4 SRep_PrintSelect 方法 弹出模板选择器,根据用户所选模板将报

表发往打印机 5 SRep_PreviewSelect 方法 弹出模板选择器,根据用户所选模板将报

表发往屏幕 6 SRep_PrintToTxt 方法 根据报表生成一个文本文件 7 SRep_PrintToTxtSelect 方法 弹出模板选择器,根据用户所选模板生成

一个文本文件 8 SRep_PrintToExecl 方法 根据报表生成一个 EXCEL文件 9 SRep_PrintToExeclSelect 方法 弹出模板选择器,根据用户所选模板生成

一个 EXCEL文件 10 SRep_PrintToHtml 方法 根据报表生成一个网页(HTML)文件 11 SRep_PrintToHtmlSelect 方法 弹出模板选择器,根据用户所选模板生成

一个 HTML文件 12 S_InputQuery 函数 作中文字体优化的 InputQuery 函数。用

法同 InputQuery

本例使用了该控件的方法 SRep_Setting,每次触发此事件时,便会弹出图 57-2 所示的窗口,其他的功能便可在此窗口中实现。 使用本控件首先要注意的是安装时的输出路径,再就是触发本控件前一定要保持数据源处

于打开状态。另外,控件本身自带的帮助文件十分丰富,可以说是面面俱到,初次使用时一定

要先浏览一下。 3.本控件属于免费、提供全部源代码的第三方控件。 4.下载地址:http://www.CSDN.net或 http://www.CSDN.net。

制作步骤

一、窗体界面的建立 新建一个 Form1窗体,分别拖动 Data Access控件板上的 DataSource控件,BDE控件板上

的 Table,Data Controls控件板上的 DBGrid和新安装的 SReport四个控件到 Form1上。

二、控件属性设置 1.设置 DataSource1 的 DataSet 为 Table1。 2.将Table1的DatabaseName属性设置为 “DEMO”,TableName 属性设置“employee.DB”,

Active属性设置为 True. 3.把 DBGrid1的 DataSource属性设为 DataSource1. 4.设置 SReport1的 SubDetailDataSet属性为 Table1. 5.设置完后界面如图 57-4所示。

国 Delphi 7控件实用程序设计 100例

– 168 –

图 57-4 设计期界面图

三、代码及注释 双击 Button1按钮,添加如下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

SReport1.SRep_Setting;//弹出设计窗口

end;

本实例完整代码及数据库文件详见本书光盘。

实例 58 万能查询控件WNQuery 实例效果 实例运行时,在如图 58-1所示的查询窗口中,当单击 Button1 按钮时,弹出如图 58-2所

示的查询条件设置窗口,只需要通过下拉框来设置查询条件即可。每设置完一项,便可单击窗

体右侧的“添加条件”,然后接着设置其他的条件。当全部设置完后,单击“查询”,会弹出一

个提示框,提示核实查询条件,如图 58-3所示,查询结果将显示在数据栅格控件中,如图 58-4所示。

图 58-1 查询窗口 图 58-2 查询条件设置

第五篇 数据库与报表国

– 169 –

图 58-3 核实查询条件 图 58-4 查询结果显示

控件说明 越来越多的 Delphi爱好者倾向于 Delphi+ADO组合,甚至网上出现了 Borland公司要放弃

Paradox的言论。Delphi+ADO的功能之强大是有目共睹的,因此网上也出现了许多关于 ADO的第三方控件,本篇介绍的万能查询控件WNQuery就是其中比较优秀的一个。 万能查询控件WNQuery的最大特点就是傻瓜式操作,但功能一点也不差,能够随意组合

出各种查询条件。而且能够支持 Access的日期分隔符“#”和其他数据库的日期分隔符。只要设置 ADO连接字符串、表名,还有要查的字段就行了。

1.该控件主要属性如表 58-1所示。 表 58-1 控件主要属性

序号 属性名 性质 说明 1 AutoLogin Boolean 是否自动连接 2 ConnectionString WideString ADO连接字符 3 DateSeperate Char 日期分隔符 4 Field Tstrings 数据表中字段显示 5 Name TCompinentName 控件名称 6 TabName WideString 要连接的数据表名称 7 Tag Integer 焦点顺序

2.该控件无显示的事件、方法。只是在查询时调用了一个 Execute()方法,括号内为布尔型参数,决定了是否显示初始比较值,读者可由图 58-5与图 58-2对比得知。

图 58-5 是否显示初始比较值

国 Delphi 7控件实用程序设计 100例

– 170 –

3.本控件属于免费、提供全部源代码的第三方控件。 4.控件下载地址:http://www.CSDN.net。

制作步骤

一、窗体界面的建立 新建一个 Form1 窗体,分别拖动 DataAccess 控件板上的 DataSource、ADO 控件板上的

ADOQuery、Data Controls控件板上的 DBGrid和新安装的WNADOCQuery四个控件到 Form1上,再添加两个 Button按钮用于控制。

二、控件属性设置 1.设置 DataSource1 的 DataSet 为 ADOQuery1。 2.把 DBGrid1的 DataSource属性设为 DataSource1。 3.设置WNADOCQuery1的 Name属性为 w,TabName属性为 student,Field属性为如下

所示: 姓名=f_name 性别=f_sex 入学日期=f_date 学号=f_integer 4.设置完后界面如图 58-6所示。

图 58-6 设计期界面图

三、代码及注释 1.双击 Button1按钮,添加如下代码: //有初始值时的查询设置

procedure TForm1.Button1Click(Sender: TObject);

var

qstr: string;//用于记录查询条件

begin

if w.Execute(true) then

第五篇 数据库与报表国

– 171 –

begin

qstr := 'select * from student where ' + w.QUeryTerm;//查询条件

showmessage(qstr);//核实

with ADOQuery1 do//开始查询

begin

Close;

SQL.Text := qstr;

Open;

end;

end;

end;

2.在 Form1的 OnShow事件中加入以下代码: //设置 w和 ADOQuery1的连接字

procedure TForm1.FormShow(Sender: TObject);

begin

w.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;DataSource='+ ExtractFileDir

(Application.ExeName) + '\test.mdb;Persist Security Info=False';

ADOQuery1.ConnectionString := w.ConnectionString;

end;

3.双击 Button2按钮,加入以下代码: //无初始比较值时的查询设置

procedure TForm1.Button2Click(Sender: TObject);

var

qstr: string;//记录查询条件

begin

if w.Execute(False) then

begin

qstr := 'select * from student where ' + w.QUeryTerm;//查询条件

showmessage(qstr);//核实

with ADOQuery1 do//开始查询

begin

Close;

SQL.Text := qstr;

Open;

end;

end;

end;

国 Delphi 7控件实用程序设计 100例

– 172 –

实例 59 查询控件 EsLib

实例效果 实例运行时,当在如图 59-1 所示的查询窗体中单击 Search 按钮时,便会弹出如图 59-2

所示的查询设置窗口,用户可以在“范围”下拉框中选择设置查询条件用到的字段值,在“比

较”下拉框中选择逻辑关系,然后在“值”编辑框中输入限定条件。每设置完一个条件,便可

以通过单击“添加”按钮添加到保存框中,以便设置下面的查询条件。当全部设置完后,单击

“确定”,则查询结果显示在数据栅格中,如图 59-3所示。

图 59-1 查询窗体

图 59-2 查询设置窗口 图 59-3 查询结果显示

控件说明 ES2.0 for Delphi 7可以说是一个控件包,安装完成后共 4个控件,包括 EsSearch(for BDE)、

EsMSearch (for BDE)、EsADOSearch(for ADO)、EsADOMSearch控件(for ADO);其中

第五篇 数据库与报表国

– 173 –

EsSearch和 EsADOSearch 可为数据管理系统软件设计提供对单表任意字段中文组合查寻的功能。EsMSearch 和 EsADOMSearch 可为数据管理系统软件设计提供对多表任意字段中文组合查寻的功能。 本实例只是使用了其中的 EsSearch控件,主要是介绍一下此组控件的使用步骤。 1.该控件主要属性如表 59-1所示。

表 59-1 控件主要属性 序号 属性名 说明

1 Caption 查寻窗口的标题名称 2 DatabaseName 查寻的 Table所在的目录或数据库的名称 3 Fieldtable 字段名的英汉对照表的表名 4 FieldtableChinesefield 英汉对照表的中文的字段名 5 FieldtableDatatypefield 英汉对照表的数据类型的字段名 6 FieldtableEnglishfield 英汉对照表的英文的字段名 7 FieldtableTableid 英汉对照表的表 ID的字段名 8 Idtable 表名 9 IdtableTableid IDTable的 TableID的字段名 10 IdtableTablename DTable的 TableName的字段名 11 SearchTableName 要查寻的表名

2.该控件无显示的事件、方法。在触发查询时是使用判断“确定”按钮是否被按下来决定的,在下面的代码分析中可以看到这一点。

3.本控件属于免费、提供全部源代码的第三方控件。下载地址:http://www.playicq.com。

制作步骤

一、数据表的建立 1.在使用 EsSearch前,首先要确定所需查寻的表 Table,并且将所有要查寻的 Table的名

称编号,制作成 IDTable 表,它的字段结构是:TableID、TableName。然后输入表的 ID 和表的名称到新建立的表 IDTable中。

2.建立需要查寻的所有字段的英汉对照表 FieldTable,它的字段结构是:TableID、EnglishField、ChineseField、DataTypeField,并且输入数据。接下来便可以利用 EsSearch控件设置窗体界面了。

二、窗体界面的建立 在窗体中加入一个DBGrid控件、一个DataSource控件、一个Query控件、一个DBNavigator

控件和一个 EsSearch控件,用于控制数据记录,然后添加一个 Button按钮用于进行查询,添加两个 Panel控件用于修饰。

三、控件属性的设置 1.将 Datasource1的 DataSet属性设置为 Query1。 2.将 Query1和WsSearch1的 DataBaseName属性设置为要查询的数据库的别名,此例中

为 DEMO。

国 Delphi 7控件实用程序设计 100例

– 174 –

3.将 DBGrid1和 DBNavigator1的 DataSource设置为 DataSource1。 4.接下来设置 EsSearch1的各个属性,读者可根据“数据表的建立”中的步骤自行设置,

不再赘述。 5.将 Button1的 Caption设置为 Search。 设置完后窗体界面如图 59-4所示。

图 59-4 设计期界面图

四、代码及注释 1.双击 Button1按钮,添加如下代码: procedure TEsLibTest.Button1Click(Sender: TObject);

begin

query1.DisableControls;

if EsSearch1.ExecSearch=mrOK then//用户点击“确定”按钮,开始查询

With Query1 do

begin

close;

sql.Clear;

sql.Add('select Books.*');

sql.Add(EsSearch1.ResultSQLTerm);//设置查询条件

prepare;

open;

end;

query1.EnableControls;

end;

2.在窗体的 OnClose事件中加入以下代码: procedure TEsLibTest.FormClose(Sender: TObject; var Action: TCloseAction);

第五篇 数据库与报表国

– 175 –

begin

Query1.Close;//关闭查询

end;

实例 60 报表控件 FastReport

实例效果 实例运行时,如图 60-1 所示,在程序运行之前设置好了数据源,并设计了自己所需要的

报表,当单击“Show Report”按钮时,首先会弹出一个提示框,如图 60-2所示,告知转换进程,随后弹出如图 60-3所示的报表窗口。

图 60-1 运行界面图 图 60-2 提示框

图 60-3 报表窗口

控件说明 FastReport报表控件实际上是一组相互关联的控件,本实例中只是通过一个简单的生成报

表的程序来让读者对其有个初步的认识,更深层次的使用就要靠大家自己摸索了。 本实例中主要使用了 frReport控件和 frDBDataSet控件。它们的属性和事件方法均比较多,

在此只是对其中的几个属性进行解释。

国 Delphi 7控件实用程序设计 100例

– 176 –

1.frDBDataSet的 DataSet属性和 DataSource属性均是用来指示数据源,使用时只需设置一项即可。

2.图 60-2所示的显示进度的窗体是由 frReport控件的 ShowProgress属性决定的;此外还有 ShowPrintDialoge也是可选的。

3.frReport控件的 PreviewButtons属性决定了图 60-3所示预览窗体中要显示的控制按钮。 4.frReport 控件的 StoreInDFM 属性描述了报表是以怎样的形式被保存的,如果设置为

True,则报表是以窗体资源的形式被保存,这样并不需要其他的文件,但是这种情况下,就不能单独编辑报表了,所以默认为 False。 该控件为共享控件,下载地址:http://www.fast-report.com。

制作步骤

一、窗体界面的建立 新建一个窗体,加入一个 frReport控件,一个 frDBDataSet控件,一个 Table控件和一个

DataSource控件用于选择数据源即显示报表,再添加一个 Button控件用于控制;

二、控件属性的设置 1.将 DataSource1的 DataSet属性设置为 Table1; 2.将 Table1 的 DataBaseName 属性设置为数据库别名,本实例中为 DEMO,TableName

属性设置为要制作成报表的数据表;本例中为“Customers.DB” 3.将 frDBDataSet1的 DataSource属性设置为 DataSource1; 4.将 frReport1的 DataSet属性 weifrDBDataSet1,StoreInDFM属性设置为 True; 5.将 Button1的 Caption属性设置为“Show Report”; 设置完后窗体界面如图 60-4所示。

图 60-4 设计期界面图

其余的工作就是双击 frReport1控件,在弹出的窗体中设计自己的报表了,如图 60-5所示。 可以看到这个窗体的样式和 Delphi的开发界面差不多,有控件板、Object Inspector,只是

功能仅限于编辑报表罢了,但它的优势就是在这单一的功能中体现出来的。 在本实例中,只使用了其中的很少一部分功能,对于具体的设计细节,与其他的报表设计

很类似,在这就不再详细叙述。

第五篇 数据库与报表国

– 177 –

图 60-5 设计报表

三、代码及注释 由于 frReport控件本身封装了许多细节,所以本实例的代码比较简单,双击 Button按钮,

加入以下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

frReport1.ShowReport;

end;

实例 61 Exporter控件组的使用 实例效果 本实例应用 Exporter控件组来实现数据记录到文本文档的转换,如图 61-1所示,当实例

运行时,在数据浏览窗体中,如果单击“转换为文本文档”按钮,则会在当前目录下生成一个

文本文档 temp.txt,其中的数据便是用户浏览的数据,如图 61-2所示。

图 61-1 运行界面图

国 Delphi 7控件实用程序设计 100例

– 178 –

图 61-2 生成文本文档

控件说明 在数据库应用程序中,常常需要将数据表中的记录输出为文本文档、网页或其他形式。当

然,这可以通过调用一系列的函数来实现。Exporter控件组的出现使得这些操作变得简单和可视化,使用 Exporter控件组之后,只需要简单的属性设置和几句代码便可以轻松输出数据记录。本实例就是应用 Exporter控件组来实现数据记录到文本文档的转换的。

Exporter控件组共包括 TextExporter、 FileCanal、 TextHTMLExporter等 10个控件,它们各自的功能可以从其命名上了解。 本实例中共使用了 TextExporter、FileCanal、DataDump 三个控件,完成了数据记录到文

本文档的转换。 其中 DataDump控件的主要属性如表 61-1所示。它的 DumpTable方法用于输出数据记录。 表 61-1

DataSource 数据源 Exporter 输出目标控件

Name 命名 Tag 焦点顺序 Title 标题

TextExporter的主要属性如表 61-2所示。 表 61-2

Canel 转换渠道 Name 命名 Tag 焦点顺序

FileCanal控件的主要属性如表 61-3所示。 表 61-3

FileName 输出到的文件名 Name 命名 OverWriteFile 是否覆盖原来的文件 Tag 焦点顺序

第五篇 数据库与报表国

– 179 –

由以上属性可知,DataDump 控件主要用来连接数据源和 TextExporter,FileCanal 用来连接输出文件,TextExporter用于打开文件。 本控件属于免费、提供全部源代码的第三方控件。下载地址:http://www.playicq.com。

制作步骤

一、窗体界面的建立 新建一个窗体,添加上 TextExporter、FileCanal、DataDump三个控件然后加入 TTable控

件和 TDataSource控件用于连接数据库,添加上 TDBGrid控件和 TDBNavigator控件用于显示数据,最后添加一个 Button按钮用于控制。

二、控件属性的设置 1.将 Table1的DatabaseName属性设置为 “DEMO”,TableName 属性设置“employee.DB”

(数据库文件可自行设定)Astive设置为 True。 2.将 DataSource1的 DataSet属性设置为 Table1。 3.将 DBGrid1、DBNavigator1和 DataDump1的 DataSource属性均设置为 DataSource1。 4.将 DataDump1的 Exporter属性设置为 TextExporter1。 5.将 TextExporter1的 FileCanal属性设置为 FileCanal1。 6.在当前目录下新建一个名为“temp.txt”的文本文档,FileCanal1的 FileName属性设置

为“temp.txt”。 7.将 Button1的 Caption设置为“转换为文本文档”。 设置完后窗体界面如图 61-3所示。

图 61-3 设计期界面图

三、源代码和注释 双击 Button1按钮,加入以下代码: procedure TForm1.Button1Click(Sender: TObject);

begin

DataDump1.Exporter.Open;//打开文件

DataDump1.DumpTable;//转换数据

国 Delphi 7控件实用程序设计 100例

– 180 –

DataDump1.Exporter.Close;//关闭文件

end;

实例 62 F1Book——数据表格

实例效果 本实例演示了 Delphi 7自带 F1Book控件编写的表格。它与微软的 Excel 表格一样,同

样可以编辑数据。既可以按行编辑,又可以按列编辑,还可以改变表格的风格。图 62-1 是启

动时的窗体,当按下“All”按钮之后,将出现图 62-2 所示效果。

图 62-1 运行界面图(1)

图 62-2 运行界面图(2)

第五篇 数据库与报表国

– 181 –

控件说明 1.F1Book控件主要属性如表 62-1所示。

表 62-1 主要属性 属性 含义 备注

BackColor 背景颜色 ShowHscrollBar 设置水平滚动条 0- F1Off//不显示

1- F10n//显示 2- F1Auto//列的长度超过范围将自动显示

ShowVScrollBar 设置垂直滚动条 1- F1Off//同上 2- F10n 3- F1Auto

ShowTabs 表键的位置 0- F1TabsOff//不显示 1- F1TabsBottom//显示在底端 2- F1TabsTop//显示在顶端

ShowGridLines 是否显示网格线 True or False ShowFormulas 列的宽度是否两倍显示 True or False

2.该控件主要方法如表 62-2所示。

表 62-2 主要方法 方法 含义 备注

SetSelection 设置选择 EditCopyRight 编辑权力 EditInsert 插入编辑 EditClear 编辑清除 EditDelete 删除编辑 Recalc 重新计算

3.该控件主要事件如表 62-3所示。

表 62-3 主要事件 属性 含义 备注

Click 单击该控件时,此发生事件 StartEdit 开始编辑时,此事件发生 DragOver 它在拖放操作正在进行时发生 GotFocus 当对象获得焦点时产生该事件 LostFocus 此事件是在一个对象失去焦点时发生

4.控件性质:该控件为 Delphi自带 ocx控件(在 ActiveX组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。

国 Delphi 7控件实用程序设计 100例

– 182 –

2.向窗体加入一个 F1Book控件(在ActiveX组件页)。其中编辑数据可以在“Formula One Workbook Designer”属性中编辑,也可在启动窗体后编辑数据。下面我们讲解启动窗体前编辑数据,即在窗体上添加 F1Book 控件后编辑数据。首先在控件上点击鼠标右键,选中“Workbook Designeer”,如图 62-3所示。

图 62-3 编辑数据菜单

3.这时将出现“Formula One Workbook Designe”编辑窗,如图 62-4所示。当需要在某个单元格编辑数据时,就双击该单元格,同时添加数据,最后按下回车键表示编辑完成。当然

也可以在菜单下的文本框里写数据,方法和在单元格里编辑数据差不多,只不过是把数据写在

文本框里。编辑的数据如图 62-4所示。

图 62-4 编辑数据

4.最后,F1Book控件数据编辑完成之后,如图 62-5所示。还要向窗体加入一个 Bitbtn控件,其 Kind属性设为“bkAll”。 其余详细设置请参阅本书光盘。最后完成界面如图 62-5所示。

第五篇 数据库与报表国

– 183 –

图 62-5 设计期界面图

二、源代码与注释 procedure TForm1.BitBtn1Click(Sender: TObject);

begin

f1book1.ShowHScrollBar :=0-f1off;//隐藏水平滚动条

f1book1.ShowSelections :=0-f1on;//显示选中框

f1book1.ShowTabs :=f1tabsoff;////隐藏表键

f1book1.ShowVScrollBar :=0-f1off;//隐藏垂直滚动条

f1book1.ShowTypeMarkers :=true;//标记类型

f1book1.ShowRowHeading :=false;//隐藏行的页眉

f1book1.ShowGridLines :=false;//隐藏网格线

f1book1.ShowEditBar :=true;//显示编辑条

f1book1.ShowColHeading :=false;//隐藏列的页眉

实例 63 DBLookupComboBox、DBLookupListBox——循环

填充列表

实例效果 Delphi控件提供的强大功能,在本例中再次体现出来。我们进行数据库编程时,经常要把

某个字段名下的字段显示在某个控件里,比如显示在 ComboBox和 ListBox里。而这通常需要很多代码才能实现。但用 Delphi自带的 DBLookupComboBox控件和 DBLookupListBox控件,不用代码就可实现上述功能。该例演示的是“DBDEMOS”数据库里“country.db”表,字段名为“Name”下的所有字段,如图 63-1所示。

国 Delphi 7控件实用程序设计 100例

– 184 –

图 63-1 效果图

控件说明 DBLookupComboBox和 DBLookupListBox控件分别循环填充 ComboBox、ListBox列表。 1.其主要属性如表 63-1、63-2所示。

表 63-1 DBLookupComboBox控件主要属性 属性 作用 本例设置 备注

ListSource 连接数据源 在代码里设置 ListField 设置要显示的字段名 在代码里设置 KeyField 设置主键字段 在代码里设置 KeyValue 获得控件里的值 DropDownRows 设置下拉列表显示几行 7 DropDownWidth 设置下拉列表的宽度 0 “0”是默认值,和控件的宽度相同

2.DBLookupComboBox控件主要方法。 Create:创建控件。 Invalidate:结束。 3.该控件主要事件。 OnEnter:当该控件获得焦点时,按下“Enter”键,此事件发生。 OnExit:当该控件失去焦点时,此事件发生。

表 63-2 DBLookupListBox控件主要属性 属性 作用 本例设置 备注

ListSource 连接数据源 在代码里设置 在代码里设置 ListField 设置要显示的字段名 在代码里设置 KeyField 设置主键字段 在代码里设置 KeyValue 获得控件里选中的值 Brush 画刷 RowCount 当前行数 DataSource 设置数据源

4.WordApplication控件主要方法。

第五篇 数据库与报表国

– 185 –

Update:修改。 Free:释放。 NewInstance:新的实例。 5.该控件主要事件和 DBLookupComboBox控件相同,在此不再叙述。 6.控件性质:以上控件为 Delphi自带控件(在 Data Control组件页)。 注意:DBLookupComboBox控件和 DBLookupListBox控件的一些属性、方法、事件都基本相同,知道了一个,另一个就差不多。但它们都有一个缺陷,就是显示同一个

字段名,相同的字段也显示出来,也就是它们不能消除重复的字段。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置一个 Table控件、一个 DataSource控件,Table控件和 DataSource控件连

接数据库在代码里设置。 3.在窗体上放置 DBLookupComboBox和 DBLookupListBox控件各一个,其中它们的属

性就为系统默认设置。 详细设置请参见光盘,最后完成界面如图 63-2所示。

图 63-2 设计期界面图

二、源代码及注释 procedure TForm1.FormCreate(Sender: TObject);

begin

table1.DatabaseName :='DBDEMOS';//连接数据库

table1.TableName :='country.db'; //连接表

table1.Active :=true; //打开数据库

DataSource1.DataSet :=table1; //连接数据集

DBLookupComboBox1.ListSource :=datasource1;//连接数据集

DBLookupComboBox1.ListField :='name'; //连接字段名

DBLookupComboBox1.KeyField :='name'; //连接主键字段名

DBLookupListBox1.ListSource :=datasource1;

国 Delphi 7控件实用程序设计 100例

– 186 –

DBLookupListBox1.ListField :='name';

DBLookupListBox1.KeyField :='name';

end;

实例 64 AdvColumnGrid——突出显示特殊数据

实例效果 在数据库应用程序中,往往需要某一列显示得很醒目,如显示查询结果或含有特别信息的

记录。本实例用 AdvColumnGrid 控件很轻松地实现了此功能,它可以设置任意一列的字体大小、颜色以及显示内容的位置(包括靠左、靠右、靠中)。效果如图 64-1、64-2所示。

图 64-1 运行界面图(1)

图 64-2 运行界面图(2)

第五篇 数据库与报表国

– 187 –

控件说明 本例主要讲解了 AdvColumnGrid 控件的使用,我们从上图中看到了该控件的视觉效果。

感觉很吃惊吧!另外,它可以把 AdvColumnGrid 控件里的内容保存为 Excel 文件格式,也可以载入 Excel文件格式的内容。

1.该控件主要属性如表 64-1所示。 表 64-1 AdvColumnGrid控件属性

属性 作用 本例设置 备注 savefixedcells 是否保存为 Excel文件格式 loadfromcsv 载入 Excel文件格式的内容 loadcolumnsfromstream 载入文件 savecolumnstostream 保存文件 columns 设置每列的情况 columnbyname 设置每列名称

2.该控件主要事件。 OnCustromCellDraw事件:绘画单元格时触发此事件。 OnClickCell事件:当鼠标单击某个单元格时触发此事件。 OnCheckBoxClick事件:当鼠标单击该控件里的选项按钮时触发此事件。 3.控件性质:该控件为免费性的第三方控件。 4.下载地址:http://www.tmssoftwave.com/。

制作步骤 一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 AdvColumnGrid控件、8个 SpeedButton控件、一个 FontDialog控件和一个 ColorDialog控件。完成界面如图 64-3所示。

图 64-3 设计期界面

国 Delphi 7控件实用程序设计 100例

– 188 –

2.双击 AdvColumnGrid控件,出现编辑窗口,增加、删除、修改页面,如图 64-4所示。

图 64-4 页面编辑

二、源代码及注释 procedure TForm1.FormCreate(Sender: TObject);

begin

advcolumngrid1.savefixedcells:=false;

advcolumngrid1.loadfromcsv('cars.csv');//载入 Excel文件格式的内容

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

fs:tfilestream;

begin

if not fileexists('columns.str') then

begin

showmessage('Column settings file not found');

exit;

end;

fs:=tfilestream.Create('columns.str',fmOpenRead);

advcolumngrid1.loadcolumnsfromstream(fs);

fs.free;

end;

//保存控件里的内容

procedure TForm1.SpeedButton2Click(Sender: TObject);

var

fs:tfilestream;

begin

fs:=tfilestream.Create('columns.str',fmCreate);

advcolumngrid1.savecolumnstostream(fs);

fs.free;

第五篇 数据库与报表国

– 189 –

end;

//设置某列的字体效果

procedure TForm1.SpeedButton3Click(Sender: TObject);

begin

if fontdialog1.execute then

begin

advcolumngrid1.columns.items[advcolumngrid1.col].font.assign(fontdialog1.font);

end;

end;

//设置某列字体颜色

procedure TForm1.SpeedButton4Click(Sender: TObject);

begin

if colordialog1.execute then

begin

advcolumngrid1.columns.items[advcolumngrid1.col].color:=colordialog1.color;

end;

end;

//设置某列的内容靠左

procedure TForm1.SpeedButton5Click(Sender: TObject);

begin

advcolumngrid1.columns.items[advcolumngrid1.col].alignment:=taLeftJustify;

end;

//设置某列的内容靠中

procedure TForm1.SpeedButton6Click(Sender: TObject);

begin

advcolumngrid1.columns.items[advcolumngrid1.col].alignment:=taCenter;

end;

//设置某列的内容靠右

procedure TForm1.SpeedButton7Click(Sender: TObject);

begin

advcolumngrid1.columns.items[advcolumngrid1.col].alignment:=taRightJustify;

end;

//超级连接

procedure TForm1.Label1Click(Sender: TObject);

begin

shellexecute(self.handle,'open','http://www.tmssoftware.com',nil,nil,SW_NORMAL);

end;

procedure TForm1.SpeedButton8Click(Sender: TObject);

begin

国 Delphi 7控件实用程序设计 100例

– 190 –

advcolumngrid1.columnbyname['Car'].Rows[1] := '* '+

advcolumngrid1.columnbyname['Car'].Rows[1];

end;

实例 65 DBTreeView——数据库树形视图

实例效果 本例使用 DevExpress 公司的 DBTreeView 控件,显示数据库里的内容,它有两点值得称

道:一是树形视图直接与数据库关联;二是不用编写任何程序代码就可直接在 Tree 里显示数据库数据(当然一定要按它的格式建表)。这为程序员省去了很大麻烦。还有一点突出之处就

是对于操作数据量很大的数据库来讲,速度优势非常明显,这也充分显示了第三方控件

DBTreeView的强大功能,运行界面如图 65-1、图 65-2所示。

图 65-1 运行界面图(1)

图 65-2 运行界面图(2)

第五篇 数据库与报表国

– 191 –

控件说明 树形视图 TreeView 在表现数据的层次关系时效果十分直观,但 Delphi 自带的树形视图

TreeView控件没有专门针对数据库的属性设置,若实现在树形视图 TreeView控件中显示数据库中的数据,则需要设置比较复杂的代码,使用遍历方法编程实现,而且需要做相应优化代码

设置,以保证数据库中大量数据处理的速度。 1.DBTreeView控件的主要属性如表 65-1所示。

表 65-1 控件属性 属性 作用 本例设置 备注

DataSourse 设置数据源控件 DS1 KeyField 关键字段 Pr_id ListField 列表字段 Pr_name 最低优先级 ListSourse 列表源 DS1 ParentField 父字段 Pr_parent TreeViewImages 节点图形 ImageList1

2.该控件的主要事件。 OnAddNewItem:增加新项时触发。 OnGetImageIndex:获得节点图形索引时触发。 3.该控件的主要方法。 Selected:选择项。 Show:显示。 Refresh:刷新。 4.控件性质:本控件为第三方共享控件。 5.下载地址:http://www.playicq.com/。 注意:属性 KeyField 、ParentField 对应的数据库字段的类型必须相同,否则无法显示效果,在设计数据库时应注意设置。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加两个

Table控件、两个 DataSourse控件、一个 ImageList控件、一个 DBTreeView控件以及一些其他相关控件如图 65-3所示。

2.设置 Table控件的 DataBaseName属性为 DBDEMOS,Table属性值为 project.db,Name属性值为 T1;设置 DataSourse控件的 Dataset属性为 T1,在 ImageList控件上增加几个图形,最后按表 65-1所示设置 DBTreeView控件的属性。

完成界面如图 65-3所示。

国 Delphi 7控件实用程序设计 100例

– 192 –

图 65-3 设计期界面

二、源代码及注释 procedure TForm1.CheckBox1Click(Sender: TObject);

begin

if(CheckBox1.Checked) then

DBTreeView1.DragMode := dmAutomatic//设置为拖动

else DBTreeView1.DragMode := dmManual;

end;

//删除节点

procedure TForm1.BitBtnDelClick(Sender: TObject);

begin

if (DBTreeView1.Selected <> Nil) then

DBTreeView1.Selected.Delete;

end;

//编辑节点

procedure TForm1.BitBtnEditClick(Sender: TObject);

begin

if (DBTreeView1.Selected <> Nil) then

DBTreeView1.Selected.EditText;

end;

//增加节点

procedure TForm1.BitBtnAddClick(Sender: TObject);

begin

DBTreeView1.Items.Add(DBTreeView1.Selected, 'New Item');

end;

//增加子节点

procedure TForm1.BitBtnAddChildClick(Sender: TObject);

第五篇 数据库与报表国

– 193 –

begin

if (DBTreeView1.Selected <> Nil) then

DBTreeView1.Items.AddChild(DBTreeView1.Selected,'Child of ' + DBTreeView1.Selected.Text);

end;

//节点间的拖动

procedure TForm1.DBTreeView1DragDropTreeNode(Destination,

Source: TTreeNode; var Accept: Boolean);

begin

if Destination = nil then

begin

Accept := False;

exit;

end;

if Source.TreeView = Form2.dxTreeView1 then

begin

Accept := True;

exit;

end;

if(CheckBox3.Checked) then

Accept := Source.Level > Destination.Level;

if Accept and (CheckBox4.Checked) then

Accept := Not (Source.Parent = Nil);

end;

//TreeView每行显示什么颜色

procedure TForm1.DBTreeView1CustomDraw(Sender: TObject;

TreeNode: TTreeNode; AFont: TFont; var AColor, ABKColor: TColor);

begin

if not CheckBox5.Checked then exit;

if(TreeNode.Index mod 2 = 0) then begin

AFont.Style := [fsBold];

AColor := clBlue;

end else begin

ABKColor := clYellow;

AColor := clRed;

end;

end;

procedure TForm1.CheckBox5Click(Sender: TObject);

begin

DBTreeView1.repaint;

国 Delphi 7控件实用程序设计 100例

– 194 –

end;

//节点所显示图标

procedure TForm1.DBTreeView1AddNewItem(Sender: TObject;

var DBTreeNode: TdxDBTreeNode);

begin

if VarIsNull(DBTreeNode.ParentFieldValue) then exit;

if (DBTreeNode.KeyFieldValue >= 150)

and (DBTreeNode.KeyFieldValue < 200) then begin

DBTreeNode.ImageIndex := 0;

DBTreeNode.SelectedIndex := 0;

exit;

end;

if (DBTreeNode.KeyFieldValue > 200) then begin

DBTreeNode.ImageIndex := 1;

DBTreeNode.SelectedIndex := 1;

exit;

end;

DBTreeNode.ImageIndex := 2;

DBTreeNode.SelectedIndex := 2;

end;

//增加节点

procedure TForm1.DBLookUpTreeView1AddNewItem(Sender: TObject;

var DBTreeNode: TdxDBTreeNode);

begin

DBTreeView1AddNewItem(Sender, DBTreeNode);

end;

//打开数据库

procedure TForm1.FormCreate(Sender: TObject);

begin

T1.DataBaseName := ExtractFilePath(Application.ExeName);

T1.Open;

T2.DataBaseName := T1.DataBaseName;

T2.Open;

end;

实例 66 dxDBGrid——多功能数据表格

实例效果 本例使用 DevExpress公司的 dxDBGrid控件,显示数据库里的内容。它可以统计记录数、

第五篇 数据库与报表国

– 195 –

求数值平均值、求数值最大和最小值。还可以排序、查询,以及选中多条记录,把表里的数据

保存为 XML、XLS、HTML文档格式。运行界面如图 66-1、图 66-2所示。

图 66-1 运行界面图(1)

图 66-2 运行界面图(2)

控件说明 dxDBGrid是 DBGrid的增强控件,功能也要强很多。使用 dxDBGrid显示数据十分直观,

特别是数据库中有大量的数据要显示记录数时。dxDBGrid界面效果更是 DBGrid无法比拟的。 1.dxDBGrid控件的主要属性如表 66-1所示。 表 66-1 控件属性 属性 作用 本例设置 备注

DataSourse 设置数据源控件 DataSource1

OptionDB里的edgoLoadAllRecords

载入数据,即求个数、求平均、求总数

求最大最小等,它必须设为 True True

国 Delphi 7控件实用程序设计 100例

– 196 –

续表

属性 作用 本例设置 备注 ShowGrid 是否显示网格 试情况而设,手动设 最低优先级 ShowHeader 是否显示字段头 试情况而设,手动设

ScroolBars 显示滚动条类型 ssBoth

2.该控件的主要事件。 OnCustomDraw:对控件进行绘图。 OnEditing:设置控件以及某个字段是否可编辑。 3.该控件的主要方法。 SaveToHTML:将 GRID里的数据保存为 HTML格式。 SaveToText:将 GRID里的数据保存为 TEXT格式。 SaveToXLS:将 GRID里的数据保存为 XLS格式。 SaveToXML:将 GRID里的数据保存为 XML格式。 4.控件性质:本控件为第三方共享控件。 5.下载地址:http://www.playicq.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加 1个

Table控件、1个 DataSourse控件、3个 Button控件、1个 dxDBGrid控件以及其他相应控件。 2.设置 Table控件的DataBaseName属性为DBDEMOS,Table属性值为 CUSTOMER.DB,

Name属性值为 Table1;设置 DataSourse控件的 Dataset属性为 Table1,最后按表 66-1所示设置 dxDBGrid控件的属性。要设置 dxDBGrid控件的属性,可以在 dxDBGrid控件上单击右键,选择 QuantumWizard…进行它的属性设置。完成界面如图 66-3所示。

图 66-3 设计期界面

第五篇 数据库与报表国

– 197 –

二、源代码及注释 procedure TfmMain.FormCreate(Sender: TObject);

begin

SaveDialog.InitialDir := ExtractFilePath(Application.ExeName); //保存路径

end;

//写的一个保存过程

procedure TfmMain.Save(ADefaultExt, AFilter, AFileName: String; AMethod: TSaveMethod);

begin

with SaveDialog do

begin

DefaultExt := ADefaultExt;

Filter := AFilter;

FileName := AFileName;

if Execute then

AMethod(FileName, cbSaveAll.Checked);

end;

end;

//把表里的数据保存为 HTML文档格式

procedure TfmMain.btHTMLClick(Sender: TObject);

begin

Save('htm', 'HTML File (*.htm; *.html)|*.htm', 'ExpGrid.htm', dxDBGrid.SaveToHTML);

end;

//把表里的数据保存为 XLS文档格式

procedure TfmMain.btExcelClick(Sender: TObject);

begin

Save('xls', 'Microsoft Excel 4.0 Worksheet (*.xls)|*.xls', 'ExpGrid.xls', dxDBGrid.SaveToXLS);

end;

//把表里的数据保存为 XML文档格式

procedure TfmMain.btnXMLClick(Sender: TObject);

begin

Save('xml', 'XML File (*.xml)|*.xml', 'ExpGrid.xml', dxDBGrid.SaveToXML);

end;

//载入记录,以显示统计、平均等结果

procedure TfmMain.cbLoadAllRecordsClick(Sender: TObject);

begin

with Sender as TdxCheckEdit do

if Checked then

dxDBGrid.Options := dxDBGrid.Options + [egoLoadAllRecords]

else dxDBGrid.Options := dxDBGrid.Options - [egoLoadAllRecords];

国 Delphi 7控件实用程序设计 100例

– 198 –

end;

//可以选中多列

procedure TfmMain.cbMultiSelectClick(Sender: TObject);

begin

with Sender as TdxCheckEdit do

if Checked then

dxDBGrid.Options := dxDBGrid.Options + [egoMultiSelect]

else dxDBGrid.Options := dxDBGrid.Options - [egoMultiSelect];

end;

//显示统计等结果

procedure TfmMain.cbShowFooterClick(Sender: TObject);

begin

with Sender as TdxCheckEdit do

dxDBGrid.ShowSummaryFooter := Checked;

end;

//显示网格线

procedure TfmMain.cbShowGridClick(Sender: TObject);

begin

with Sender as TdxCheckEdit do

dxDBGrid.ShowGrid := Checked;

end;

//显示字段名

procedure TfmMain.cbShowHeaderClick(Sender: TObject);

begin

with Sender as TdxCheckEdit do

dxDBGrid.ShowHeader := Checked;

end;

实例 67 wwIncrementalSearch——实时查询控件

实例效果 在编辑实时查询时,多数情况是编写一大堆程序代码,这不但影响查询速度(特别是有上

万条记录时),而且还影响程序的执行效率。本实例使用 wwIncrementalSearch第三方控件实现了实时查询功能。它的最大特点是不用编写任何程序代码,查询速度非常快(查询上万条记录

时就能明显感觉到)。下面演示了分别输入 11、22、3333的查询效果。如图 67-1、67-2、67-3所示。

第五篇 数据库与报表国

– 199 –

图 67-1 运行界面图(1) 图 67-2 运行界面图(2)

图 67-3 运行界面图(3)

控件说明 本例主要讲解了 wwIncrementalSearch查询控件,一般在编写这类程序时,往往要编写很

多代码,通过模糊查询,在控件的 OnChang事件里实现。而 wwIncrementalSearch控件只需要设置相应的属性就轻松实现此功能。

1.该控件主要属性如表 67-1所示。 表 67-1 wwIncrementalSearch控件属性

属性 作用 本例设置 备注 AutoSelect 是否自动查询 True Ctl3D 是否显示 3D True DataSource 设置数据源 DataSource1 Frame 设置该控件的结构 MaxLength 设置该控件的最大长度 PictureMask 设置图片格式 SearchField 设置查找字段

国 Delphi 7控件实用程序设计 100例

– 200 –

2.该控件主要事件。 OnAfterSearch:当查询之后时触发此事件。 OnChange事件:当该控件里的内容变换时触发此事件。 3.控件性质:wwIncrementalSearch是著名控件包 infoPower中的一个控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 wwIncrementalSearch控件、一个 wwKeyCombo控件、一个 wwTable控件、一个 DataSource控件以及一些配套组件。

2.WwTable控件的 DataBaseName属性设为 InfoDemo5,TableName属性设为 IP4ZIP.DB,Active属性设为 True;DataSource1控件的 DataSet 属性设为WwTable1,wwIncrementalSearch1控件和 wwKeyCombo1控件的 DataSource属性设为 DataSource1 完成界面如图 67-4所示。

图 67-4 设计期界面

二、源代码及注释 procedure TIncrSearch.wwKeyCombo1Change(Sender: TObject);

begin

wwIncrementalSearch1.text:= '';

wwIncrementalSearch1.setFocus;// wwIncrementalSearch控件得到焦点

end;

实例 68 DBInspectorBar——全能数据库导航条 实例效果 DBInspectorBar控件类似于 OutLook,它同样可以实现 OutLook的功能,并且还比它强大

第五篇 数据库与报表国

– 201 –

得多。本实例通过 Data fields项实现和数据库的连接,读者看到的并不是使用 DEText、DBEdit、DBComboBox 等添加上去的,而是通过设置 DBInspectorBar 控件实现的。它可以设置我们需要的所有类型,如 DEText、DBEdit、DBComboBox、DBMemo、DBCheckBox、DateTimePicker等控件类型。同时他还可以把 DBNavigator控件添加到 Panel上,并改变它的图标(Navigtor in inspector和 GlyFX Navigator style : see选项同时选中),如图 68-1、68-2、68-3所示。

图 68-1 运行界面图 1

图 68-2 运行界面图 2

国 Delphi 7控件实用程序设计 100例

– 202 –

图 68-3 运行界面图 3

控件说明 本例主要讲解了 DBInspectorBar 控件,该控件每个单独的组都包括一个容器面板,允许

将所需要的任何控件加入到面板中。 1.该控件主要属性如表 68-1所示。

表 68-1 DBInspectorBar控件属性 属性 作用 本例设置 备注

AcceptFiles 设置是否接受文件 CheckFalse CheckTrue

设置是否选中 False True

Ellipsis 是否省略 TopPanel 设置所中的是哪个 Panel 1 PanelCaption 设置 Panel的标题包括字体颜色等

表 68-2 Panels属性 属性 作用 本例设置 备注

Alignment 设置标题的位置 taCenter Caption 设置标题 EditBox 是否为编辑框 GradientDirectin 设置标题是水平还是垂直 gdVertical Style 设置类型 psProperties Textture 设置文本图片 DataSource 设置数据源

2.该控件主要事件。 OnButtonClick事件:当鼠标单击 DBInspectorBar中的按钮时触发此事件。

第五篇 数据库与报表国

– 203 –

OnEditBtnClick事件:当鼠标单击 DBInspectorBar中的编辑按钮时触发此事件。 3.控件性质:DBInspectorBar 是免费的第三方控件。该控件能够开发出类似 MicroSoft

OutLook的界面效果。 4.下载地址:http://www.tmssoftwavel.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 DBInspectorBar 控件、一个 DBGrid 控件、一个 Table 控件、一个 DataSource 控件、一个DBNavigator控件和两个 CheckBox控件。完成界面如图 68-4所示。

图 68-4 设计期界面

2.双击 DBInspectorBar控件,出现编辑窗口,增加、删除、修改页面,如图 68-5所示。

图 68-5 页面编辑

国 Delphi 7控件实用程序设计 100例

– 204 –

3.单击 Items属性 右边的按钮,出现按钮编辑窗口,增加、

删除、修改按钮,如图 68-5所示。

图 68-6 按钮编辑

二、源代码及注释 //把 Navigator控件添加到 DBInspectorBar1.Panels[1]上

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

DBInspectorBar1.Panels[1].ShowNavigator := Checkbox1.Checked;

DBNavigator1.Visible := not CheckBox1.Checked;

end;

//超连接

procedure TForm1.Label1Click(Sender: TObject);

begin

shellexecute(0,'open',pchar(label1.Caption),nil,nil,SW_NORMAL);

end;

//当选中 CheckBox2时,Navigator控件变为有图形

procedure TForm1.CheckBox2Click(Sender: TObject);

begin

if checkbox2.Checked then

DBInspectorBar1.Navigator.ButtonStyle := bsGlyphs

else

DBInspectorBar1.Navigator.ButtonStyle := bsDefault;

end;

第六篇 系统、文件及其他 Delphi 7的控件应用,可以说丰富多彩、功能强大,与流行技术紧密融合,在图形处理、

信息安全、动画显示、文档应用等方面,技术先进,引导潮流,可以说,凡是在算法语言中可

以实现的系统应用,使用 Delphi 7控件都可以实现,大大加强了系统的安全性、灵活性、可靠性,充分表现了 Delphi 7系统相关控件方面的强大功能。 本部分将重点介绍 Delphi 7 关于系统、文件及其他相关内容控件,讲述如何利用

SkinEngine、TsearchFolders、SimplePie、PrintPreview Tamdesktop等 Delphi 7丰富的系统、文件类控件进行 XP皮肤更换、文件的扫描查找、饼图进度条、打印预览、桌面背景动画效果等相关操作,同时还为读者提供了 Delphi 7系统相关技术的其他一些常用技巧,使读者对 Delphi 7系统、文件类控件技术有基本的理解与掌握。

本部分主要有以下精彩内容:

SkinEngine——XP皮肤更换;

TsearchFolders——文件的扫描查找;

PrintPreview——打印预览;

DsnRegister——运行时 IDE设计环境。

国 Delphi 7控件实用程序设计 100例

– 206 –

实例 69 AniIcon——动画光标

实例效果 动画光标(.ani)是一种效果独特的光标形式,一般调用比较麻烦。在 Delphi 7中通过第

三方 AniIcon控件,我们可以轻松实现该功能。运行本程序,AniIcon控件会自动查找Windows下的 ANI文件,在实例左边的列表框内,当我们选中一个 ANI文件时,该动画光标就会显示在 AniIcon控件上,如果鼠标放在 AniIcon控件上,鼠标也会变成相同的动画光标,效果如图69-1所示。

图 69-1 运行界面图

控件说明 通过 AniIcon控件可以设置动画光标,这为实现 XP效果提供了很大的方便。 1.该控件主要属性如表 69-1所示。

表 69-1 AniIcon控件属性 属性 作用 本例设置 备注

AniFile 载入 ANI文件类型 Animated 是否活动 True ButtonStyle 是否为按钮类型 True Center 是否在中间 True Transparent 是否透明 False

第六篇 系统、文件及其他国

– 207 –

2.该控件主要事件。 OnClick事件:鼠标点击该控件时触发此事件。 OnMouseMove事件:鼠标移动到该控件时触发此事件。 3.控件性质:该控件为免费性的第三方控件。 4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 Panel控件,在它之上添加一个 AniIcon控件。 2.另外还应增加一个 FileListBox控件、一个 DirectoryListBox控件、一个 DriveComboBox

控件以及其他相应控件。完成界面如图 69-2所示。

图 69-2 设计期界面

二、源代码及注释 //定义一个函数

function TheWindowsDirectory: string;

var

WinDir: PChar;

WindowsDirectory: string;

begin

GetMem(WinDir, 144);

GetWindowsDirectory(WinDir, 144);

WindowsDirectory := StrPas(WinDir);

FreeMem(WinDir, 144);

result := WindowsDirectory;

end;

国 Delphi 7控件实用程序设计 100例

– 208 –

procedure Tfrm_Main.DirectoryListBox1Change(Sender: TObject);

begin

FileListBox1.Directory := DirectoryListBox1.Directory;

end;

//获取 ani文件

procedure Tfrm_Main.FormCreate(Sender: TObject);

var

StartParam: string;

begin

StartParam := UpperCase(ParamStr(1));

if StartParam <> '' then

begin

AniIcon1.AniFile.LoadFromFile(StartParam);

DirectoryListBox1.Directory := ExtractFileDir(StartParam);

FileListBox1.FileName := StartParam;

end

else

DirectoryListBox1.Directory := TheWindowsDirectory + '\CURSORS\';

screen.cursors[anicursor+1]:=aniicon2.AniFile.getcursorhandle;

screen.cursors[anicursor+2]:=aniicon3.AniFile.getcursorhandle;

label2.cursor:=anicursor+1;

label3.cursor:=anicursor+2;

end;

//设置成动画光标

procedure Tfrm_Main.chk_AnimatedClick(Sender: TObject);

begin

AniIcon1.Animated := chk_Animated.Checked;

end;

//关闭窗体

procedure Tfrm_Main.Button1Click(Sender: TObject);

begin

Close;

end;

procedure Tfrm_Main.FileListBox1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

case Key of

46: DeleteItem;

113: ShowMessage(FileListBox1.FileName);

end;

第六篇 系统、文件及其他国

– 209 –

end;

//删除文件

procedure Tfrm_Main.DeleteItem;

var

TempIndex: Integer;

begin

TempIndex := FileListBox1.ItemIndex;

DeleteFile(FileListBox1.FileName);

FileListBox1.Update;

FileListBox1.ItemIndex := TempIndex;

FileListBox1Change(nil);

end;

//改变 ani文件

procedure Tfrm_Main.FileListBox1Change(Sender: TObject);

begin

AniIcon1.AniFile.LoadFromFile(FileListBox1.FileName);

screen.cursors[anicursor]:=AniIcon1.AniFile.GetCursorHandle;

if chk_Cursor.Checked then self.Cursor:=anicursor;

panel1.cursor:=anicursor;

aniicon1.cursor:=anicursor;

end;

procedure Tfrm_Main.chk_CursorClick(Sender: TObject);

begin

if chk_Cursor.checked then self.Cursor:=anicursor else self.Cursor:=crDefault;

end;

//实现超级连接

procedure Tfrm_Main.Label2Click(Sender: TObject);

begin

ShellExecute(Application.Handle,'open','http://www.tmssoftware.com', nil, nil, SW_NORMAL);

end;

//实现超级连接

procedure Tfrm_Main.Label3Click(Sender: TObject);

begin

ShellExecute(Application.Handle,'open','mailto:[email protected]', nil, nil, SW_NORMAL);

end;

//把 aniicon控件设置成类型按钮

procedure Tfrm_Main.CheckBox1Click(Sender: TObject);

begin

aniicon1.buttonstyle:=checkbox1.checked;

国 Delphi 7控件实用程序设计 100例

– 210 –

end;

实例 70 FcLabel——三维标签效果

实例效果 有时为了在界面上实现 3D效果,要浪费很多时间和精力。本实例用 FcLabel控件轻松实

现了此功能,此外该控件还能设置字体的显示方式、显示角度。效果如图 70-1、70-2所示。

图 70-1 运行界面图(1)

图 70-2 运行界面图(2)

控件说明 本例主要讲解了 FcLabel 控件,FcLabel 控件比 Label 控件的功能强大而且实用。该控件

主要用于设置显示文字,也可以显示数据表里字段内容。该控件主要设置 TextOptions属性。读者可以自行设置,看看它的特技效果。

第六篇 系统、文件及其他国

– 211 –

1.该控件主要属性如表 70-1所示。

表 70-1 FcLabel控件属性 属性 作用 本例设置 备注

Caption 设置文本 DataField 设置字段 DataSource 设置数据源 TextOptions 设置文本类型(这个属性最重要) Transparent 是否透明

2.该控件主要事件。 OnClick事件:鼠标单击该控件时触发此事件。 OnDblClick事件:鼠标双击该控件时触发此事件。 3.控件性质:FcLabel是著名控件包 1stClass中的一个控件。为商业性的第三方控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 启动 Delphi ,单击菜单 File/New Application 项,新建一个工程,在 Form1 上添加数个

FcLabel控件以及其他相关配套控件。 完成界面如图 70-3所示。

图 70-3 设计期界面

二、源代码及注释 //设置字体类型

procedure TFcLabel.RadioGroup1Click(Sender: TObject);

begin

fcLabel39.Font.Color := clBtnFace;

case RadioGroup1.ItemIndex of

国 Delphi 7控件实用程序设计 100例

– 212 –

0: begin

fcLabel35.TextOptions.Style := fclsDefault;

fcLabel39.TextOptions.Style := fclsDefault;

fcLabel39.Font.Color := clBlack;

fcLabel40.TextOptions.Style := fclsDefault;

end;

1: begin

fcLabel35.TextOptions.Style := fclsRaised;

fcLabel39.TextOptions.Style := fclsRaised;

fcLabel40.TextOptions.Style := fclsRaised;

end;

2: begin

fcLabel35.TextOptions.Style := fclsLowered;

fcLabel39.TextOptions.Style := fclsLowered;

fcLabel40.TextOptions.Style := fclsLowered;

end;

3: begin

fcLabel35.TextOptions.Style := fclsOutline;

fcLabel39.TextOptions.Style := fclsOutline;

fcLabel40.TextOptions.Style := fclsOutline;

end;

end;

end;

procedure TFcLabel.fcButtonGroup1Change(

ButtonGroup: TfcCustomButtonGroup; OldSelected,

Selected: TfcButtonGroupItem);

begin

PageControl1.ActivePage :=

(FindComponent('TabSheet'+IntToStr(Selected.Button.Tag)) as TTabSheet);

end;

//设置字体颜色

procedure TFcLabel.fcLabel1MouseEnter(Sender: TObject);

begin

(Sender as TfcLabel).Font.Color := clBlue;

end;

//设置字体颜色

procedure TFcLabel.fcLabel1MouseLeave(Sender: TObject);

begin

(Sender as TfcLabel).Font.Color := clBlack;

第六篇 系统、文件及其他国

– 213 –

end;

//超级连接

procedure TFcLabel.fcLabel1Click(Sender: TObject);

begin

ShellExecute(Handle, 'OPEN',

PChar('https://www.he.net/cgi-bin/suid/~wol2wol/ordering/order.cgi'),

nil, nil, sw_shownormal);

end;

实例 71 MoneyEdit——货币输入计算框

实例效果 应用程序开发时,往往要涉及到Money输入,而 Delphi自带控件使用起来很别扭。本例

介绍一个第三方MoneyEdit控件,该控件不管是在输入数值上还是使用上都非常简便。最让人感到意外的是该控件还自带了计算功能,也就是我们在输入数字时如遇到需要计算的数值,这

个计算器就可以派上用场了。效果如图 71-1、图 71-2所示。

图 71-1 运行界面图(1) 图 71-2 运行界面图(2)

控件说明 本例主要讲解了 MoneyEdit控件,该控件主要是为了输入 Money而设计的,同时兼有很

多计算功能。 1. 该控件主要属性如表 71-1所示。

国 Delphi 7控件实用程序设计 100例

– 214 –

表 71-1 MoneyEdit控件属性 属性 作用 本例设置 备注

ButtonGlyph 设置该控件右边按钮的图标 AutoSelect 是否自动选择 BorderStyle 设置边框类型 EditorEnabled 是否可以编辑该控件

2.该控件主要事件。 OnChang事件:当改变该控件的内容时触发此事件。 OnClickBtn事件:当单击该控件右边的按钮时触发此事件。 3.控件性质:该控件为免费性的第三方控件。 4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 5个

Label控件和 5个MoneyEdit控件。完成界面如图 71-3所示。

图 71-3 设计期界面

二、源代码及注释 procedure TForm1.MoneyEdit5ExtraButtonClick(Sender: TObject; idx: Integer;

var value: Extended);

begin

case idx of

1:value:=sqr(value);

2:value:=sqrt(value);

3:value:=value*47/40.3399;

4:value:=value*40.3399/47;

第六篇 系统、文件及其他国

– 215 –

end;

end;

实例 72 ParamTreeview——多功能树形控件

实例效果 本例向大家介绍 ParamTreeview树形控件。它可以实现选择功能,能设置时间,能编辑任

何节点,如图 72-1、图 72-2所示。

图 72-1 运行界面图 1

图 72-2 运行界面图 2

国 Delphi 7控件实用程序设计 100例

– 216 –

控件说明 本例主要讲解了 ParamTreeview控件,该控件同样是一个树形控件,但有别于其他树形控

件,上面的图片演示了它与别的树形控件区别的特殊之处。 1.该控件主要属性如表 72-1所示。 表 72-1 ParamTreeview控件属性

属性 作用 本例设置 备注 AutoExpand 是否自动展开 true Items 设置节点

ParamColor 设置节点颜色 RowSelect 是否显示节点被选中 true

ShowButtons 是否显示节点按钮 true

ShowRoot 是否显示节点的根 true

ShowLines 是否显示节点间的连线 true

2.该控件主要事件。 OnChang事件:当改变节点时触发此事件。 OnCollapsing事件:当节点伸缩时触发此事件。 OnCustomDrawItem事件:当绘画节点时触发此事件。 3.控件性质:该控件为免费性的第三方控件。 4.下载地址:http://www.tmssoftware.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加两

个 Button控件、一个 ParamTreeview控件和一个 Edit控件。完成界面如图 72-3所示。

图 72-3 设计期界面

第六篇 系统、文件及其他国

– 217 –

2.单击 Items属性,出现页面编辑窗口,增加、删除、修改页面,如图 72-4所示。

图 72-4 页面编辑

二、源代码及注释 procedure TForm1.ParamTreeview1ParamClick(Sender: TObject;

ANode: TTreeNode; href: String; var value: String);

begin

if (href='os') or (href='cancel') then

if value='Yes' then value:='No' else value:='Yes';

if (href='name') then

InputQuery('Customer','Name',value);

end;

//增加选项

procedure TForm1.ParamTreeview1ParamList(Sender: TObject; ANode: TTreeNode;

href: String; values: TStringList; var DoPopup: Boolean);

begin

if href='cpu' then

begin

dopopup:=true;

values.Add('Pentium 750');

values.Add('Pentium 800');

values.Add('Pentium 900');

values.Add('Pentium 950');

values.Add('AMD 650');

values.Add('AMD 750');

values.Add('AMD 900');

end;

end;

国 Delphi 7控件实用程序设计 100例

– 218 –

//增加选项组

procedure TForm1.ParamTreeview1ParamPopup(Sender: TObject;

ANode: TTreeNode; href: String; values: TStringList;

var DoPopup: Boolean);

begin

if href='case' then

begin

dopopup:=true;

values.Add('Desktop');

values.Add('Midi tower');

values.Add('Maxi tower');

end;

if href='keyb' then

begin

dopopup:=true;

values.Add('Cherry');

values.Add('Logitech');

values.Add('Noname');

end;

end;

//编辑节点

procedure TForm1.Button1Click(Sender: TObject);

begin

Name.Caption := ParamTreeview1.NodeParameter[Paramtreeview1.Items[8],'name'];

end;

//编辑节点内容

procedure TForm1.Button2Click(Sender: TObject);

begin

ParamTreeview1.NodeParameter[Paramtreeview1.Items[8],'name'] := edit1.Text;

end;

实例 73 fcTreeView——精彩树形控件

实例效果 我们前面讲了 DBTreeView和 fcDBTreeView控件,看到了第三方控件功能的强大,也了

解了 TreeView的使用方法以及所起的作用。本实例再为大家推荐另一个树形控件 fcTreeView,该控件可以在节点上设置单选和多选按钮,并在节点上实现超链接功能。效果如图 73-1、73-2、

第六篇 系统、文件及其他国

– 219 –

73-3所示。

图 73-1 运行界面图 1

图 73-2 运行界面图 2

图 73-3 运行界面图 3

控件说明 本例主要讲解了 fcTreeView 控件,该控件是一个树形控件,表示节点间的关系,让操作

者操作起来简洁方便。

国 Delphi 7控件实用程序设计 100例

– 220 –

1.该控件主要属性如表 73-1所示。

表 73-1 fcTreeView控件属性 属性 作用 本例设置 备注

Color 设置树里的背景颜色

Items 设置树的节点

Options 设置节点属性

MultiSelectAttributes 设置多选节点

StateImages 设置节点图标

2.该控件主要事件。 OnChange事件:鼠标改变节点时触发此事件。 OnClick事件:鼠标单击节点时触发此事件。 OnCollapsed事件:节点展开时触发此事件。 OnGetSelectedIndex事件:获得选中的索引值时触发此事件。 3.控件性质:fcTreeView是著名控件包 1stClass中的一个控件。为商业性的第三方控件。 4.下载地址:http://www.woll2woll.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 3个

fcTreeView控件以及其他相关控件。完成界面如图 73-4所示。

图 73-4 设计期界面

2.双击 fcTreeView控件,出现页面编辑窗口,增加、删除、修改节点,还有就是设置图标,如图 73-5所示。

第六篇 系统、文件及其他国

– 221 –

图 73-5 页面编辑

二、源代码及注释 //设置节点的属性

procedure TTreeViewDemoForm.CheckBox1Click(Sender: TObject);

begin

with fcTreeView1 do begin

if tvoExpandButtons3D in Options then

Options:= Options - [tvoExpandButtons3D]

else Options:= Options + [tvoExpandButtons3D]

end

end;

procedure TTreeViewDemoForm.FormShow(Sender: TObject);

begin

fctreeview1.FullExpand;//收缩节点

fctreeview2.FullExpand; //收缩节点

end;

//设置节点的属性

procedure TTreeViewDemoForm.CheckBox2Click(Sender: TObject);

begin

with fcTreeView1 do begin

if (Sender as TCheckBox).checked then

Options:= Options + [tvoRowSelect]

else

Options:= Options - [tvoRowSelect]

end

end;

//设置节点的字体类型

procedure TTreeViewDemoForm.fcTreeView1CalcNodeAttributes(TreeView: TfcCustomTreeView;

国 Delphi 7控件实用程序设计 100例

– 222 –

Node: TfcTreeNode; State: TfcItemStates);

begin

if fcisHot in State then TreeView.Canvas.Font.Style:= TreeView.Canvas.Font.Style + [fsUnderline];

end;

procedure TTreeViewDemoForm.Button1Click(Sender: TObject);

begin

{ Reapply filter by refreshing query locally }

query1.updatecursorpos;//载入记录

query1.resync([rmCenter]);

end;

procedure TTreeViewDemoForm.fcTreeView3ToggleCheckbox(

TreeView: TfcCustomTreeView; Node: TfcTreeNode);

begin

if (Node.Level=1) and (Node.checked) then //如果 Node节点的 Level=1,并且 Node节点被选

Node.parent.checked:= True;//父节点被选中

end;

实例 74 SkinEngine——XP皮肤更换

实例效果 本例使用 SkinEngine控件实现 XP窗口、XP控件效果,而且可以方便更换 XP皮肤,更

奇妙的是可以设置任意透明度的透明窗口,并具有像Winnap一样的磁性窗口效果(即窗口移动到屏幕四周边界时,自动贴紧到四周边界),还可以设置窗口的阴影效果、动画显示。在标

题栏上增加了两个按钮,作用分别为最小化到系统盒、就地缩小为标题栏。运行界面如图 74-1、图 74-2、图 74-3、图 74-4所示。

图 74-1 运行界面图(1) 图 74-2 运行界面图(2)

第六篇 系统、文件及其他国

– 223 –

图 74-3 透明窗口效果 图 74-4 就地缩小为标题栏

控件说明 本例主要介绍了 SkinEngine控件组,SkinEngine控件组共有 27个控件,分为二大类:一

类是 XP皮肤关联控件 SeSkinEngine;另一类是 XP皮肤控件,如 SeSkinForm、SeSkinButton、SeSkinTrackBar、SeSkinLabel等。首先放置 XP皮肤关联控件 SeSkinEngine,关联皮肤文件,然后放置 XP 皮肤控件,并将其 SkinEngine 属性设置为 SeSkinEngine1,就可以实现 XP 皮肤及相关效果了。

1.SeSkinEngine控件、SeSkinForm控件的主要属性如表 74-1、表 74-2所示。

表 74-1 SeSkinEngine控件主要属性 属性 作用 本例设置 备注

SkinFile 皮肤文件

SkinStore 皮肤文件路径 (SkinEngine II Skin)

表 74-2 SeSkinForm控件主要属性 属性 作用 本例设置 备注

Blend 窗口/控件透明 False

BlendValue 透明度

DropShadow 阴影 True

Magnetic 磁性边界 True

MagneticValue 磁性边界距离 20

ShadowWidth 阴影宽度 4

ShowAnimation 动画显示方式 kaSlide 有淡入、滑入等 5种效果 ShowAnimationTime 动画显示时间 400 单位:毫秒 SkinEngine 皮肤关联控件 SeSkinEngine1

SysMenuShowAnimation 菜单动画显示方式

2.SeSkinForm控件的主要事件。 OnPaint:绘制时触发。 TrayMenu:最小化到系统盒时的菜单。

国 Delphi 7控件实用程序设计 100例

– 224 –

3.控件性质:本控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.playicq.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上分别添加

SeSkinEngine 控件、SeSkinForm、SeSkinButton、SeSkinTrackBar、SeSkinLabel控件各一个,按照表 74-1、表 74-2及效果图所示设置属性。

2.增加一个窗体 Form2,其上添加一个 SeSkinForm控件,并将其 Blend属性设置为 True,BlendValue属性设置为 150,SkinEngine属性设置为 Form1.SeSkinEngine1。 完成后主窗口界面如图 74-5所示。

图 74-5 设计期界面

二、源代码及注释 procedure TForm1.SeSkinButton1Click(Sender: TObject);

begin

{ 透明窗口}

Form2 := TForm2.Create(Self);

Form2.ShowModal; //显示模式窗口

Form2.Free;

end;

procedure TForm1.NgTrackBar1Change(Sender: TObject);

begin

SeSkinEngine1.DeltaHue := NgTrackBar1.Position; //改变 XP皮肤

end;

代码略,详见本书光盘。

第六篇 系统、文件及其他国

– 225 –

实例 75 LsDirTree10、LsFileListView26——资源管理器界面

实例效果 本例使用 LsDirTree10、LsFileListView26 控件实现了类似 Windows 系统资源管理器的界

面效果,如图 75-1所示。

图 75-1 运行界面图

控件说明 本例中使用 LsDirTree10、LsFileListView26控件,可以实现随时建立、删除、重命名文件

或文件夹,其操作简单,功能强大。在前面的实例中,曾经利用 Delphi 自带控件实现了类似Windows系统资源管理器的界面效果,与本例使用第三方控件比较,功能减色不少。

1.LsDirTree10控件主要属性如表 75-1所示。 表 75-1 控件属性

属性 作用 本例设置 备注 FileList 连接文件列表部件 LsFileListView261

HelpType 查询类型 htContext

SortType 排列类型 None

ShowButton 显示按钮 True

ShowHint 提示信息 True

ShowRoot 显示根目录 True

ShowLine 显示连线 True

SelectPath 查找的路径 动态设置

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.helpwork.com/。

国 Delphi 7控件实用程序设计 100例

– 226 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加控件

LsDirTree10、LsFileListView26(LsComp自定义组件页),按照属性表改写属性。 2.向 Form1添加两个 Panel组件(Standare组件页)、一个 MainMenu控件(Standare组

件页)、一个 Splitter控件(Additional组件页),把它放在 LsDirTree10和 LsFileListView26之间,添加一个 Statusbar控件(Win32组件页),按照设计期效果图安排位置。

3.在 Panel1上添加 15个 SpeedButton按钮,设置它们的 Glyph属性,调入相应的位图文件。

4.双击主菜单MainMenu,设置菜单项,详请参阅本书光盘。 完成界面如图 75-2所示。

图 75-2 设计期界面

二、源代码及注释 procedure TForm1.GetStatistics(Sender: TObject);

begin

StatusBar1.Panels[0].Text := '';

StatusBar1.Panels[1].Text := '';

with LsFileListView261 do

begin

if Selected <> nil then

begin

StatusBar1.Panels[0].Text := IntToStr(Items.Count) + ' object(s) -- ' +

IntToStr(SelectedNumber) + ' selected ';

StatusBar1.Panels[1].Text := ' Selected Size = ' +

FormatFloat('###,##0.00 KB', (SelectedSize/1024)) +

第六篇 系统、文件及其他国

– 227 –

'( Disk free space: ' +

FormatFloat('###,### MB', (DriveFreeSpace)) + ' )';

end

else begin

StatusBar1.Panels[0].Text := IntToStr(Items.Count) + ' object(s)';

StatusBar1.Panels[1].Text := ' Selected Size = 0 KB' +

' ( Disk free space: '+ //显示磁盘容量

FormatFloat('###,### MB', (DriveFreeSpace)) + ' )';

end;

end;

EditPath.Text := LsFileListView261.Directory;

end; //GetStatistics

此处代码略,详见本书光盘。

实例 76 TsearchFolders——文件的扫描查找

实例效果 本例使用 TSearchFolders控件,轻松地实现了文件的扫描、查找功能,使用方便,界面美

观大方,如图 76-1所示。

图 76-1 运行界面图

控件说明 文件的查找过程,无非就是把要查找的文件名字与要查找的目录中的文件名字逐一进行对

照,找到符合条件的文件名字,就在指定位置显示出来。TSearchFolders控件的开发,就遵循了这样的原则。

1.TSearchFolders控件主要属性如表 76-1所示。

国 Delphi 7控件实用程序设计 100例

– 228 –

表 76-1 控件属性 属性 作用 本例设置 备注

DoRecurcive 激活控件 true

FileMask 文件的模糊输入字符 *

Message 是否发送消息 True

ScanDir 搜索的路径 C:

ScanOptions 搜索方式 soSpecifiedDir

UpDateList 更新列表 True

2.TSearchFolders控件主要事件如表 76-2所示。

表 76-2 控件事件 事件 作用 本例设置 备注

OnChanged 改变好触发 需自己设置代码

OnProcess 进行过程中触发 需自己设置代码

3.控件性质:本控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.skycn.com/sort/sort2092000_indate_DESC_1.html。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application 项,新建一个工程,在窗体上添加

TSearchFolders控件(DDS自定义组件页),按照表 76-1设置它的属性。 2.在 Form1上添加一个 Panel控件(Standard组件页),设置它的 Align属性为 alBottom。 3.在 Form1上添加一个 ListView控件,设置它的 Align属性为 alTop,设置它的 ViewStyle

属性为 vsReport。 4.在 Form1上添加 3个BitBtn按钮,按照效果图设置Kind属性,添加一个Drivecombobox

控件,一个 DirectoryListBox控件(Win32组件页),按照界面图安排它们的位置。 完成界面如图 76-2所示。

图 76-2 设计期界面

第六篇 系统、文件及其他国

– 229 –

二、源代码及注释 function GetFileAttrStr(Attr : integer) : string;//获得文件信息

begin

Result := '';

if (Attr and SysUtils.faArchive) <> 0 then Result := Result+'A'

else Result := Result+'-';

if (Attr and SysUtils.faDirectory) <> 0 then Result := Result+'D'

else Result := Result+'-';

if (Attr and SysUtils.faHidden) <> 0 then Result := Result+'H'

else Result := Result+'-';

if (Attr and SysUtils.faReadOnly) <> 0 then Result := Result+'R'

else Result := Result+'-';

if (Attr and SysUtils.faSysFile) <> 0 then Result := Result+'S'

else Result := Result+'-';

if (Attr and SysUtils.faVolumeID) <> 0 then Result := Result+'V'

else Result := Result+'-';

end;

procedure TScanUnit.SearchFoldersChanged(Sender: TObject; FilesCount,

FilesSize: Integer);//搜索过程触发 SearchFolders控件

begin

Status.Caption := 'Done Scanning';

if FilesSize < 1024000 then

ScanUnit.Caption := 'SearchFolders Test >>> ' + IntToStr(FilesCount) + ' Files: ' + IntToStr(FilesSize

div 1024)+ ' Kb'

else

ScanUnit.Caption := 'SearchFolders Test >>> ' + IntToStr(FilesCount) + ' Files: ' + IntToStr(FilesSize

div 1024000)+ ' Mb';

if SearchFolders.FilesFound.Count = 0 then

begin

exit;

end;

Screen.Cursor := crHourGlass;

for i := 0 to Pred(SearchFolders.FilesFound.Count) do

begin

F := TFilePack(SearchFolders.FilesFound.Items[i]);

Item := ToBe.Items.Add;//将搜索到的信息,添加到 ListView控件当中

Item.Caption := F.FileName;

Item.SubItems.Add(IntToStr(F.FileSize div 1024)+ 'Kb');//添加子项目

Item.SubItems.Add(DateToStr(FileDateToDateTime(F.FileTime)));

国 Delphi 7控件实用程序设计 100例

– 230 –

Item.SubItems.Add(GetFileAttrStr(F.FileAttr));

Item.SubItems.Add(F.FullPath);

end;

Screen.Cursor := crDefault;

end;

procedure TScanUnit.SearchFoldersProcess(Sender: TObject; Dir: String;

FilesCount, FilesSize: Integer);//搜索过程中的程序代码

begin

Status.Caption := Dir;//Status的初始内容

if FilesSize < 1024000 then//搜索过程中,根据不同的情况,修改 Status的标题属性

ScanUnit.Caption := 'SearchFolders Test >>> ' + IntToStr(FilesCount) + ' Files: ' + IntToStr(FilesSize

div 1024)+ ' Kb'

else

ScanUnit.Caption := 'SearchFolders Test >>> ' + IntToStr(FilesCount) + ' Files: ' + IntToStr(FilesSize

div 1024000)+ ' Mb';

ScanUnit.Caption := 'SearchFolders Test >>> ' + IntToStr(FilesCount) + ' Files: ' + IntToStr(FilesSize div

1024)+ ' Kb';

end;

procedure TScanUnit.BitBtn1Click(Sender: TObject);//开始搜索按钮的单击事件

begin

BitBtn2.Enabled := True;

ToBe.Items.Clear;

SearchFolders.FileMask := Edit1.Text;

SearchFolders.ScanDir := DirBox.Directory;

SearchFolders.FilesFound.Clear;

SearchFolders.Scan;

BitBtn2.Enabled := False;

end;

此处代码略,详见本书光盘。

实例 77 ScreenSaver——屏幕保护

实例效果 本书前面的实例中做过屏幕保护的程序,在那里使用的是 Delphi 自带的控件,编写起来

是比较麻烦的,在这里使用第三方控件 ScreenSaver,简单地实现了前面的所有功能,真正发挥了代码的封装和重用的优点。运行界面如图 77-1所示。

第六篇 系统、文件及其他国

– 231 –

图 77-1 运行界面图

控件说明 TscreenSaver控件使用简单,在 Panel1上设置不同的内容,屏幕保护程序就将显示不同的

内容。通过设置 AutoBorderLess 属性为 true,可以使屏幕保护程序没有边界,通过设置AutoMaxisize属性为 True,可以使屏幕保护程序最大化。

1.主要属性如表 77-1所示。

表 77-1 控件属性 属性 作用 本例设置 备注

AutoBorderLess 自动取消边界 True

AutoEnable 自动启动 True

AutoMaxsize 自动最大化 True

AutoMouseHide 自动隐藏鼠标 True

AutoOnTop 自动浮在别的窗口之上 True

AutoPanelHide 自动隐藏面板 True

ConfigurationBox 确认对话框 False

ConfigurationBoxMessage 确认消息 Easy Screensaver …

ConfigurationBoxPanel 确认面板 Panel2

ConfigurationBoxStyle 确认的类型 cbsMessageDlg

MainScreenSaver 主窗口屏幕保护 True

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://helpwork.net/ocx/html/user/index.asp。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 TScreenSaver控件(Win32组件页),按照表 77-1设置它的属性。 2.在 Form1上添加两个 Panel控件(Standard组件页),设置 Panel1的Color属性为 clBlack, 按照设计期效果图安排它们的位置、大小。 3.在 Panel1上放置一个 Label控件(Standard组件页),在它的 Caption属性中输入“分

享精彩瞬间,Delphi 百例丛书与您同行!”。 4.在 Panel1上放置两个 Label控件(Standard组件页),设置它们的 Caption属性,再放

国 Delphi 7控件实用程序设计 100例

– 232 –

置一个 Button按钮(Standard组件页),设置它的属性和位置。详细设置请参阅本书光盘。 完成界面如图 77-2所示。

图 77-2 设计期界面

二、源代码及注释 var

Form1: TForm1;

i,j: Integer;

Timer: TThread;//定义全局性的线程类变量

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);//程序运行时,首先进行初始化

begin

j:=1;//设定 i,j的初值

i:=1;

Timer := MoveTimer.Create(True);

Timer.Resume;//执行线程

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Timer.Suspend;//挂起线程

Timer.Terminate;//线程终止

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Close;//退出

end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

第六篇 系统、文件及其他国

– 233 –

Close;//退出

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

If Tag < 5 then

begin

Image1.Left := X - 15;

Image1.Top := Y - 15;

end

else Close;//鼠标移动的距离大于 5,退出屏幕保护

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Close;//按下鼠标退出程序

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Close;//鼠标弹起,退出程序

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

if screensaver1.AutoMaximize then

//当 TScreenSaver控件的 AutoMaximize属性为 True时,执行下列代码

begin

form1.Top:=0;

form1.Left:=0;

form1.Width:=screen.Width;

form1.Height:=screen.Height;

end;

Randomize;//随机的改变 Panel1的位置

Panel1.Top := Random(Form1.Height - Panel1.Height);

Panel1.Left := - (Panel1.Width + Panel1.Width div 10);

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

//关闭主窗口时的提示信息

begin

国 Delphi 7控件实用程序设计 100例

– 234 –

If ScreenSaver1.DoPasswordCheck = False then

begin

CanClose := False;

Form1.Tag := 0;

end

else CanClose := True;

end;

实例 78 TsystemInfo——获得系统信息

实例效果 获得系统信息,是很多编程爱好者的愿望,一般情况下,可以利用Windows的 API函数

获得系统信息,但是这样的话,编程人员需要记住一大堆的 API 函数。这个例子使用TSystemInfo控件,工作就变得非常简单了,通过调用控件的某一个属性,就可以得到相应的系统信息,大大简化了编程工作。运行界面如图 78-1、图 78-2所示。

图 78-1 运行界面图(1)

图 78-2 运行界面图(2)

第六篇 系统、文件及其他国

– 235 –

控件说明 这个例子中,核心的东西还是 TSystemInfo控件的开发,它的开发原理也非常简单,无非

是将大量的 API函数封装在一个控件当中。 1.TSystemInfo控件的属性如表 78-1所示。

表 78-1 控件属性 属性 作用 本例设置 备注

ComputerName 计算机名字 运行时动态获得

WinDir 目录 运行时动态获得

SysDir 系统目录 运行时动态获得

RegOwner 注册者 运行时动态获得

RegCompany 注册者单位 运行时动态获得

OSVersion 版本 运行时动态获得

OSPlatform 操作平台 运行时动态获得

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.helpwork.com。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 TSystemInfo控件(Samples组件页),Name属性设置为 Sysinfo,其余属性按照默认值。 2.在 Form1上添加一个MainMenu控件(Standard控件页),按照图 78-3进行设置。

图 78-3 菜单设计期

3.在 Form1上添加 17个 Label控件(Standard控件页),详细设置见本书光盘。 4.在 Form1上添加 1个 BitBtn控件(Additional组件页),设置它的 kind属性为 bkClose,

再放置一个 Button控件,设置它的 Caption属性为 Go。完成界面如图 78-4所示。

国 Delphi 7控件实用程序设计 100例

– 236 –

图 78-4 程序设计期效果

二、源代码及注释 procedure TForm1.btnGoClick(Sender: TObject);

begin

label1.visible:=true;//设置各个 label按钮可见

label2.visible:=true;

label3.visible:=true;

label4.visible:=true;

label5.visible:=true;

label6.visible:=true;

label7.visible:=true;

label8.Visible:=true;

lblUser.Caption:= sysinfo.username;//将系统信息显示在相应的标签上

lblcomputer.Caption:= sysinfo.computername;

lblwindir.Caption:= sysinfo.windir;

lblsysdir.Caption:= sysinfo.sysdir;

lblreg.Caption:= sysinfo.regowner + ', ' + sysinfo.regcompany;

lblversion.caption:= sysinfo.osversion;

lblplatform.caption:=sysinfo.osplatform;

end;

procedure TForm1.FormShow(Sender: TObject);

begin

lblUser.Caption:= '';//初始化各个标签。

lblcomputer.Caption:= '';

lblwindir.Caption:= '';

lblsysdir.Caption:= '';

lblreg.Caption:= '';

lblversion.caption:= '';

lblplatform.caption:='';

第六篇 系统、文件及其他国

– 237 –

end;

procedure TForm1.N3Click(Sender: TObject);//获得计算机名称

begin

showmessage('计算机名称是:'+sysinfo.computername);

end;

procedure TForm1.N4Click(Sender: TObject);//获得用户名称

begin

showmessage('用户名称是:'+sysinfo.username);

end;

procedure TForm1.N5Click(Sender: TObject);//获得系统目录

begin

showmessage('系统目录是:'+sysinfo.windir);

end;

procedure TForm1.N6Click(Sender: TObject);//获得操作系统所在的目录

begin

showmessage('操作系统目录是:'+sysinfo.sysdir);

end;

procedure TForm1.N7Click(Sender: TObject);//获得注册者姓名和单位

begin

showmessage('注册者是:'+sysinfo.regowner + ', ' + sysinfo.regcompany);

end;

procedure TForm1.N8Click(Sender: TObject);//获得系统版本号

begin

showmessage('系统版本号是:'+sysinfo.osversion);

end;

procedure TForm1.N9Click(Sender: TObject);//获得操作平台

begin

showmessage('操作平台是:'+sysinfo.osplatform);

end;

procedure TForm1.N11Click(Sender: TObject);

begin

btngo.Enabled:=true;

showmessage('请单击 GO按钮');

end;

procedure TForm1.N13Click(Sender: TObject);

begin

close;//退出程序。

end;

此处代码略,详见本书光盘。

国 Delphi 7控件实用程序设计 100例

– 238 –

实例 79 TlightSpeed——漂亮的焰火

实例效果 本例使用 TlightSpeed 控件制作了一个显示焰火的程序,形象、逼真,可以修改焰火的参

数,可以与 Photoshop里的滤镜相媲美。运行界面如图 79-1所示。

图 79-1 运行界面图

控件说明 使用 TLightSpeed设计焰火的时候,通过设置 Active属性为 True来激活控件(这是最重

要的,否则没有焰火效果),通过设置 CenterX、CenterY来设置焰火的中心,通过设置 interval来设置施放焰火的间隔。还有些别的属性,都一目了然、非常清楚。

1.TLightSpeed控件的主要属性如表 76 -1所示。 表 79-1 控件属性

属性 作用 本例设置 备注 Active 激活控件 False

Brightness 亮度 100

CenterX 中心点横坐标 150

CenterY 中心点纵坐标 80

Color 底色 clBlack

Interval 间隔 50

Speed 速度 Lsnormal;

Starscount 焰火的点数 100 描述了焰火的密集程度 Visible 可见性 True

2.该控件没有事件。 3.控件性质:本控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://www.tommstudio.com/newclub30。

第六篇 系统、文件及其他国

– 239 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 TLightSpeed控件(Sample组件页),按照表 79-1设置它的属性。 2.在 Form1上添加 1个 GroupBox控件(Standard组件页),按照效果图修改它的 Caption

属性,安排它的位置和大小。 3.在 GroupBox1 上放置 4 个 Label 控件(Standard 组件页),按照效果图修改它们的

Caption属性,安排它们的位置和大小。 4.在 GroupBox1上放置 4个 ComboBox控件(Standard组件页),设置它们的 ItemIndex

属性。 5.在 GroupBox1上放置 2个 Button控件(Standard组件页),按照效果图修改它们的

Caption属性,安排它们的位置和大小。 完成界面如图 79-2所示。

图 79-2 程序设计期图

二、源代码及注释 procedure TForm1.FormCreate(Sender: TObject);//初始化

var

i:integer;

begin

for i:=0 to 255 do

begin

combobox1.AddItem(inttostr(i),self);//向 combobox1中添加相应的项目

combobox1.ItemIndex:=100;//设置 combobox1的.ItemIndex属性

combobox2.AddItem(inttostr(i),self);

combobox2.ItemIndex:=50;

国 Delphi 7控件实用程序设计 100例

– 240 –

combobox3.AddItem(inttostr(i),self);

combobox3.ItemIndex:=100;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);//确定按钮的单击事件

begin

with lightspeed1 do

begin

Brightness:=combobox1.ItemIndex;//设置亮度

Interval:=combobox2.ItemIndex;//设置间隔

StarsCount:=combobox3.ItemIndex;//设置密度

case combobox4.ItemIndex of//设置施放焰火的速度

0:Speed:=lsfast;

1:Speed:=lsfaster;

2:Speed:=lslight;

3:Speed:=lsnormal;

4:Speed:=lsslow;

5:Speed:=lsslower;

end;

Active:=true;//激活控件

end;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

lightspeed1.Active:=false;//停止施放焰火

end;

procedure TForm1.ComboBox2Change(Sender: TObject);

begin

lightspeed1.Active:=false; //停止施放焰火

end;

procedure TForm1.ComboBox3Change(Sender: TObject);

begin

lightspeed1.Active:=false; //停止施放焰火

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

close;//退出

end;

procedure TForm1.ComboBox4Change(Sender: TObject);

第六篇 系统、文件及其他国

– 241 –

begin

lightspeed1.Active:=false; //停止施放焰火

end;

此处代码略,详见本书光盘。

实例 80 Trend——运动的条状图、线状图、块状图

实例效果 本例主要使用 Ttrend 控件,制作了一个运动起来的条状图、线状图、块状图的程序,当

选择不同按钮的时候,将展示不同的效果。如图 80-1、图 80-2、图 80-3所示。

图 80-1 运动的线状效果图

图 80-2 运动的条状效果图 图 80-3 运动的块状效果图

国 Delphi 7控件实用程序设计 100例

– 242 –

控件说明 TTrend控件是一个图形控件,可以显示活动的图形。 1.其主要属性如表 80-1所示。

表 80-1 控件属性 属性 作用 本例设置 备注

Divisions 整个控件被分成几份 各个 TTrend设置不同的值

Color 颜色 各个 TTrend设置不同的值

MaxValue 最大值 100

MinValue 最小值 0

ParentColor 同父控件颜色 False

Style 控件类型:

tsBar-每一个参数值对应一个矩形。

tsLine-根据每一个参数值绘制一条直线

tsScatter-在每一个值处绘制一个小矩形。

ts3D-每一个参数值对应一个 3D矩形。

tsFilled-每一个值对应一条直线,并且直线下面区域被填充

tsBar

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.tommstudio.com/newclub30。 注意:TTrend控件的 Divisions属性,表示将整个的控件界面分成的份数,在设置这个属性的时候,要根据界面大小以及MaxValue值确定它的具体数值。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 7

个 TTrend控件(自定义的Mark组件页),设置不同的颜色、不同的 Divisions属性值(根据自己的爱好设置)。

2.在 Form1 上添加 1个 RadioGroup控件(Standard组件页),设置它的 Caption属性为“Trend Types”。

3.在 RadioGroup控件上放置 5个 RadioButton控件(Standard组件页),按照效果图设置它们的 Caption属性。

4.在 Form1上添加 1个 TTimer控件(System组件页),设置它的 Enabled属性为 true,Interval属性为 330。 完成界面如图 80-4所示。

第六篇 系统、文件及其他国

– 243 –

图 80-4 设计期界面图

二、源代码及注释 procedure TForm1.Timer1Timer(Sender: TObject);//图像动态效果

var

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin

if Components[i] is TTrend then begin//如果是 Trend控件,就显示动态图像

with Components[i] as TTrend do

Demo;

end;

end;

end;

procedure TForm1.RadioButton1Click(Sender: TObject);

var

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin//从第一个控件开始检测

if Components[i] is TTrend then begin

with Components[i] as TTrend do

Style := tsLine;//确定显示类型为 tsline

end;

end;

end;

procedure TForm1.RadioButton2Click(Sender: TObject);

var

国 Delphi 7控件实用程序设计 100例

– 244 –

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin

if Components[i] is TTrend then begin

with Components[i] as TTrend do

Style := tsScatter; //确定显示类型为 tsScatter

end;

end;

end;

procedure TForm1.RadioButton3Click(Sender: TObject);

var

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin

if Components[i] is TTrend then begin

with Components[i] as TTrend do

Style := ts3D; //确定显示类型为 ts3D

end;

end;

end;

procedure TForm1.RadioButton4Click(Sender: TObject);

var

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin

if Components[i] is TTrend then begin

with Components[i] as TTrend do

Style := tsBar;// 确定显示类型为 tsBar

end;

end;

end;

procedure TForm1.RadioButton5Click(Sender: TObject);

var

i : Integer;

begin

for i:=0 to ComponentCount -1 do begin

if Components[i] is TTrend then begin

with Components[i] as TTrend do

Style := tsFilled;// 确定显示类型为 tsFilled

第六篇 系统、文件及其他国

– 245 –

end;

end;

end;

此处代码略,详见本书光盘。

实例 81 TwinList——监控正在运行的程序

实例效果 本例利用第三方控件 TwinList,编写了一个实用性很强的程序。在这个程序当中,可以监

测到已经运行的程序,可以得到它的句柄、线程号、可执行文件的图标、类名以及可执行文件

所在的目录等。可以通过右击鼠标来刷新、关闭可执行文件,还可以获得可执行文件的 About信息。总而言之,它可以轻而易举地解决一般的系统控制功能。运行效果如图 81-1所示。

图 81-1 运行界面图

控件说明 TWinList 控件的设计思路,无非就是把大量的 WindowsAPI 函数进行封装,通过设定一

个 Execute 过程来获得系统的信息。使用这个控件的时候,可以通过设置 TWinList 控件的TimerInterval属性,确定自动扫描系统的时间间隔,然后设置 EnableTimer为 True,以便自动扫描系统,获得已经运行的程序的信息,当然也可以手工操作。

1. TWinList控件的主要属性如表 81-1所示。

国 Delphi 7控件实用程序设计 100例

– 246 –

表 81-1 控件属性 属性 作用 本例设置 备注

About 设置版权信息 TFindWin4.0(32): ?1996-1998 by Llq

EmptyNames 清空名称项 False

EnableTimer 激活控件 False

TaskBarSty 是否显示任务栏 True

TimerInterval 时间间隔 500

WhatDoFind 要获得的可执行文件类型 id_VisOnly 可见类型

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.tommstudio.com/newclub30。 注意:这是一个比较复杂的例子,涉及的东西也比较多,鉴于篇幅限制,不可能对每

一个知识点均作详细地讲解,请读者结合光盘的详细代码,仔细琢磨一下。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 1

个 TWinList控件(自定义组件页 PI-Freeware),按照表 81-1设置它的属性值。 2.在 Form1上添加 1个 ListBox控件(Standard组件页),显示已经运行的程序的名称。 3.在 Form1上添加 1个 GroupBox控件(Standard组件页),按照效果图设置它的大小、

位置以及一些简单的属性。 4.在 Form1上添加 1个 Panel控件(Standard组件页),设置它的显示样式、大小和位置。 5.在 Form1上添加 1个 Image控件(Additional组件页),用来显示可执行文件的图标。 6.按照效果图放置 Label控件,设置它们的 Caption属性值和位置,这里不做过多地解释,

详细请看附带的光盘。 7.在 Form1 上添加 6 个 BitBtn 按钮(Additional 组件页),从 BitBtn1 到 BitBtn5,前 3

个 BitBtn的 Kind属性设为 bkCustom,BitBtn4的 Kind属性设为 bkAbort, BitBtn5的 Kind属性设为 bkHelp。完成界面如图 81-2所示。

图 81-2 设计期界面图

第六篇 系统、文件及其他国

– 247 –

二、源代码及注释 procedure TForm1.BitBtn1Click(Sender: TObject);//获得全部的已经运行的程序信息

begin

WinList1.TaskBarSty := Checkbox2.checked;

if checkbox2.checked then begin

checkbox1.checked := False;

checkbox1.enabled := False;

end else

checkbox1.enabled := True;

WinList1.EmptyNames:= Checkbox1.checked;

if Sender = BitBtn1 then WinList1.WhatDoFind := id_all;

if Sender = BitBtn2 then WinList1.WhatDoFind := id_visonly;

if Sender = BitBtn3 then WinList1.WhatDoFind := id_invisonly;

WinList1.Execute;//获得已运行的程序的信息

ListWin(Sender);

end;

procedure TForm1.BitBtn4Click(Sender: TObject);

begin

close;//退出程序

if ico <> nil then ico.free;//释放显示图标的资源

end;

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

DoWindow;//鼠标弹起时,执行 DoWindow过程。

end;

procedure TForm1.DoWindow;// DoWindow过程的定义。

begin

if (ListBox1.Items.count < 1) OR (ListBox1.ItemIndex < 0) then exit;//异常退出

Image1.Picture.Icon := nil;

ico := TIcon.Create;

whdl := WinList1.GetWinHandle(ListBox1.ItemIndex);//下面这些代码,获得相应的信息

hdlp := WinList1.GetWinParent(ListBox1.ItemIndex);

thdl := WinList1.GetThreadID(ListBox1.ItemIndex);

phdl := WinList1.GetProcessID(ListBox1.ItemIndex);

wsty := WinList1.GetWinStyle(ListBox1.ItemIndex);

wxty := WinList1.GetWinExStyl(ListBox1.ItemIndex);

Label1.Caption := 'HWnd: ' + IntToHex(whdl,4);//下面这几行代码,显示已经获得的信息

国 Delphi 7控件实用程序设计 100例

– 248 –

Label7.Caption := 'ThreadID: ' + IntToHEX(thdl,4)+

' / ProcessID: ' + IntToHEX(phdl,4);

Label6.Caption := 'HParent: ' + IntToHex(hdlp,4) +

' -> '+WinList1.GetParentName(ListBox1.ItemIndex);

Label5.Caption := 'ClassName: ' + WinList1.GetWnClasName(ListBox1.ItemIndex);

Label2.Caption := 'WinStyle: ' + IntToHex(wsty,4)+

' / WinExSty: ' + IntToHEX(wxty,4);

Label4.Caption:= MiniMizeName ( WinList1.GetWinExePath

(ListBox1.ItemIndex),Canvas,Label4.Width);

Label8.Caption := 'HIcon: ' + IntToHex(WinList1.GetIconHandle(ListBox1.ItemIndex),4);

ico.Handle := WinList1.GetIconHandle(ListBox1.ItemIndex);

Image1.Picture.Icon := ico;//显示已运行程序的图标

SetStyle(wsty);//设置显示类型

end;

procedure TForm1.CheckBox3Click(Sender: TObject);

begin

WinList1.EnableTimer := CheckBox3.checked;//设定是否自动更新信息

end;

procedure TForm1.FormCreate(Sender: TObject);//程序初始化

begin

Caption := WinList1.About;//显示 About信息。

CheckBox1.Checked := WinList1.EmptyNames;

CheckBox3.Checked := WinList1.EnableTimer;

CheckBox2.Checked := WinList1.TaskBarSty;

end;

procedure TForm1.SetStyle(sty:LongInt);//设定显示类型的过程。

begin

if sty = 0 then cb1.checked := False

else

cb1.checked := (sty AND WS_OVERLAPPED) = WS_OVERLAPPED;

cb2.checked := (sty AND WS_POPUP) = WS_POPUP;

//…..此处代码略。

cb11.checked := (sty AND WS_BORDER) = WS_BORDER;

cb12.checked := (sty AND WS_DLGFRAME) = WS_DLGFRAME;

cb13.checked := (sty AND WS_VSCROLL) = WS_VSCROLL;

cb14.checked := (sty AND WS_HSCROLL) = WS_HSCROLL;

//…..此处代码略。

end;

procedure TForm1.BitBtn5Click(Sender: TObject);//显示版权、作者等有关信息。

第六篇 系统、文件及其他国

– 249 –

begin

MessageDlg('Demosoftware'+ #10#13+

'for the Componente: TFindWin4.0 [32] '+ #10#13+ #10#13+

'?1996-1998 by Dr.Plass '+ #10#13+

'[email protected] '+ #10#13+

'http://www.fh-zwickau.de/~pp/tm.htm ',

mtInformation, [mbOk],0);

end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

CheckBox3.checked:=true;

CheckBox3Click(Sender);

Winexec('notepad.exe',SW_SHOWMINIMIZED);

end;

procedure TForm1.ListBox1KeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

DoWindow;//鼠标弹起,执行 DoWindow过程。

end;

procedure TForm1.Refresh1Click(Sender: TObject);//刷新信息列表

begin

WinList1.Execute;

ListWin(self);

end;

procedure TForm1.ListBox1DblClick(Sender: TObject);//双击打开这个已经运行的程序。

var

whdl:HWnd;

begin

if (ListBox1.Items.count < 1) OR (ListBox1.ItemIndex < 0) then exit;

whdl:=WinList1.GetWinHandle(ListBox1.ItemIndex);

ShowWindow(whdl,SW_RESTORE);

SetForegroundWindow(whdl);//设定背景。

end;

此处代码略,详见本书光盘。

实例 82 LCDNumber——液晶面板 实例效果 LCD液晶显示是经常用到的一类控件,本例使用 Delphi 7自带的 LCDNumber控件,制

国 Delphi 7控件实用程序设计 100例

– 250 –

作了一个 LCD液晶面板记时器,可以显示分、秒、毫秒,以及它们的递增关系,而且非常精确。并且该控件的边框以及显示时间的部分还可以改变。同时还可以完成开始、停止和复位功

能。让您轻松使用该记时器,图 82-1、图 82-2、图 82-3所示演示了边框和显示时间部分的变化情况。

图 82-1 运行界面图(1) 图 82-2 运行界面图(2)

图 82-3 运行界面图(3)

控件说明 1.LCDNumber控件主要属性如表 82-1、82-2所示。

表 82-1 LCDNumber控件主要属性 属性 作用 本例设置 备注

BorderStyle 设置边框类型 在代码里设置 BsNone//没有边界 BsSingle//单行边界 BsDouble//两倍边界 BsRaisedPanel//边界使用 3-D,在某个范围出现凸起, BsSunkenPanel//边界使用 3-D,在某个范围出现凹下。 BsRaised3d//边界是凸起的斜角。 BsSunken3d//边界是凹下的斜角 BsEtched//边界出现蚀刻线 BsEmbossed//边界出现浮雕线

SegmentStyle 设置显示数字的片

段类型 在代码里设置 SsOutline //显示凸起的部分填充背景颜色。

SsFilled //显示凸起的部分填充前景颜色。 SsFlat显示平坦的部分填充前景颜色

Bitmap 设置背景图片 Value 设置初始值 00:00:000

2.该控件主要方法。 Create:创建控件。 Destroy:毁坏显示器控件。 Refresh:刷新。

第六篇 系统、文件及其他国

– 251 –

3.控件主要事件。 OnMouseUp:当鼠标放开时,此事件发生。 OnMouseDown:当鼠标按下时,此事件发生。 4.控件性质:该控件为 Delphi自带控件(在 Additional组件页)。 注意:新建工程时,该控件是隐藏的,控件栏上看不到该控件,如需看到该控件,你

可以在控件栏上单击鼠标右,选中“Properties”项或点击菜单“Component”选中“Configure Palette”,都会出现“Palette Properties”属性页。点击“Additiona”页,在控件栏上就可以看到该控件。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置三个 Button控件,其 Caption属性分别设置为“Start”、“Stop”、“Reset”;

还放置一个 Timer控件,其 Enabled属性设为 True,Interval属性设为“1” 。 3.在控件栏上找到“LCDNumber”控件,如图 82-4所示,向窗体上添加一个 LCDNumber

控件,其 Align属性设为 alTop,Value属性设为“00:00:000”,Color属性设为 clTeal,其他属性就为系统默认设置。

图 82-4 “LCDNumber”控件

详细设置请参阅光盘,最后完成界面如图 82-5所示。

图 82-5

二、源代码及注释 首先在 privat和 public部分定义如下: private

{ Private declarations }

FRunning: Boolean;

procedure SetRunning(Value: Boolean);

public

{ Public declarations }

StartTime: Extended;

ElapsedTime: Extended;

国 Delphi 7控件实用程序设计 100例

– 252 –

Reset: Boolean;

property Running: Boolean read FRunning write SetRunning;

end;

var

Form1: TForm1;

implementation

{$R *.xfm}

主要代码如下:

procedure TForm1.SetRunning(Value: Boolean);

begin

if FRunning <> Value then

begin

FRunning := Value;

StartTime := ElapsedTime;

if Value then Reset := False;

end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if Reset then ElapsedTime := Now else ElapsedTime := Now - StartTime;

if Running then

LCDNumber1.Value := FormatDateTime('nn:ss.zzz', ElapsedTime);

//FormatDateTime函数用指定的格式来格式化日期和时间

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Running := True; //开始记时

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Running := not Running; //停止记时

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

if not Running then

begin

LCDNumber1.Value := '00:00.000'; //把启始时间置为零

Reset := True;

end;

第六篇 系统、文件及其他国

– 253 –

end;

procedure TForm1.LCDNumber1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

NewBorderStyle: Integer;

NewSegmentStyle: Integer;

begin

case Button of

//单击鼠标左键,边框类型将改变

mbLeft:

begin

NewBorderStyle := Ord(LCDNumber1.BorderStyle) + 1; //Ord函数是返回序数类的序数

if NewBorderStyle > Ord(High(TBorderStyle)) then

NewBorderStyle := Ord(Low(TBorderStyle));

LCDNumber1.BorderStyle := TBorderStyle(NewBorderStyle); //设置边框的类型。

end;

//单击鼠标右键,显示时钟的片段类型将改变

mbRight:

begin

NewSegmentStyle := Ord(LCDNumber1.SegmentStyle) + 1;

if NewSegmentStyle > Ord(High(TLCDSegmentStyle)) then

NewSegmentStyle := Ord(Low(TLCDSegmentStyle));

LCDNumber1.SegmentStyle := TLCDSegmentStyle(NewSegmentStyle); //设置显示时钟的片

段类型

end;

end;

end;

实例 83 Tmarquee——模拟电子广告看板

实例效果 电子广告看板是很常见到的,如公共汽车上的电子报站牌,公共食堂里的菜谱公告等,本

例利用 Tmarquee控件制作了一个这样的模拟电子广告看板,单排循环显示,要显示的内容需要事先输入到显示列表中,颜色可以自定,效果良好,如图 83-1所示。

国 Delphi 7控件实用程序设计 100例

– 254 –

图 83-1 运行界面图

控件说明 使用 TMarquee控件的时候,需要事先设置电子广告看板的背景颜色,一般设置为黑色,

之后在编辑控件(Edit控件)中输入要显示的内容,单击 Add,添加到显示列表中,列表中显示添加的内容和颜色值,之后还需要单击 Sbumit按钮进行提交,显示电子广告内容。

1.TMarquee控件主要属性如表 83-1所示。

表 83-1 控件属性 属性 作用 本例设置 备注

Active 激活控件 False

BorderStyle 边界类型 bsSingle

Color 颜色 clBlack

Direction 字幕滚动方向 tdLeft

Speed 字幕滚动速度 tsMedia

Text 显示的文本 255%菜谱一览表 255%代表颜色

2.控件性质:本控件为免费、提供全部源代码的第三方控件。 3.下载地址:http://www.helpwork.com/。 注意:新添加项目时,一定记住字体颜色不要和广告看板的背景颜色相同,否则无法

显示,修改完以后,一定要按 Submit按钮提交修改后的信息,否则,也不会起作用。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加 1

个 TMarquee控件(Sample组件页),根据表 83-1设置它的属性。 2.在 Form1上添加一个 ListBox控件(Standard组件页),用来输入要显示的文字列表,

按照效果图设置它的大小和位置。 3.在 Form1上添加一个 Edit控件(Standard组件页),将它的 Text属性设置为空,用来

输入新的信息项。

第六篇 系统、文件及其他国

– 255 –

4.在 Form1 上添加一个 ColorGrid 控件(Sample 组件页),用来确定输入的新项目的字体颜色。

5.在 Form1 上添加 5 个 ColorGrid 控件(Standard 组件页),按照效果图设置它们的Caption属性,安排它们的位置。完成界面如图 83-2所示。

图 83-2 设计期界面图

二、源代码及注释 type//窗体和控件的声明

TForm1 = class(TForm)

Marquee1: TMarquee;

ListBox1: TListBox;

Edit1: TEdit;

ColorGrid1: TColorGrid;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

//过程的声明

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure TForm1.FormCreate(Sender: TObject);//程序的初始化

begin

marquee1.active := true;//激活控件

end;

procedure TForm1.Button1Click(Sender: TObject);

国 Delphi 7控件实用程序设计 100例

– 256 –

begin

ListBox1.Items.Add(IntToStr(ColorGrid1.ForegroundColor) + '%' + Edit1.Text);

//向显示列表中添加项目,颜色+文字

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

ListBox1.Items.Delete(ListBox1.ItemIndex);//从显示列表中删除项目

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

ListBox1.Items.Clear;//清空显示列表

end;

procedure TForm1.Button4Click(Sender: TObject);//提交修改的过程

var S: String;

i: Integer;

begin

S := '';

for i:=0 to Pred(ListBox1.Items.Count) do//依次显示显示列表中的项目

begin

S := S + ListBox1.Items[i];

if i < Pred(ListBox1.Items.Count) then

S := S + '|';

end;

Marquee1.Text := S;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

close;//退出程序。

end;

此处代码略,详见本书光盘。

实例 84 制作记事本 实例效果 本例仿照 Windows 操作系统自带的记事本程序,制作自己的笔记本程序。本例主要使用

了 OpenDialog 控件、SaveDialog 控件、Memo 控件等,支持文本的调入、存盘、改变字体颜色、剪切、拷贝、粘贴等很多文本操作,是一个演示文本操作的好例子。效果如图 84-1、84-2所示。

第六篇 系统、文件及其他国

– 257 –

图 84-1 效果图(1)

图 84-2 调入文本并作处理

控件说明 本例主要演示了文本操作类 OpenDialog 控件、SaveDialog 控件、FontDialog 控件、

ColorDialog 控件、Memo 控件的使用方法,同时讲解了剪贴板的功能。Delphi 的 Memo 控件支持剪贴板的拷贝、剪切、粘贴功能,为文件的拷贝、剪切、粘贴操作提供了很大的方便。

1.Memo控件主要属性如表 84-1所示。 表 84-1 控件属性

属性 作用 本例设置 备注

Align 排列方式 alClient

ScrollBars 滚动条 ssVertical

ImeMode 输入模式 imChinese

ImeName 输入法 智能 ABC输入法

ReadOnly 设置只读 False

PopupMenu 弹出菜单 PopupMenu1

2.主要事件。 OnChange:当文本内容变化时触发。

国 Delphi 7控件实用程序设计 100例

– 258 –

3.主要方法。 Clear:清空。 CutToClipboard:剪切。 CopyToClipboard:复制。 PasteFromClipboard:粘贴。 Setfocus:获得焦点。 注意:菜单的按钮和 ToolBar上的快捷按钮完成的功能相同。在程序当中,不需要重复输入相同的代码,只需使快捷按钮的 OnClick事件指向菜单按钮的响应事件即可。

制作步骤

一、窗体界面的建立 1.启动Delphi 7,单击菜单 File/New Application项,新建一个工程,改变 Form1的 Caption

属性为“笔记本”。 2.在 Form1 上添加 MainMenu 控件(Standard 组件页),双击添加新的项目。如图 84-3

所示。 3.在 Form1 上添加 OpenDialog 控件、FontDialog 控件、SaveDialog 控件、ColorDialog

控件(Dialogs组件页)各一个。 4.添加 ToolBar控件(Win32组件页),单击鼠标右键,添加 New Button和 New Separator

按钮,并设定相应的 Caption属性。 5.在 ToolBar1上添加一个 Label按钮(Standard组件页),设置 Caption属性为“字体大

小”,添加一个 SpinEdit 控件(Sample 组件页),设置它的 Increment、MaxValue、MinValue属性分别为 2、24、8。

6.在 Form1上添加 Timer组件(System组件页),设置 Interval属性为 1000。 图 84-4为设计期效果图。

图 84-3 设置菜单 图 84-4 设计期效果

二、源代码及注释 //新建文件

第六篇 系统、文件及其他国

– 259 –

procedure TForm1.filenewClick(Sender: TObject);

begin

memo1.Clear;

memo1.setfocus;

memo1.color:=clwhite;

memo1.Font.Color:=clblack;

memo1.Font.Size:=10;

end;

//打开文件

procedure TForm1.fileopenClick(Sender: TObject);

begin

if opendialog1.execute then

memo1.Lines.LoadFromFile(opendialog1.filename);

end;

//保存文件

procedure TForm1.filesaveClick(Sender: TObject);

begin

if savedialog1.execute then

memo1.Lines.SaveToFile(savedialog1.filename);

end;

//剪贴

procedure TForm1.editcutClick(Sender: TObject);

begin

memo1.CutToClipboard;//对剪贴板的操作

end;

//复制

procedure TForm1.editcopyClick(Sender: TObject);

begin

memo1.CopyToClipboard; //对剪贴板的操作

end;

//粘贴

procedure TForm1.editpasteClick(Sender: TObject);

begin

memo1.PasteFromClipboard; //对剪贴板的操作

end;

//自动换行

auto1.Checked:=not auto1.Checked;

if auto1.Checked then

memo1.WordWrap:=true

国 Delphi 7控件实用程序设计 100例

– 260 –

else

memo1.WordWrap:=false;

//全选

procedure TForm1.selectall1Click(Sender: TObject);

begin

memo1.SelectAll;

end;

//文本的左对齐

procedure TForm1.leftalignClick(Sender: TObject);

begin

leftalign.Checked:=not leftalign.Checked;

if leftalign.Checked then

memo1.Alignment:=taleftjustify;

end;

//文本的加粗

bold1.Checked:=not bold1.Checked;

if bold1.Checked then

memo1.Font.Style:=memo1.Font.Style+[fsbold]

else

memo1.Font.Style:=memo1.Font.Style-[fsbold];

//设置背景

procedure TForm1.backgroundClick(Sender: TObject);

begin

if colordialog1.execute then

memo1.Color:=colordialog1.color;

end;

此处代码略,详见本书光盘。

实例 85 ActionList——应用程序通用功能列表

实例效果 本例使用 Delphi自带的 ActionList控件,没有编写一行代码,轻松制作了一个文本编辑器,

可以实现常见的文本编辑器的打开、编辑、保存、打印、寻找等几乎所有功能,运行效果如图

85-1所示。

第六篇 系统、文件及其他国

– 261 –

图 85-1 运行界面图

控件说明 本例主要讲解了 Delphi自带的应用程序通用功能列表控件 ActionList,该控件把应用程序

常见的功能如打开、编辑、保存、打印、寻找等封装到控件内部,使开发者不用编写一行代码,

轻松实现常见功能,显示了 Delphi模块化编程思路的突出优点。 1.本控件主要属性如表 85-1所示。 表 85-1 控件主要属性 属性 作用 本例设置 备注

ImageList 图形列表 ImageList 1

ShareImage 是否共享受图形列表 False

State 状态 asNormal

2.主要事件。 OnChange:功能列表项改变时发生。 OnExecuse:功能列表项执行时发生。 OnUpdate:功能列表项更新时发生。

制作步骤 一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 ToolBar控件、一个 MainMenu控件、一个 ImageList 控件,在 ToolBar控件、MainMenu控件中增加项目,在 ImageList 控件加入常见的按钮图标,详细设置见本书光盘。

2.添加一个 ActionList控件,双击出现编辑框,如图 85-2所示。

图 85-2 ActionList编辑框

国 Delphi 7控件实用程序设计 100例

– 262 –

在这里可以增加新的设置 Actions 功能,如打开、编辑、保存、打印、寻找等。 3.添加完 Actions 功能后,把菜单项与工具栏项的 Actions 属性与上面设置完成的

ActionList控件的对应项关联起来。 最后完成界面如图 85-3所示。

图 85-3 设计期界面实例

实例 86 PrintPreview——打印预览

实例效果 本例使用 PrintPreview控件,实现了打印预览功能,并可以放缩显示。结合 Delphi自带的

打印控件,可以作出专业效果,运行效果如图 86-1、图 86-2所示。

图 86-1 运行界面图 图 86-2 运行界面图

控件说明 1.本例主要讲解了第三方控件 PrintPreview,该控件主要属性如表 86-1所示。

第六篇 系统、文件及其他国

– 263 –

表 86-1 控件主要属性 属性 作用 本例设置 备注

MarginBotton 纸张底部幅宽 60

MarginTop 纸张顶部幅宽 60

Orientation 纸张定位 poPortrait

Resulotion 解析度 100

Zoon 比例 100

2.主要事件。 OnChange:预览改变时发生。 OnEndDoc:打印作业完成时发生。 OnNewPage:开始打印新一页时发生。 3.主要方法。 Canvas.TextRect:设置预览。 Print:打印。 4.控件性质:PrintPreview控件是免费性的第三方控件。 5.下载地址:http://www.Delphi51.com/。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 Image 控件、一个 Panal 控件、一个 PrintPreview控件。 2.在 Panal 控件上添加一个 ComboBox 控件、两个 Button 控件、两个 Label 控件,详细

设置见光盘。最后完成界面如图 86-3所示。

图 86-3 设计期界面

二、源代码及注释 procedure TForm1.Button2Click(Sender: TObject);

begin

国 Delphi 7控件实用程序设计 100例

– 264 –

if PrintPreview1.State = psReady then

PrintPreview1.Print; //打印

ActiveControl := PrintPreview1;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

case ComboBox1.ItemIndex of //预览比例

0: PrintPreview1.Zoom := 50;

1: PrintPreview1.Zoom := 100;

2: PrintPreview1.Zoom := 150;

3: PrintPreview1.Zoom := 200;

4: PrintPreview1.ZoomState := zsZoomToWidth;

5: PrintPreview1.ZoomState := zsZoomToFit;

end;

ActiveControl := PrintPreview1;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

I, FontSize: Integer;

R: TRect;

begin

Randomize;

with PrintPreview1 do

begin

R := PageRect;

BeginDoc;

FontSize := Canvas.Font.Size;

for I := 0 to 25 do

begin

Inc(FontSize, I);

Canvas.Font.Size := FontSize;

Canvas.Font.Color := RGB(Random(256), Random(256), Random(256));

if (R.Top - Canvas.Font.Height) > PageRect.Bottom then

begin

NewPage; //设置新页

Canvas.Font.Size := FontSize;

R := PageRect;

end;

R.Bottom := R.Top - Canvas.Font.Height;

第六篇 系统、文件及其他国

– 265 –

Canvas.TextRect(R, R.Left, R.Top, 'This is a sample text'); //文本打印预览

R.Top := R.Bottom;

end;

NewPage;

R.Left := (PaperWidth - Image1.Width) div 2;

R.Right := (PaperWidth + Image1.Width) div 2;

R.Top := (PaperHeight - Image1.Height) div 2;

R.Bottom := (PaperHeight + Image1.Height) div 2;

InflateRect(R, 15 * Image1.Width, 15 * Image1.Height);

Canvas.StretchDraw(R, Image1.Picture.Graphic); //图形打印预览

EndDoc;

end;

ActiveControl := PrintPreview1;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

ComboBox1.ItemIndex := 5; //初始化预览比例

end;

procedure TForm1.PrintPreview1Change(Sender: TObject);

begin

if PrintPreview1.CurrentPage <> 0 then

begin

with PrintPreview1 do

Label3.Caption := Format('Page %d of %d', [CurrentPage, TotalPages]); //显示页数

Label3.Update;

end

else

Label3.Caption := 'Empty';

end;

end.

实例 87 制作图片浏览器

实例效果 本例使用 Delphi 自带的文件类 TDriveCombobox 控件、TDirectoryListBox 控件、

TFilterComboBox 控件和 TFileListBox 控件,制作了一个图片浏览器,当在 TfilterComboBox中单击所要查看的图片时,下边的图片框 Image1中显示选中的图像,运行效果如图 87-1所示。

国 Delphi 7控件实用程序设计 100例

– 266 –

图 87-1 运行界面图

控件说明 本例主要使用了Delphi自带的文件类控件TDriveCombobox控件、TDirectoryListBox控件、

TFilterComboBox控件和 TFileListBox控件选择文件,这几个控件的添加与设置顺序如下: 第一步,添加 TDriveCombobox控件、TDirectoryListBox控件、TFilterComboBox控件和

TFileListBox控件以及 Tbevel、Timage控件。 第二步,使 TDriveCombobox 控件、TDirectoryListBox 控件、TFilterComboBox 控件和

TfilterComboBox 四个文件类型控件在内容上保持一致,其中一个控件内容的变化都会引起其他三个控件内容的相应变化,需要编写每一个控件的 OnChange()事件,每当文件类控件中的内容发生变化时,都会触发这个事件。通过 TfileListBox控件的 OnDblClick()事件将图片加载到 Image1中显示。详细过程如下:

1. 首先编写 TForm1.DriveComboBox1Change(Sender: TObject)过程,代码如下: directorylistbox1.Drive:=drivecombobox1.Drive; //驱动器列表的变化引起相应的文件目录的变化。 2. 再编写 procedure TForm1.DirectoryListBox1Change(Sender: TObject)过程,代码如下: filelistbox1.Directory:=directorylistbox1.Directory; //文件目录列表的变化引起相应的文件列表的变化。 3. 然后编写 TForm1.FileListBox1DblClick(Sender: TObject)过程,代码如下: image1.Picture.LoadFromFile(filelistbox1.FileName); //通过双击相应的文件,给 image1加载要浏览的图像。 本例控件主要属性如表 87-1所示。 表 87-1 控件主要属性 控件名称 属性 作用 本例设置 备注

TdriveCombobox1 DirList 目录列表 TdirectoryListBox1

TTDirectoryListBox FileList 文件列表 TfileListBox1

TFilterComboBox FileList 应用的文件列表控件 TfileListBox1

TFilterComboBox Filter 过滤文件类型 *.bmp

TFilterComboBox Filter Name 过滤文件类型名称 bmp文件

第六篇 系统、文件及其他国

– 267 –

注意:本例只适合于打开*.bmp类型的图片,如果要打开其他类型的图片,需要另加代码。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 TDriveCombobox 控件、一个 TDirectoryListBox 控件、一个 TFilterComboBox 控件、一个TFileListBox控件、一个 Tbevel 控件、一个 Timage 控件,按照需要的显示方式调整它们在窗体上的位置和大小。

2.设置 TdriveCombobox1 的 DirList 属性为 TdirectoryListBox1,以便在改变驱动器列表时能在 TdirectoryListBox1 中显示相应的文件目录。设置 TDirectoryListBox的 FileList属性为TfileListBox1,以便在改变目录列表时能在 TdirectoryListBox1 中显示相应的文件。设置TFilterComboBox的 FileList属性为 TfileListBox1,以便使 TfileListBox1具有自动文件过滤功能。设置 TFilterComboBox的 Filter属性为*.bmp,选择过滤文件类型。设置 TFilterComboBox的 Filter Name属性为 bmp文件,显示过滤的文件类型。其余详细设置见本书配套光盘相应源代码。最后完成界面如图 87-2所示。

图 87-2 设计期界面

二、源代码及注释 unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, FileCtrl, StdCtrls;

type

TForm1 = class(TForm)

FileListBox1: TFileListBox;

国 Delphi 7控件实用程序设计 100例

– 268 –

DirectoryListBox1: TDirectoryListBox;

DriveComboBox1: TDriveComboBox;

FilterComboBox1: TFilterComboBox;

Bevel1: TBevel;

Image1: TImage;

procedure DriveComboBox1Change(Sender: TObject);

procedure DirectoryListBox1Change(Sender: TObject);

procedure FileListBox1DblClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DriveComboBox1Change(Sender: TObject);

begin

directorylistbox1.Drive:=drivecombobox1.Drive;

end;

procedure TForm1.DirectoryListBox1Change(Sender: TObject);

begin

filelistbox1.Directory:=directorylistbox1.Directory;

end;

procedure TForm1.FileListBox1DblClick(Sender: TObject);

begin

image1.Picture.LoadFromFile(filelistbox1.FileName);

end;

end.

实例 88 图形打印 实例效果 对于早期的 Windows 应用程序开发者来说,图像打印功能的实现是极为棘手的。因为它

要涉及到相当多的复杂代码,但是在 Delphi 中实现图像的打印功能却是非常容易的。这里通过使用 Delphi自带的控件 TprintDialog、TprintSetupDialog,结合图像控件 Timage轻松实现了图片的打印。效果如图 88-1、图 88-2、图 88-3所示分别演示了打印机的设置、打印过程。另

第六篇 系统、文件及其他国

– 269 –

外,通过弹出菜单的方式可以调入想要打印的图片,图片的尺寸按照实际尺寸的变化而变化。

图 88-1 效果图(1)

图 88-2 效果图(2) 图 88-3 效果图(3)

控件说明 Delphi中图像的打印功能如同在 DOS中实现图像的打印功能一样容易,需要做的一切只

是取得打印参数,打开打印机,然后发送图像的内容。在 Delphi中提供了一个 Printers程序单元,它说明了一个 TPrinter 对象,封装了 Windows 打印工作和输出打印机之间的接口,并提供常用的属性和方法。其中画布 Canvas是一个非常有用的属性,它代表了当前打印文件的表面是以图形方式来工作的,整个的打印输出工作仅仅是将打印的内容输出到 TPrinter的 属 性Canvas上,全部的输出工作完成以后,打印对象(TPrinter)把 Canvas的属性值送到打印机上。 在 Delphi中提供了 PrinterDialog、PrinterSetupDialog两个控件,允许进行打印机以及其他

影响打印输出的参数进行选择。最重要的一点是要想实现打印功能,必须在编译程序以前将

Printers 加入到 Interface 或 者 Implementation 的 Uese 语句当中,因为 Printers 单元包括AssignPRN和其他控制打印机的过程。

1.PrinterDialog控件主要属性如表 88-1所示。 表 88-1 控件属性 属性 作用 本例设置 备注

FromPage 开始页 0

ToPage 结束页 0

PrintRange 打印范围

PrintToFile 打印到文件 False

2.PrinterSetupDialog控件主要属性如表 88-2所示。

国 Delphi 7控件实用程序设计 100例

– 270 –

表 88-2 控件属性 属性 作用 本例设置 备注

Ctl3D 显示形式 True

Tag 相关信息 0

3.主要事件。 OnClose:在打印对话框关闭时触发。 OnShow:在打印对话框显示时触发。 4.主要方法。 execute:打开打印设置对话框。 注意:纸型、打印方向的选择都可以通过双击打印设置对话框,可视化添加。程序运

行之前,控制面板中必须已经设定打印机,否则的话程序将出错。

制作步骤

一、窗体界面的建立 1.在 Form1当中加入 PrintDialog、PrintSetupDialog和两个 Button控件,两个 Button的

Caption分别为“打 印 设 置”和“打 印”,设置 PrintDialog1的 PrintRange属性为 prSelection。 2.在 Form1当中加入 Image控件、PopupMenu控件各一个,设置 Image1的 PopupMenu

属性为 PopupMenu1,ShowHint 属性为 yes,Hint 属性为“右击载入图片”。其余详细设置见本书配套光盘相应源代码。界面设计期效果如图 88-4所示。

图 88-4 界面设计期效果

二、源代码及注释 //打印设置按钮

procedure TForm1.Button1Click(Sender: TObject);

if printdialog1.execute then

begin

printer.begindoc;

printer.canvas.draw(0,0,image1.picture.graphic);

printer.enddoc;

end;

第六篇 系统、文件及其他国

– 271 –

end;

//打印按钮

procedure TForm1.Button2Click(Sender: TObject);

strect:Trect; //定义打印输出矩形框的大小

begin

if printdialog1.execute then

begin

temhi:=image1.picture.height;

temwd:=image1.picture.width;

while (temhi<> printer.pageheight div 2)and

//将图形放大到打印页面的 1/2大小

(temwd <>printer.pagewidth div 2) do

begin

temhi:=temhi+temhi;

temwd:=temwd+temwd;

with strect do //定义图形在页面上的中心位置输出

begin

left:=(printer.pagewidth -temwd) div 2;

top:=(printer.pageheight-temhi) div 2;

right:=left+temwd;

bottom:=top+temhi;

with printer do

begin

begindoc;

//将放大的图形向打印机输出

canvas.stretchdraw(strect,image1.picture.graphic);

此处代码略,详见本书光盘。

实例 89 OleContainer——OLE容器

实例效果 本例使用 OleContainer控件,动态调用系统注册的有关图形处理应用程序对象,轻松进行

各种复杂的图形处理,效果如图 89-1、图 89-2、图 89-3所示。

国 Delphi 7控件实用程序设计 100例

– 272 –

图 89-1 效果图(1)

图 89-2 效果图(2)

图 89-3 效果图(3)

控件说明 OleContainer 控件的作用是嵌入或连接 OLE 对象,所谓 OLE 就是应用程序之间交换数据

和相互操纵的一种方式。OLE 客户也叫 OLE 容器,指请求数据或者操纵其他程序的程序。要创

第六篇 系统、文件及其他国

– 273 –

建一个 OLE客户程序,首先双击 OleContainer 控件,Delphi将显示“插入对象”对话框,在这里可以选择一种 OLE对象类型。“插入对象”对话框实际上是Windows系统的公共对话框,在运行时可以调用 InserTobjectDialog函数打开同样的对话框。要打开一个 OLE对象,在“插入对象”对话框中选择“由文件创建”,在“文件”框内键入文件名或单击“浏览”按钮,指

定一个文件名,并选中“链接”复选框,最后单击 OK按钮。 1.OleContainer控件主要属性如表 89-1所示。

表 89-1 主要属性 属性 作用 本例设置 备注

AllowActiveDoc 该属性表示活动文档对象是否放到 OLE容器中 AutoActivate 该属性设置运行期激活 OLE对象的方式 BorderStyle 用于设置 OLE容器的边框 bsSingle SizeMode 用于设置 OLE对象的尺寸方式 State 描述 OLE对象的状态

2.主要事件。 OnActive:激活时触发。 OnExit:退出时触发。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,新建一个 Form2,

并在上面添加一个 OleContainer 控件(System 组件页)。把它的 Align 属性设为 alclient,BorderStyle属性设为 bsSingle。

2.在 Form1上放置一个 CoolBar控件,在它之上放置一个 ToolBar控件,同时在 ToolBar控件上新建了 6 个按钮;添加一个 ImageList 控件、一个 MainMenu 控件、一个 OpenDialog控件、一个 SaveDialog控件和一个 StatusBar控件。

3.最后新建一个窗体作为关于窗体,添加一个 Image控件和一个 label控件。 详细设置见本书光盘,最后完成主窗口界面如图 89-4所示。

图 89-4 界面设计期效果

二、源代码及注释 //新建一个 OLE图形

procedure TMainForm.FileNewItemClick(Sender: TObject);

begin

国 Delphi 7控件实用程序设计 100例

– 274 –

inc(NumChildren);

{ create a new MDI child window }

with TMDIChild.Create(Application) do

begin

Caption := 'NEW' + IntToStr(NumChildren);

//打开插入 OLE 对象对话框并且插入到新建的窗体

OleContainer.InsertObjectDialog;

end;

end;

///打开以有的 OLE文件

procedure TMainForm.FileOpenItemClick(Sender: TObject);

begin

if OpenDialog.Execute then

with TMDIChild.Create(Application) do

begin

try

OleFileName := OpenDialog.FileName;

OleContainer.LoadFromFile(OleFileName);

Show;

except

Release; //发生错误则释放

raise; //例外

end;

end;

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

Application.OnHint := ShowHint;

Screen.OnActiveFormChange := UpdateMenuItems;

end;

//窗体所有最小化

procedure TMainForm.WindowMinimizeItemClick(Sender: TObject);

var

I: Integer;

begin

{按序号MDIChildren 数组从前向后 }

for I := MDIChildCount - 1 downto 0 do

MDIChildren[I].WindowState := wsMinimized;

end;

第六篇 系统、文件及其他国

– 275 –

实例 90 XPForm——XP窗体 实例效果 本例使用 XPForm模块,制作了一个 XP窗体,与Windows XP的窗体几乎相同,效果如

图 90-1所示。

图 90-1 效果图

控件说明 XPForm模块的安装与控件类似,安装后在“新建”对话框中会出现模块图标,如图 90-2

所示。

图 90-2 XPForm模块

XPForm 模块在 FormPaint 事件中对窗体进行绘制,形成 XP 效果。可以像使用普通窗口一样使用它。

1.其主要属性与普通窗口基本相同,如表 90-1所示。 表 90-1 主要属性

属性 作用 本例设置 备注 ActiveControl 当前活动控件 Autoscroll 是否自动滚动 True menu 主菜单 bsSingle Popupmenu 弹出菜单

国 Delphi 7控件实用程序设计 100例

– 276 –

2.主要事件。 OnCreat:创建时触发。 OnDestroy:销毁时触发。 OnActive::激活时触发。 FormPaint:绘制时触发。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击 New 按钮项,选择 Project页的 XPForm项,新建一个 XP工程,

在 XPForm1上添加 4个 TCoolBar控件(Win32组件页),2个 TToolBar控件(Win32组件页),一个MainMenu控件(Standard组件页),1个 ImageList1控件,设置它们的属性。

2.在两个 ToolBar上单击鼠标右键,选择 New Button,添加几个 ToolButton按钮。双击MainMenu控件,添加菜单项。 详细设置见本书光盘,最后完成主窗口界面如图 90-3所示。

图 90-3 界面设计期效果

二、源代码及注释 procedure TXPForm.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

Params.Style := Params.Style and (not WS_CAPTION) and (not WS_BORDER);

Params.Style := Params.Style or WS_POPUP or WS_THICKFRAME or WS_CLIPCHILDREN;

end;

procedure TXPForm.btnCloseClick(Sender: TObject);

begin

if not btnClose.Visible then Exit; //关闭

Close;

end;

第六篇 系统、文件及其他国

– 277 –

procedure TXPForm.pnlCaptionMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if WindowState = wsMaximized then Exit;

ReleaseCapture; //释放标题栏

Perform(WM_SysCommand, $F012, 0);

end;

procedure TXPForm.btnMaxClick(Sender: TObject);

begin

if not btnMax.Visible then Exit;

FMax := not FMax;

if FMax then begin

WindowState := wsMaximized;

// btnMax.Caption := resBtnRestoreCap;

btnMax.Hint := resBtnRestoreHint;

end else begin

WindowState := wsNormal;

// btnMax.Caption := resBtnMaxCap;

btnMax.Hint := resBtnMaxHint;

end;

end;

constructor TXPForm.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

AlphaBlend := Byte(255); //透明度

SetAlphaBlend(FAlphaBlend);

SetSysBtnVisible;

if ImgIcon.Picture.Graphic <> nil then Exit;

if (AOwner is TForm) then begin

ImgIcon.Picture.Assign(TForm(AOwner).Icon); //图标

end else begin

if (AOwner is TApplication) then begin

ImgIcon.Picture.Assign(TApplication(AOwner).Icon);

end;

end;

end;

destructor TXPForm.Destroy;

begin

inherited Destroy; //销毁 XP属性

国 Delphi 7控件实用程序设计 100例

– 278 –

end;

function TXPForm.GetCaptionBKColor: TColor;

begin

Result := pnlCaptionParent.Color;

end;

function TXPForm.GetCaptionFont: TFont;

begin

Result := pnlCaption.Font; //标题栏字体

end;

procedure TXPForm.FormPaint(Sender: TObject);

begin

Canvas.Pen.Color:=$00E15400; //绘制 XP效果

Canvas.Pen.Width:=3;

Canvas.Polyline([point(10,10),point(Width,0),// XP边框效果

point(Width-10,Height-5),

point(0,Height-5),point(0,0)]);

end;

procedure TXPForm.FormResize(Sender: TObject);

begin

Repaint //重绘

end;

实例 91 CoolItem——提示栏菜单 实例效果 本例使用 CoolItem 控件,制作了一个提示栏菜单。当鼠标移动到编辑文本框上时,会出

现提示栏形式菜单,可以使用其进行复制、粘贴等基本操作,与金山词霸的提示栏菜单非常类

似,效果如图 91-1所示。

图 91-1 效果图

第六篇 系统、文件及其他国

– 279 –

控件说明 1.本例主要讲解第三方控件 CoolItem,该控件主要属性如表 91-1所示。

表 91-1 主要属性 属性 作用 本例设置 备注

Action 动作列表 代码设置 ImageIndex 各菜单项使用的图标序号

Hint 提示 Popupmenu 弹出菜单

2.主要事件。 OnExecute:执行时触发。 OnPaint:绘制时触发。 3.主要方法。 Show:显示。 Hide:隐藏。 RePaint:重绘。 4.控件性质:CoolItem控件为 Cool Menu Pro控件组中的一个,为免费性的第三方控件。 5.下载地址:http://www.cooldev.com/。 注意:使用 CoolItem 控件制作提示栏菜单效果时,需要结合使用该控件组内的

EditSubMenu窗体模块。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,添加一个 ActionList

控件、一个 ImageList 控件、一个 Edit 控件、两个 RadioButton控件、一个 Label控件。双击ActionList控件、ImageList控件,添加项目。

2.添加 1 个 EditSubMenu 窗体模块,在其上添加 3 个 CoolItem2000 控件,设置它们的Action属性。详细设置见本书光盘,最后完成主窗口界面如图 91-2所示。

图 91-2 界面设计期效果

国 Delphi 7控件实用程序设计 100例

– 280 –

二、源代码及注释 主要代码如下: procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

// 鼠标不在控件上面时...

EditSubMenu.Terminated := False;

FileSubMenu.Terminated := False;

end;

procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint;

var Handled: Boolean);

begin

// 屏蔽标准菜单...

Handled := True;

end;

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

EditSubMenu.FrameType := ftEdge; //提示栏菜单样式

FileSubMenu.FrameType := ftEdge;

end;

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

EditSubMenu.FrameType := ftFrame;

FileSubMenu.FrameType := ftFrame;

end;

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

FileSubMenu.HideMenu;

EditSubMenu.ActivateHint(Edit1, Edit1.Width div 2, Edit1.Height div 2, 1000); //显示提示栏菜单

end;

实例 92 DsnRegister——运行时 IDE设计环境

实例效果 本例使用 DsnRegister控件,制作了一个运行时的 IDE设计环境,可以让开发者在程序运

第六篇 系统、文件及其他国

– 281 –

行时调整控件的属性(大小、位置等),如同一个小型的 Delphi,效果如图 92-1所示。

图 92-1 效果图

控件说明 本例主要讲解第三方控件 DsnRegister,该控件为 Dsnsys控件组中的一个,本例中使用的

Dsnsys 控件组中其余控件:DsnDpRegister、DsnRSRegister、DsnClRegister,其主要差别在于调整控件的属性时的外观,DsnRegister在调整控件的四周出现 4个黑点,DsnDpRegister出现8个黑点,DsnRSRegister出现 2个黑点,DsnClRegister出现彩色边框。

1.DsnRegister主要属性如表 92-1所示。

表 92-1 主要属性 属性 作用 本例设置 备注

DsnInspector Dsnsys控件侦测 DsnInspector1

DsnPanal Dsnsys控件设置容器

DsnStage Dsnsys控件设置页 DsnStage1

2.主要事件。 OnExit:退出时触发。 OnResize:改变大小时触发。 3.主要方法。 Show:显示。 Hide:隐藏。 Refresh:刷新。 4.控件性质:DsnRegister控件为 Dsnsys控件组中的一个,为免费性的第三方控件。 5.下载地址:http://www.51delphi.com/。 注意:使用 DsnRegister控件需要关联使用该控件组内的 DsnInspector控件。

国 Delphi 7控件实用程序设计 100例

– 282 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,添加 4个 DsnSwitch

控件、1 个 DsnRegister 控件、1 个 DsnDpRegister 控件、1 个 DsnRSRegister 控件、1 个DsnClRegister控件、1个 DsnInspector控件、DsnStage控件。

2.在DsnStage上添加2个Panel控件,添加2个Button控件、2个Memo控件、2个ComboBox控件。

3.添加 FontDialog控件、1个 ColorDialog控件,2个 Button控件,详细设置见本书光盘,最后完成主窗口界面如图 92-2所示。

图 92-2 界面设计期效果

二、源代码及注释 procedure TForm1.DsnSwitch1Click(Sender: TObject);

begin

if TSpeedButton(Sender).Down then

begin

if Sender <> DsnSwitch1 then //属性调整时边框样式

DsnSwitch1.Enabled:= False;

if Sender <> DsnSwitch2 then

DsnSwitch2.Enabled:= False;

if Sender <> DsnSwitch3 then

DsnSwitch3.Enabled:= False;

if Sender <> DsnSwitch4 then

DsnSwitch4.Enabled:= False;

end

else

第六篇 系统、文件及其他国

– 283 –

begin

DsnSwitch1.Enabled:= True;

DsnSwitch2.Enabled:= True;

DsnSwitch3.Enabled:= True;

DsnSwitch4.Enabled:= True;

end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

Form2.Showmodal;

end;

procedure TForm1.DsnInspector1BtnClick(Sender: TObject;

Targets: TSelectedComponents; PropName: String; var Value: String);

// Targets: 被选择控件

// PropName: 用户选择的属性名

var

PropInfo:PPropInfo; // TypInfo.pas

aFont:TFont;

i:integer;

Component: TComponent;

begin

// Object Inspector Buntton Click

if PropName = 'Color' then

if ColorDialog1.Execute then

Value:=IntToStr(ColorDialog1.Color);

if PropName = 'Font' then //属性响应

begin

Component:= Targets[0];

PropInfo:= GetPropInfo(Component.ClassInfo,PropName);

aFont:=TFont(GetOrdProp(Component,PropInfo));

FontDialog1.Font.Assign(aFont);

if FontDialog1.Execute then

for i:= 0 to Targets.Count -1 do

begin

Component:= Targets[i];

PropInfo:= GetPropInfo(Component.ClassInfo,PropName);

aFont:=TFont(GetOrdProp(Component,PropInfo));

aFont.Assign(FontDialog1.Font);

end;

国 Delphi 7控件实用程序设计 100例

– 284 –

end;

end;

实例 93 GradProgress——渐变填充的进度条

实例效果 进度条是程序运行时经常见到的功能,一般都是蓝色,这里介绍了一个用渐变色逐渐填充

的进度条 GradProgress 控件,效果别致,如图 93-1 所示,演示了横向、纵向生成不同颜色渐变填充的进度条。

图 93-1 效果图

控件说明 1.该控件主要属性如表 93-1所示。

表 93-1 控件属性 属性 作用 本例设置 备注

BackColor 进度条背景色

StartColor 开始渐变颜色 clRed *

EndColor 结束渐变颜色 clYellow *

Position 进度位置 代码设置 Style 进度条渐变方向 GsHorizontal/gsVertical 水平/垂直 ShowPercent 显示进度百分比 True/False 显示/隐藏

2.本例使用了该控件的方法 Stepit,每次 Timer发生时,递进一个 step的值,代码如下: procedure TForm1.Timer1Timer(Sender: TObject);

begin

g1.Stepit;

g2.Stepit;

g3.Stepit;

第六篇 系统、文件及其他国

– 285 –

g4.Stepit;

g5.Stepit;

GradProgress1.Stepit;

end;

end.

3.控件性质:免费/全部源代码。 4.下载地址:http://www.playicq.com/。 注意:使用 GradProgress控件特别需要注意的是属性表备注栏中带“*”号的属性项,其中 StartColor、EndColor属性必须设置为不同的值,才能显示出渐变填充的效果,ShowPercent属性的不同设置则可以显示或隐藏进度百分比符号。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 GroupBox控件(Standard组件页),其 Caption属性设置为 Bevels - colors - percent。 2.在 GroupBox1 上添加 6 个 ToolBar 控件(Sample 组件页),分别设置 StartColor、

EndColor、属性为不同的值,前 5个 ToolBar控件的 Style属性设置为 GsHorizontal,表示水平方向的进度条,最后一个 ToolBar控件的 Style属性设置为 gsVertical,表示垂直方向的进度条。

3.增加一个 Timer控件(Win32组件页),设置 Interval属性为 10。 最后完成界面如图 93-2所示。

图 93-2 设计期界面

完整编译代码略,详见本书光盘。

实例 94 SimplePie——饼图进度条

实例效果 本例使用 SimplePie控件,制作了一个饼图进度条,效果别致,如图 94-1所示。

国 Delphi 7控件实用程序设计 100例

– 286 –

图 94-1 效果图

控件说明 1.本例主要讲解第三方控件 SimplePie,该控件主要属性如表 94-1所示。

表 94-1 控件属性 属性 作用 本例设置 备注

Basecolor 饼图进度条背景色 clFuchsia

UsedColor 进度完成颜色 clBlue *

EndColor 结束渐变颜色 clYellow *

Position 进度位置 0

2.主要事件。 MouseMove:鼠标在其上移动时。 3.主要方法。 Show:显示。 Hide:隐藏。 Refresh:刷新。 4.控件性质:SimplePie控件为免费性的第三方控件。 5.下载地址:http://www.51delphi.com/。 注意:Position属性为 0~100,即代表百分比。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一

个 SimplePie控件,一个 Label控件。 2.增加一个 Timer控件(Win32组件页),设置 Interval属性为 100。 最后完成界面如图 94-2所示。

第六篇 系统、文件及其他国

– 287 –

图 94-2 设计期界面

二、源代码及注释 procedure TForm1.Timer1Timer(Sender: TObject);

begin

SimplePie1.position:=SimplePie1.position +1 ; //显示进度

Label1.Caption :='完成进度:'+inttostr(SimplePie1.position)+'%';

end;

procedure TForm1.SimplePie1MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

SimplePie1.ShowHint:=true;

SimplePie1.Hint:=inttostr(SimplePie1.position)+'%'

end;

实例 95 PBOpenPreviewDialog/ PBSavePreviewDialog——带预览文本、图像功能的对话框

实例效果 本例使用 PBOpenPreviewDialog、PBSavePreviewDialog 控件,制作了一个带预览文本、

图像功能的对话框,打开或保存前可以先预览,与一些常见流行软件的效果十分类似,如图

95-1、图 95-2所示。

图 95-1 效果图

国 Delphi 7控件实用程序设计 100例

– 288 –

图 95-2 效果图

控件说明 本例主要讲解第三方控件 PBOpenPreviewDialog、 PBSavePreviewDialog 控件,

PBOpenPreviewDialog控件用于打开时预览,PBSavePreviewDialog控件用于保存时预览。 1.PBOpenPreviewDialog控件主要属性如表 95-1所示。

表 95-1 控件属性 属性 作用 本例设置 备注

CustomPreviewExtensions 预览扩展名 xxx yyy zzz

Filename 文件名 clBlue *

Filter 过滤文件类型 clYellow *

InitialDir 初始路径 0

ShowPreview 显示预览 True

2.主要事件。 MouseMove:鼠标在其上移动时。 3.主要方法。 Execute:显示对话框。 Hide:隐藏。 Free:释放内存。 4.控件性质:PBOpenPreviewDialog、PBSavePreviewDialog控件为免费性的第三方控件。 5.下载地址:http://www.51delphi.com/。

制作步骤

一、窗体界面的建立 启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在 Form1上添加一个

PBOpenPreviewDialog、PBSavePreviewDialog控件,一个 Label控件、两个 Button控件。 最后完成界面如图 95-3所示。

第六篇 系统、文件及其他国

– 289 –

图 95-3 设计期界面

二、源代码及注释 procedure TForm1.OpenButtonClick(Sender: TObject);

begin

PBOpenPreviewDialog1.Execute; //打开对话框

end;

procedure TForm1.SaveButtonClick(Sender: TObject);

begin

PBSavePreviewDialog1.Execute;

end;

procedure TForm1.PBOpenPreviewDialog1Preview(Sender: TPBOpenPreviewDialog; Ext: String);

var

F : textfile;

Linex, X1, Y1, X2, Y2 : string;

begin

with Sender do

begin

if Ext = 'xxx' then

begin

try

AssignFile(F, FileName);

Reset(F);

ReadLn(F, Linex);

if Linex = '[Preview]' then //预览文本

begin

ReadLn(F, Linex);

Repeat

PreviewText.Lines.Add(Linex);

ReadLn(F, Linex);

until (Linex = '[data]') or eof(F);

end;

finally

CloseFile(F);

国 Delphi 7控件实用程序设计 100例

– 290 –

end;

end

else if Ext = 'yyy' then

begin

try

AssignFile(F, FileName);

Reset(F);

ReadLn(F, X1);

ReadLn(F, Y1);

ReadLn(F, X2);

ReadLn(F, Y2);

with PreviewImage.Picture.Bitmap do //预览图形

begin

Width := 320;

Canvas.Brush.Color := clBlue;

Canvas.Ellipse(strtoint(X1), strtoint(Y1), strtoint(X2), strtoint(Y2));

end;

finally

CloseFile(F);

end;

end

else if Ext = 'zzz' then

begin

PreviewText.Lines.LoadFromFile(FileName);

end;

end;

end;

function TForm1.LocaleText(List : TStrings) : string; //定位文本

var

FLocale : string;

begin

FLocale := IntToHex(GetUserDefaultLangID, 4);

if List.Count = 0 then Result := ''

else

begin

if List.IndexOfName(FLocale) <> -1 then Result := List.Values[FLocale]

else if List.IndexOfName('Default') <> -1 then Result := List.Values['Default']

else Result := List.Values[List.Names[0]];

end;

第六篇 系统、文件及其他国

– 291 –

end;

实例 96 与Word文档关联控件

实例效果 Microsoft Word是应用最普遍的文本处理程序,而若 Delphi中处理的数据、图形等资料可

以直接输入到Word 文档中,实现与Word文档的关联,将会给相关工作带来极大的方便。本例通过 WordDocument、WordApplication和WordFont控件编程实现了这一功能。首先启动程序,窗体上的 DBImage、DBGrid 等控件将自动连接到 Delphi 自带的数据库,显示效果如图96-1所示。点击“Insert record”按钮,程序自动把选中的图片和数据插入到Word文档中,如图 96-2所示。图 96-3演示了改变字体大小和字体类型以及另一幅图片,图 96-4演示了打印预览(Print Preview)。

图 96-1 运行界面图(1)

图 96-2 运行界面图(2)

国 Delphi 7控件实用程序设计 100例

– 292 –

图 96-3 运行界面图(3)

图 96-4 运行界面图(4)

控件说明 1.本例主要讲解 Delphi 自带的 Word 文档关联 WordDocument、WordApplication 和

WordFont控件,其主要属性如表 96-1、96-2、96-3所示。

表 96-1 WordDocument控件主要属性 属性 作用 本例设置 备注

AutoConnect 是否自动连接 false ConnectKind 连接种类 ckRunningOrNew 它有 4种连接方式:

CkAttachToInterface CkNewInstance CkRemote CkRunningInstance ckRunningOrNew

RemoteMachineName 远程计算机名

第六篇 系统、文件及其他国

– 293 –

表 96-2 WordApplication控件主要属性 属性 作用 本例设置 备注

Options 选项 在代码里设置

2.WordDocument控件主要方法。 ConnectTo:连接到。 Range:帮助插入一行数据。 Sentences:帮助粘贴句子。 PrintOut:打印。 PrintPreview:打印预览。 3.该控件主要事件。 OnNew:当创建新文档时,此事件发生。 OnPen:当打开文档时,此事件发生。 4.WordApplication控件主要方法。 Quit:退出。 ConnectTo:连接到。 Documents:文档。 Connect:连接。 Disconnect:断开。 5.该控件主要事件。 OnDocumentChange:当文档改变时,此事件发生。 注意:WordApplication控件除了 Options属性,还有 AutoConnect 、ConnectKind 、RemoteMachineName等Word通用属性,使用方法同上。

表 96-3 WordFont控件主要属性 属性 作用 本例设置 备注

Underline 下划线 需要时设置 Bold 粗体 需要时设置 Italic 斜体 需要时设置 Emboss 凸出 需要时设置 Engrave 雕刻 需要时设置 Shadow 阴影 需要时设置 DoubleStrikeThrough 双重删除线 需要时设置 StrikeThrough 删除线 需要时设置 Size 字体大小 10 Name 字体的名称 在代码里设置

6.WordFont控件主要方法。 ConnectTo:连接到。 注意:WordFont 控件除了以上字体属性,还有 AutoConnect 、ConnectKind 、RemoteMachineName等Word通用属性,在此将不在介绍,同上。 7.控件性质:以上控件为 Delphi自带控件(在 Servers组件页)。

国 Delphi 7控件实用程序设计 100例

– 294 –

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置两个GroupBox控件,在它们之上放入两个 Listbox控件、一个 Edit控件、

两个 Label控件和 9个 CheckBox控件,其中一个 CheckBox控件是放在窗体上,并且 Checked属性设为 True;在窗体上放置一个 Table控件、一个 DataSource控件、一个 DBNavigator控件、一个 DBGrid控件、一个 DBImage控件,Table控件的 DatabaseName属性连接“DBDEMOS”数据库,它们的连接在此不再叙述,还加入 4个 Button控件,其中 Caption属性分别设为“Close Word”、“Print”、“Print Preview”、“Insert record”。

3.在窗体上放置WordDocument、WordApplication和WordFont控件各一个,它们的属性为系统默认设置。 详细设置请参阅光盘,最后完成界面如图 96-5所示。

图 96-5 设计期界面

二、源代码及注释 procedure TMainForm.BtnInsertRecordClick(Sender: TObject);

var

Template,NewTemplate,ItemIndex:OleVariant;

procedure

setfont;

begin

//设置在Word文档里显示什么样的字体

WordFont.ConnectTo(WordDocument.Sentences.Get_Last.Font);

if ChkBoxUnderline.checked then WordFont.Underline := 2;

if ChkBoxBold.checked then WordFont.Bold := 1;

if ChkBoxItalic.Checked then WordFont.Italic := 1;

if ChkBoxEmboss.Checked then WordFont.Emboss := 1;

第六篇 系统、文件及其他国

– 295 –

if ChkBoxEngrave.checked then WordFont.Engrave := 1;

if ChkBoxShadow.checked then WordFont.shadow := 1;

if ChkBoxDoublestrike.checked then WordFont.DoubleStrikeThrough := 1;

if ChkBoxStrike.checked then WordFont.StrikeThrough := 1;

WordFont.Size := StrToInt(Size.text);

if Fonttype.Itemindex >= 0 then

WordFont.Name := FontType.Items[FontType.Itemindex];

end;

begin

try

Template := EmptyParam;

NewTemplate := True;

ItemIndex := 1;

try

Wordapplication.Connect;

except

MessageDlg('Word may not be installed', mtError, [mbOk], 0);

Abort;

end;

Wordapplication.Visible := True; //使Word文档可见

WordApplication.Caption := 'Delphi automation';

{创建新文档}

Template := EmptyParam;

NewTemplate := False;

if ChkBoxNewDoc.Checked then

begin

WordApplication.Documents.Add(Template,NewTemplate,Template,Template);

{指定Word文档那部分插入数据}

WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex));

end;

{Turn Spell checking of because it takes a long time if enabled and slows down Winword}

WordApplication.Options.CheckSpellingAsYouType := False;

WordApplication.Options.CheckGrammarAsYouType := False;

{插入数据}

DBImgFishImg.CopyToClipboard; //复制到剪贴板

WordDocument.Sentences.Last.Paste; //粘贴到Word里

SetFont;

//向Word文档里插入字体,其中“ #13”表示换行

WordDocument.Range.InsertAfter(#13+'名称: ' + Table.Fields.Fields[2].AsString + #13);

国 Delphi 7控件实用程序设计 100例

– 296 –

WordDocument.Range.InsertAfter('种类:' + Table.Fields.Fields[3].AsString + #13);

WordDocument.Range.InsertAfter('长度: ' + Table.Fields.Fields[4].AsString);

BtnCloseWord.Enabled := True; //关闭按钮可用

BtnPrint.Enabled := True; //打印按钮可用

BtnPreview.Enabled := True; //打印预览按钮可用

except

//如果没有把数据插入Word,则提示出错

on E: Exception do

begin

ShowMessage(E.Message);

WordApplication.Disconnect; //断开Word连接

end;

end;

end;

procedure TMainForm.Form1Close(Sender: TObject; var Action: TCloseAction);

begin

Table.Close; //关闭连接

end;

procedure TMainForm.Form1Create(Sender: TObject);

begin

Fonttype.Items := Screen.Fonts; //获得系统字体

end;

procedure TMainForm.Form1Activate(Sender: TObject);

begin

Table.Open; //打开数据连接

end;

procedure TMainForm.btnCloseWordClick(Sender: TObject);

var

SaveChanges,

OriginalFormat,

RouteDocument: OleVariant;

begin

//是否保存Word

SaveChanges := WdDoNotSaveChanges;

OriginalFormat := UnAssigned;

RouteDocument := UnAssigned;

try

//保存完关闭Word连接

WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument);

第六篇 系统、文件及其他国

– 297 –

WordApplication.Disconnect;

BtnCloseWord.Enabled := False;

BtnPrint.Enabled := False;

BtnPreview.Enabled := False;

except

on E: Exception do

begin

Showmessage(E.Message); //询问用户是否真的关闭Word

WordApplication.Disconnect; //关闭Word连接

end;

end;

end;

procedure TMainForm.BtnPrintClick(Sender: TObject);

begin

WordDocument.PrintOut; //打印。

end;

procedure TMainForm.BtnPreviewClick(Sender: TObject);

begin

WordDocument.PrintPreview; //打印预览

end;

procedure TMainForm.WordApplicationDocumentChange(Sender: TObject);

begin

lbDocs.items.add(WordDocument.Name); //在 ListBox里显示文档名

end;

实例 97 与 PowerPoint演示文稿关联控件

实例效果 与实例 96类似,本例使用 Delphi自带的 PowerPointPresentation、PowerPointApplication、

PowerPointSlide控件,实现了与 PowerPoint演示文稿关联,直接把 Delphi程序中的图片和文档插入到 PowerPoint 中,并控制播放。本程序启动后,首先点击“Start Powerpoint”启动PowerPoint ,如图 97-1所示,再点击“Add Presentation”呈现演示文档,如图 97-2所示,最后点击“Add Slide”,这样就把图片和文档添加到 PowerPoint里,制作为幻灯片的一帧,如图 97-3 所示。当然可以向 PowerPoint 里插入很多图片,如图 97-4 所示。也可以点击“Run Slideshow”运行幻灯片,还可以关闭 PowerPoint(点击 Close Powerpoint),实现对 PowerPoint的完全控制。

国 Delphi 7控件实用程序设计 100例

– 298 –

图 97-1 运行界面图(1) 图 97-2 运行界面图(2)

图 97-3 运行界面图(3) 图 97-4 运行界面图(4)

控件说明 1.本例主要讲解 Delphi 自带的 PowerPoint 演示文稿关联 PowerPointPresentation、

PowerPointApplication和 PowerPointSlide控件,其主要属性如表 97-1、97-2、97-3所示。

表 97-1 PowerPointPresentation控件主要属性 属性 作用 本例设置 备注

AutoConnect 是否自动连接 false ConnectKind 连接种类 ckRunningOrNew 它有 4种连接方式:

CkAttachToInterface CkNewInstance CkRemote CkRunningInstance ckRunningOrNew

RemoteMachineName 远程计算机名 SlideShowSettings 设置幻灯片 在代码里设置

2.WordDocument控件主要方法。 ConnectTo:连接到。 Slides:幻灯片。

第六篇 系统、文件及其他国

– 299 –

表 97-2 PowerPointApplication控件主要属性 属性 作用 本例设置 备注

Presentations 呈现数据 在代码里设置 Visible 是否可见 在代码里设置 AutoQuit 是否自动退出 False

3.WordApplication控件主要方法。 Quit:退出。 ConnectTo:连接到。 Connect:连接。 Disconnect:断开。 4.该控件主要事件。 OnNewPresentations:当呈现新数据时,此事件发生。 OnSlideShowEnd:当幻灯结束时,此事件发生。 注意:PowerPointApplication控件除了以上属性,还有 AutoConnect 、ConnectKind 、RemoteMachineName等 PowerPoint通用属性,使用方法同上。

表 97-3 PowerPointSlide控件主要属性 属性 作用 本例设置 备注

RunSlideShow 运行幻灯片 在代码里设置 Layout 设置幻灯的位置 在代码里设置 FollowMasterBackground 设置幻灯的主背景 在代码里设置 Background 设置幻灯背景 在代码里设置 Shapes 设置文本形状 在代码里设置 SlideShowTransition 设置幻灯变化时间 在代码里设置 Name 设置幻灯名称 在代码里设置

5.PowerPointSlide控件主要方法。 ConnectTo:连接到。 注意:PowerPointSlide 控件除了以上属性,还有 AutoConnect 、ConnectKind 、RemoteMachineName等 PowerPoint通用属性,在此将不在介绍,使用方法同上。 6.控件性质:PowerPointPresentation、PowerPointApplication、PowerPointSlide 控件为 Delphi

自带控件(在 Servers组件页)。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在窗体上放置一个 ToolBar控件,在它们之上加入设置 5个 ToolButton控件,其中Caption

属性分别设为“Start Powerpoint”、“Add Presentation”、“Add Slide”、“Run Slideshow”、“Close Powerpoint”。向窗体放入一个 TreeView控件、一个 Label控件,其中 Label控件 Caption属性设为“Presentations and Slides:”;在窗体上放置一个 Table控件、一个 DataSource控件、一个 DBNavigator控件、一个 DBGrid控件、一个 DBImage控件,Table控件的 DatabaseName

国 Delphi 7控件实用程序设计 100例

– 300 –

属性连接“DBDEMOS”数据库。 3.在窗体上放置 PowerPointPresentation、PowerPointApplication 和 PowerPointSlide 控件

各一个,其中它们的属性就为系统默认设置。 详细设置请参阅光盘,最后完成界面如图 97-5所示。

图 97-5 设计期界面

二、源代码及注释 主要代码如下: procedure TForm1.Form1Activate(Sender: TObject);

begin

Table1.Open; //打开数据库

TN := nil;

end;

procedure TForm1.Form1Close(Sender: TObject; var Action: TCloseAction);

begin

Table1.Close;//关闭数据库

end;

procedure TForm1.RunSlideShowClick(Sender: TObject);

var

i: Integer;

Found: Boolean;

begin

Found := False;

if (PowerPointApplication1.Presentations.Count > 0) and (TN <> nil) then

begin

for i := 1 to PowerPointApplication1.Presentations.Count do

begin

第六篇 系统、文件及其他国

– 301 –

TN := TV1.Selected;

{自动获得文件名,免得再去查找}

if TN.GetPrev <> nil then

TN := TN.Parent;

if PowerPointApplication1.Presentations.Item(i).Name = TN.Text then

begin

Found := True;

Break;

end;

end;

if Found then

begin

PowerPointPresentation1.ConnectTo(PowerPointApplication1.Presentations.Item(i));

with PowerPointPresentation1 do

begin

SlideShowSettings.AdvanceMode := ppSlideShowUseSlideTimings;

SlideShowSettings.LoopUntilStopped := msoTrue;

SWindow := SlideShowSettings.Run;

Form1.SetFocus;

end;

end

else

ShowMessage('Presentation ' + TN.Text + ' not found');

end

else

Showmessage('No Presentations available');

end;

procedure TForm1.AddPresentationClick(Sender: TObject);

begin

try

AddSlide.Enabled := True;

//启动应用程序

PowerPointPresentation1.ConnectTo(PowerPointApplication1.Presentations.Add(1));

TN := TV1.Items.Insert(TN, PowerPointPresentation1.Name);

TN.Selected := True;

TV1.SetFocus;

except

on E: Exception do

begin

国 Delphi 7控件实用程序设计 100例

– 302 –

Showmessage(E.Message);

end;

end;

end;

procedure TForm1.ClosePPointClick(Sender: TObject);

begin

PowerPointApplication1.Quit; //退出

PowerPointApplication1.Disconnect; //断开连接

end;

{创建 PowerPoint演示文稿}

procedure TForm1.StartPPointClick(Sender: TObject);

begin

try

try

PowerPointApplication1.Connect; //连接 PowerPoint

except on E: Exception do

begin

E.Message := 'PowerPoint does not appear to be installed';

raise;

end;

end;

PowerPointApplication1.Visible := 1;

AddPresentation.Enabled := True;

ClosePPoint.Enabled := True;

Form1.SetFocus;

except

on E: Exception do

begin

Showmessage(E.Message);

PowerPointApplication1.Disconnect; //断开连接

end;

end;

end;

procedure TForm1.AddSlideClick(Sender: TObject);

begin PowerPointSlide1.ConnectTo(PowerPointPresentation1.Slides.Add(PowerPointPresentation1.Slides.

Count + 1, 1));

with PowerPointSlide1 do

begin

RunSlideShow.Enabled := True;

第六篇 系统、文件及其他国

– 303 –

// {设置图片的位置}

Layout := 20;

//{设置背景}

FollowMasterBackground := 0;

Background.Fill.PresetGradient(2, 2, 10);

//{设置文本}

Shapes.Item(1).TextFrame.TextRange.InsertAfter(Table1.Fieldbyname('Common_Name').AsString);

Shapes.Item(3).textframe.textrange.Font.Name := 'Arial';

Shapes.Item ( 3 ) .textframe.textrange.InsertAfter ( 'Category:' + Table1.FieldByName

('Category').AsString + #13 +

'Species Name:' + Table1.FieldByName('Species Name').AsString);

//{插入图片}

DbImage1.CopyToClipboard; //复制到剪贴板

Shapes.Item(2).Delete;

Shapes.Paste; //粘贴

Shapes.Item(2).Left :=200;

Shapes.Item(2).Top := 180;

Shapes.Item(2).Width := 300;

Shapes.Item(2).Height := 300;

{设置幻灯片间的切换时间}

SlideShowTransition.AdvanceOnTime := 1;

SlideShowTransition.AdvanceTime := 2;

Name := Table1.FieldByName ( 'Common_Name' ) .AsString + ( IntToStr

(PowerPointPresentation1.Slides.Count));

TV1.Items.AddChild(TN, Name);

TN.Selected;

TV1.SetFocus;

end;

end;

实例 98 TextBrowser——文本浏览控件

实例效果 很多读者对Web浏览器非常熟悉,而对文本浏览器可能比较陌生。本实例使用 Delphi自

带的 TextBrowser 控件,编写了一个文本浏览器。其功能和使用方法都与 Web 浏览器一样,点击超链接文本,就连接到相应的文档里,显示出该文本文件详细内容。同时还可设置超链接

国 Delphi 7控件实用程序设计 100例

– 304 –

文本和文档的颜色,以及文档显示格式,运行效果如图 98-1、图 98-2所示。

图 98-1 运行界面图(1)

图 98-2 运行界面图(2)

控件说明 1.本例主要讲解 Delphi自带的 TextBrowser控件,其主要属性如表 98-1、98-2所示。

表 98-1 TextBrowser控件主要属性 属性 作用 本例设置 备注

FileName 设置文档文件 在代码里设置 UnderlineLink 超连接文本是否设置下划线 在代码里设置 True or False LinkColor 设置超连接文本颜色 在代码里设置 Factory 设置文档存放的地方 在代码里设置 DocumentTitle 设置文档标题 在代码里设置 TextColor 设置文档颜色 在代码里设置 TextFormat 设置文档格式 在代码里设置 TfAutoText //自动设置文本格式

TfPlainText //源代码格式 TfText //文本格式

第六篇 系统、文件及其他国

– 305 –

2.该控件主要方法。 Home:返回文档第一页。 CanGoBackward:点击控件上的文档时,返回上一页。 CanGoForward:点击控件上的文档时,返回下一页。 Backward:返回上一页。 Forward:返回下一页。 LoadFromFile:载入文件。 3.该控件主要事件。 OnTextChanged:文档改变时,此事件发生。 OnHighlightText:需要有提示文本时,此事件发生。 4.控件性质:该控件为 Delphi自带控件(在 Common Controls l组件页)。 注意:新建工程时,该控件是隐藏的,控件栏上看不到该控件,如需看到该控件,可

以在控件栏上单击鼠标右键,选中“Properties”项或者点击菜单“Component”选中“Configure Palette”,会出现“Palette Properties”属性页。点击“Common Controls”页,将会看到该控件。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程。 2.在控件栏上找到“TextBrowser”控件,如图 98-3所示,向窗体上添加一个 TextBrowser

控件,其 TextFormat属性设为“tfText”,UnderlineLink属性设为“False”,其他属性为系统默认设置。

图 98-3 “TextBrowser”控件

3.在窗体上放置 4 个 Button 控件,其 Caption 属性分别设置为“Home”、“Back”、“Forward”和“Reload”;放置一个 TextBox 控件、一个 CheckBox 控件、一个 SpeedButton控件、两个 GroupBox控件,在它们之上分别放两个 RadioButton控件、一个 RadioGroup控件、一个 StatusBar控件、一个 Label控件,其 Label控件的 Caption属性设为“Link Source Path”,其余详细设置请参阅光盘,最后完成界面如图 98-4所示。

国 Delphi 7控件实用程序设计 100例

– 306 –

图 98-4 设计期界面

二、源代码及注释 首先在 privat部分定义如下:

private

{ Private declarations }

PathList: TStrings;

var

TextBrowserForm: TTextBrowserForm;

implementation

{$R *.xfm}

const

DefaultDocName = 'index.html';

FormCaption = 'TTextBrowser Demo Application - ';

procedure TTextBrowserForm.FormCreate(Sender: TObject);

begin

PathList := TStringList.Create;

LinkSourceEdit.Text := ExtractFilePath(Application.ExeName);

TextBrowser.FileName := LinkSourceEdit.Text + DefaultDocName;//设置文件

UnderlineCheckbox.Checked := not TextBrowser.UnderlineLink;//设置下划线

end;

procedure TTextBrowserForm.HomeBtnClick(Sender: TObject);

begin

TextBrowser.Home;

end;

//文档改变时,此事件发生

procedure TTextBrowserForm.TextBrowserTextChanged(Sender: TObject);

第六篇 系统、文件及其他国

– 307 –

begin

BackBtn.Enabled := TextBrowser.CanGoBackward;//返回上一页

ForwardBtn.Enabled := TextBrowser.CanGoForward;//返回下一页

Caption := FormCaption + TextBrowser.DocumentTitle;//设置文档标题

end;

procedure TTextBrowserForm.BackBtnClick(Sender: TObject);

begin

TextBrowser.Backward;//返回上一页

end;

procedure TTextBrowserForm.ForwardBtnClick(Sender: TObject);

begin

TextBrowser.Forward;//返回下一页

end;

procedure TTextBrowserForm.RadioButton1Click(Sender: TObject);

begin

TextBrowser.LinkColor := clBlue;//设置颜色

end;

procedure TTextBrowserForm.RadioButton2Click(Sender: TObject);

begin

TextBrowser.LinkColor := clRed;

end;

procedure TTextBrowserForm.LinkSourceEditChange(Sender: TObject);

begin

PathList.Add(LinkSourceEdit.Text);

TextBrowser.Factory.FilePath := PathList;//设置文件

end;

procedure TTextBrowserForm.FormDestroy(Sender: TObject);

begin

PathList.Free;

end;

procedure TTextBrowserForm.ReloadBtnClick(Sender: TObject);

begin

TextBrowser.LoadFromFile(TextBrowser.FileName);//载入文件

end;

procedure TTextBrowserForm.RadioButton3Click(Sender: TObject);

begin

TextBrowser.TextColor := clBlack;//设置文本颜色

end;

procedure TTextBrowserForm.RadioButton4Click(Sender: TObject);

国 Delphi 7控件实用程序设计 100例

– 308 –

begin

TextBrowser.TextColor := clGreen;

end;

procedure TTextBrowserForm.RadioGroup1Click(Sender: TObject);

begin

case RadioGroup1.ItemIndex of//设置文本格式

0: TextBrowser.TextFormat := tfText;

1: TextBrowser.TextFormat := tfPlainText;

end;

end;

procedure TTextBrowserForm.UnderlineCheckboxClick(Sender: TObject);

begin

TextBrowser.UnderlineLink := not TextBrowser.UnderlineLink;//设置下划线

end;

//提示文本

procedure TTextBrowserForm.TextBrowserHighlightText(Sender: TObject;

const HighlightedText: WideString);

begin

StatusBar.SimpleText := 'Link To: ' + HighlightedText;

end;

procedure TTextBrowserForm.SpeedButton1Click(Sender: TObject);

var

NewDir: string;

begin

if SelectDirectory('Select a Directory', '', NewDir) then

LinkSourceEdit.Text := NewDir;

end;

实例 99 Tamdesktop——桌面背景动画效果

实例效果 本例使用 Tamdesktop控件,在Windows95/98/NT的桌面上随意产生背景动画效果,如图

99-1所示。

第六篇 系统、文件及其他国

– 309 –

图 99-1 运行界面图

控件说明 本例主要介绍了 Tamdesktop控件,在Win98或Winnt界面上显示图形时,首先在该控件

的 OnPaint事件添写代码,并调用控件的 Paint方法,其次,设置 Enabled属性为 true,并设置interval属性值,以达到自动调用 Paint方法的目的。

1.TAmdesktop控件的主要属性如表 99-1所示。

表 99-1 控件属性 属性 作用 本例设置 备注

Enabled 激活控件 true

Interval 自动调用的间隙 25

Priority 优先级 tpLowest 最低优先级

2.TAmdesktop控件的主要事件如表 99-2所示。

表 99-2 控件事件 属性 作用 本例设置 备注

OnChanged 改变以后 不做设置

OnChanging 改变 不做设置

OnPaint 绘制图形 添写代码,重新绘制图形

OnTimer 时间间隙所执行的工作 不做设置

3.控件性质:本控件为免费、提供全部源代码的第三方控件。 4.下载地址:http://helpwork.net/ocx/html/user/index.asp。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加控件

Tamdesktop(AM Software自定义组件页),设置它的 Enabled属性为 true, Interval属性值为 20(毫秒),Priority优先级为 tpLowest。

国 Delphi 7控件实用程序设计 100例

– 310 –

2.在 Form1上添加一个 Image控件(Additional组件页),并按照效果图安排它的位置和大小。

3.在 Form1上添加一个 CheckBox控件(Standard组件页),设置它的 Enabled属性为 true;如图 99-2所示。

图 99-2 设计期界面

二、源代码及注释 unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, AMDesktop, StdCtrls;

type

TForm1 = class(TForm)

AMDesktop1: TAMDesktop;

Image1: TImage;

CheckBox1: TCheckBox;

procedure AMDesktop1Paint(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

I, J: integer;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

第六篇 系统、文件及其他国

– 311 –

procedure TForm1.AMDesktop1Paint(Sender: TObject);

begin

with AMDesktop1.Bitmap.Canvas do

begin

//双重循环,绘制动态图像,调用 TAmdesktop的 draw事件是关键

if I < Screen.Height then Inc(I, 6) else I := - Image1.Height;

if J < Screen.Width then Inc(J, 8) else J := -Image1.Width;

Draw(150, I, Image1.Picture.Graphic);

Draw(J, 150, Image1.Picture.Graphic);

Draw(I, J, Image1.Picture.Graphic);

end;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

AMDesktop1.Enabled := CheckBox1.Checked;

//通过 CheckBox1的选中与否来控制 AMDesktop控件。

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

I := - Image1.Height;//设定 I和 J的初值。

J := - Image1.Width;

end;

此处代码略,详见本书光盘。

实例 100 DBLookUpTreeView——在下拉列表框中显示数

据库树形视图

实例效果 本例使用 DevExpress公司的 DBLookUpTreeView控件,实现了在下拉列表框中显示数据

库树形视图,它有两点值得称道:树形视图直接与数据库关联、树形视图在下拉列表框中显示。

下拉列表框大小可以运行期改变,并且专门针对数据库做了优化,对于访问量很大的数据库来

讲,优势明显,运行界面如图 100-1、图 100-2所示。

国 Delphi 7控件实用程序设计 100例

– 312 –

图 100-1 运行界面图(1)

图 100-2 运行界面图(2)

控件说明 树形视图 TreeView在表现数据的层次关系时效果十分直观,而数据库中有大量的数据关

系需要表现,而 Delphi自带的树形视图 TreeView控件没有专门针对数据库的属性设置。若实现在树形视图 TreeView控件中显示数据库中的数据关系,需要编写比较复杂的代码,使用遍历方法编程实现,而且需要做相应优化代码设置,以保证数据库中大量数据处理所需的速度。

1.DBLookUpTreeView控件的主要属性如表 100-1所示。

表 100-1 控件属性 属性 作用 本例设置 备注

DataSourse 设置数据源控件 DS1

KeyField 关键字段 Pr_id

ListField 列表字段 Pr_name 最低优先级

第六篇 系统、文件及其他国

– 313 –

续表

属性 作用 本例设置 备注 ListSourse 列表源 DS1

ParentField 父字段 Pr_parent

TreeViewImages 节点图形 ImageList1

2.该控件的主要事件。 OnAddNewItem:增加新项时触发。 OnGetImageIndex:获得节点图形索引时触发。 3.该控件的主要方法。 Selected:选择项。 Show:显示。 Refresh:刷新。 4.控件性质:本控件为第三方共享控件。 5.下载地址:http://www.playicq.com/。 注意:属性 KeyField 、ParentField 对应的数据库字段的类型必须相同,否则无法显示效果,在设计数据库时应注意设置。

制作步骤

一、窗体界面的建立 1.启动 Delphi 7,单击菜单 File/New Application项,新建一个工程,在窗体上添加一个

Table控件、一个 DataSourse控件、一个 ImageList控件、一个 DBLookUpTreeView控件。 2.设置 Table控件的 DataBaseName属性为 DBDEMOS,Table属性值为 project.db,Name

属性值为 T1;设置 DataSourse控件的 Dataset属性为 T1,在 ImageList控件上增加几个图形,最后按表 100-1所示设置 DBLookUpTreeView控件的属性。 完成界面如图 100-3所示。

图 100-3 设计期界面

二、源代码及注释 procedure TForm2.FormCreate(Sender: TObject);

国 Delphi 7控件实用程序设计 100例

– 314 –

begin

T1.DataBaseName := ExtractFilePath(Application.ExeName);

T1.Open; //打开数据库

end;

附录 Delphi第三方控件的设计及安装方法

一、设计方法 Delphi第三方控件的功能强大,可能平时读者都是直接使用。如果能自己设计第三方控件,

把一些常用功能封装为控件,不但方便了以后的使用,而且可以分发,确实是一件很有意义的

事情。本例制作了一个自制控件 SaveFormSize。使用时,可以实现窗体的“固定”生成,即程序会自动记忆上次程序退出时的窗体大小和位置,并在本次打开窗体时作为新属性值,代码

重用性很好。该控件在组件面板 Sample页,效果如附图-1所示。

附图-1 效果图

二、方法说明 本例侧重于介绍控件的详细制作过程。该控件还允许开发者选择只记忆程序位置、只记忆

程序大小或都记忆等不同功能。 该自制控件从 TComponent派生,定义了 Load和 Save两个主要方法供调用,分别将窗体

参数写入注册表指定位置和从该位置读出。 制作步骤如下。

三、窗体界面的建立 1.单击 Component /New Component…菜单项,如附图-2所示,新建控件项目,输入修改

关于新控件的信息,祖先类(Ancestor type)选择 TComponent,保存类名(Class Name)为TSaveFormSize,Palette Page选择的是该控件将安装在哪个组件面板中(笔者选择了 Sample,也可以输入新的面板名来自己创建新的组件面板),Unit file name代表该控件将保存在什么地址,Search path为 IDE的控件搜索路径(默认即可),如附图-3所示,点“OK”完成将看到如附图-4所示画面。随后保存即可。

国 Delphi 7控件实用程序设计 100例

– 316 –

附图-2 新建控件项目 附图-3 设置新控件项目信息

附图-4 Delphi自动生成新控件代码框架

2.定义保存模式,将表现为属性选择框,分别对应只保存窗体位置、只保存窗体大小和二者都保存:

type

TSaveMode = (smPositionOnly, smSizeOnly, smAll);

3.TSaveFormSize类中定义属性Modus(TSaveMode)记录保存模式、FCompany记录窗体开发者公司、FProduct记录窗体所属产品、FSubKey记录子键名(多个子键就可以为一个应用程序的多个窗体都来实施自动记忆功能了)。

4.定义 Save和 Load两个 public方法代表保存和从注册表读出数据: Procedure Save;//保存数据

Procedure Load;//写入数据

附录 Delphi第三方控件的设计及安装方法国

– 317 –

四、源代码与注释 1.主文件代码。 unit SaveFormSize;

interface

uses

//添加 Registry的引用

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Registry;

type

TSaveMode = (smPositionOnly, smSizeOnly, smAll);//三种保存模式

TSaveFormSize = class(TComponent)

private

{ Private declarations }

Modus: TSaveMode;//保存模式

FCompany: String;// 窗体开发者公司

FProduct: String;// 窗体所属产品

FSubKey: String;//子键名

protected

{ Protected declarations }

public

{ Public declarations }

Procedure Save;//保存方法

Procedure Load;//加载方法

published

{ Published declarations }

property Company: String Read FCompany Write FCompany;

property ProductName: String Read FProduct Write FProduct;

property SubKey: String Read FSubKey Write FSubKey;

property SaveMode:TSaveMode Read Modus Write Modus;

End;

Procedure Register;//公用控件注册方法,负责把控件注册到 Delphi IDE中

implementation

var

Reg: TRegistry;

Procedure Register;

Begin

RegisterComponents('Samples', [TSaveFormSize]);

国 Delphi 7控件实用程序设计 100例

– 318 –

End;

Procedure TSaveFormSize.Load;

var Key: String;

Begin

Reg:=TRegistry.Create;

Reg.RootKey:=HKEY_LOCAL_MACHINE;//指定 Root键

Key:='\SOFTWARE\';

if Trim(FCompany) <> '' then Key:=Key + FCompany;

if Trim(FProduct) <> '' then Key:=Key + '\' + FProduct;

if Trim(FSubKey) <> '' then Key:=Key + '\' + FSubKey;

if Reg.OpenKey(Key, True) then Begin//打开指定键

if (Modus = smAll) or (Modus = smPositionOnly) then Begin

if Reg.ValueExists(TForm(Owner).Name + '.Left') then//窗体 Left值

TForm(Owner).Left:=Reg.ReadInteger(TForm(Owner).Name + '.Left');

if Reg.ValueExists(TForm(Owner).Name + '.Top') then//窗体 Top值

TForm(Owner).Top:=Reg.ReadInteger(TForm(Owner).Name + '.Top');

End;

if (Modus = smAll) or (Modus = smSizeOnly) then Begin

if Reg.ValueExists(TForm(Owner).Name + '.Width') then//窗体Width值

TForm(Owner).Width:=Reg.ReadInteger(TForm(Owner).Name + '.Width');

if Reg.ValueExists(TForm(Owner).Name + '.Height') then//窗体 Height值

TForm(Owner).Height:=Reg.ReadInteger(TForm(Owner).Name + '.Height');

End;

//如果存在键值增为窗体附值WindowState

if Reg.ValueExists(TForm(Owner).Name + '.State') then

TForm(Owner).WindowState:=TWindowState(Reg.ReadInteger(TForm(Owner).Name + '.State'));

End;

Reg.Free;

End;

Procedure TSaveFormSize.Save;

var Key: String;

Begin

Reg:=TRegistry.Create;

Reg.RootKey:=HKEY_LOCAL_MACHINE;

Key:='\SOFTWARE\';

if Trim(FCompany) <> '' then Key:=Key + FCompany;

if Trim(FProduct) <> '' then Key:=Key + '\' + FProduct;

附录 Delphi第三方控件的设计及安装方法国

– 319 –

if Trim(FSubKey) <> '' then Key:=Key + '\' + FSubKey;

if Reg.OpenKey(Key, True) then Begin

if TForm(Owner).WindowState = wsNormal then Begin

if (Modus = smAll) or (Modus = smPositionOnly) then Begin

Reg.WriteInteger(TForm(Owner).Name + '.Left', TForm(Owner).Left);

Reg.WriteInteger(TForm(Owner).Name + '.Top', TForm(Owner).Top);

End;

if (Modus = smAll) or (Modus = smSizeOnly) then Begin

Reg.WriteInteger(TForm(Owner).Name + '.Width', TForm(Owner).Width);

Reg.WriteInteger(TForm(Owner).Name + '.Height', TForm(Owner).Height);

End;

End;

Reg.WriteString(TForm(Owner).Name + '.Caption', TForm(Owner).Caption);

Reg.WriteInteger(TForm(Owner).Name + '.State', Ord(TForm(Owner).WindowState))

End;

Reg.Free;

End;

End.

2.相关代码解释。 Register是 Delphi自动生成的注册过程,负责将控件注册到 Delphi IDE。 Procedure Register;

Begin

//将 TSaveFormSize注册到 Samples页

RegisterComponents('Samples', [TSaveFormSize]);

End;

RegisterComponents的使用

Procedure RegisterComponents(const Page: string; ComponentClasses: array of TComponentClass);

五、安装方法 第三方控件一般以三种方式分发:一种为给出.pas或.dcu控件文件,一种为给出 dpk控件

压缩包,另一种是直接给出 setup.exe文件。对应安装方法方法也有 3种。 1.给出 pas 或 .dcu 控件文件的第三方控件的安装方法。仍然以前面制作的控件

SaveFormSize为例。由于该控件是操作了系统注册表,需要手工添加 Registry的引用。 单击 Component /Install Component…菜单项,如附图-5所示,弹出如附图-6所示的对话

框,修改安装信息,Unit file name代表控件主文件位置,Packet file name指定该控件安装到哪个包文件(默认即可),点击“OK”按钮。

国 Delphi 7控件实用程序设计 100例

– 320 –

附图-5 安装控件菜单 附图-6 修改控件安装信息

确定安装对话框,单击“YES”按钮,如附图-7所示。

附图-7 确定安装对话框

如果安装成功,弹出如附图-8所示的成功安装对话框。

附图-8 安装成功对话框

2.给出 dpk控件压缩包的第三方控件的安装方法。这种控件的安装方法更为简单,下面以本书实例 92使用到的 DsnRegister控件的安装为例,讲解一下其安装方法。 首先直接双击 dpk文件,单击 Component /Install Component…菜单项,如附图-9所示。出

现如附图-10所示。

附图-9 安装控件菜单 附图-10 dpk控件文件安装

附录 Delphi第三方控件的设计及安装方法国

– 321 –

如果是Delphi 7以前版本的 dpk文件,需要单击Compile按钮,重新编译,然后再单击 Install按钮安装。如果是 Delphi 7版本的 dpk文件,直接单击 Install按钮安装即可,将出现如附图-11所示安装成功对话框。

附图-11 安装成功对话框

3.另外还有一类控件 ActiveX控件,它是Windows系统应用程序通用控件,Visual Basic、Visual Foxpro等都使用此类控件,Delphi中也可以使用。

这里以播放 Flash动画(*.swf)的 Shockwave Flash ActiveX控件为例,说明其安装方法。 (1)如果没有注册,可以在系统中找到 SWFlash.ocx文件,如附表-1所示。

附表-1 SWFlash.ocx文件

系统 文件位置 WIN9X/ME X:\ Windows\system\ Macromed \Flash\ SWFlash.ocx WINNT/2000/XP X:\WINNT\system32\Macromed\Flash\ SWFlash.ocx

然后可以使用以下代码段进行注册: Procedure TForm1.Button1Click(SEnder: TObject);

Var

astr:String;

bstr:String;

ProcAddr:Pointer;

DllAddr:Integer;

Begin

FileName:=' SWFLASH.OCX';//指定该文件位置

astr:=FileName+chr(0);

DllAddr:=LoadLibrary(PChar(astr));

if DllAddr<>0 then

Begin

bstr:='DllUnregisterServer'+chr(0);

//若改为 DllRegisterServer即不注册该 ActiveX控件

ProcAddr:=GetProcAddress(DllAddr,PChar(bstr));

if ProcAddr<>nil then

CallWindowProc(ProcAddr,DllAddr,0,0,0)

Else

ShowMessage(FileName+'文件错误,控件注册无效!');

国 Delphi 7控件实用程序设计 100例

– 322 –

FreeLibrary(DllAddr);

End

Else

ShowMessage(FileName+'无法装载');

End

(2)安装步骤如下。 ① 单击 File /Component/Import ActiveX Control…菜单项,如附图-12所示,准备导入播放

Flash的 ActiveX控件。 ② 在 Import ActiveX页中找到 Shockwave Flash(Version 1.0)选项,选择该项,如附图-13

所示。

附图-12 安装 ActiveX控件菜单 附图-13 安装 ActiveX控件

在文本框中显示了该 OCX文件在系统中的位置: E:\WINNT\system32\Macromed\Flash\ SWFlash.ocx Class Names是该控件中包含的类列表; Palette Page是该控件将显示在 DELPHI IDE中哪个组件面板; Unit dir name是控件安装后控件单元文件的安装位置; Search Path是控件安装后控件单元文件的搜索位置。 单击 Install按钮完成安装。 ③ 这时可以在控件的 ActiveX面板找到 Flash控件,如附图-14所示。

附图-14 Flash ActiveX控件