Microsoft Word - CB6CXfm.DOC

Size: px
Start display at page:

Download "Microsoft Word - CB6CXfm.DOC"

Transcription

1 C++ Builder 6 程序设计教程 陆卫忠刘文亮等编著 北京

2 内容简介 本书系统地介绍了在 Windows 环境下利用 C++ Builder 进行应用程序开发的方法, 主要内容包括 C++ Builder 常用组件的使用 MDI 多文档应用程序设计 文件操作与文件管理 数据库应用程序设计 多线程应用程序设计 Internet 应用程序设计 动态链接库 DLL 以及多媒体与图形应用程序设计 全书内容翔实 实例丰富, 汇集了作者多年来的实际开发经验和教学心得 各章附有适量习题, 便于学生课后练习 本书可作为高等院校计算机程序设计及其相关课程教材, 也可作为各类计算机培训班的教学用书, 还可供从事计算机应用开发的广大工程技术人员及爱好者使用 图书在版编目 (CIP) 数据 C++ Builder 6 程序设计教程 / 陆卫忠, 刘文亮等编著. 北京 : 科学出版社,2005 ( 面向 21 世纪高等院校计算机系列规划教材 ) ISBN I. C II. 1 陆 2 刘 III. C 语言 - 程序设计 - 高等学校 - 教材 Ⅳ.TP312 中国版本图书馆 CIP 数据核字 (2005) 第 号责任编辑 : 吕建忠韩洁 / 责任校对 : 都岚责任印制 : 吕春珉 / 封面设计 : 三函设计 北京东黄城根北街 16 号 邮政编码 : 出版 中国科学院印刷厂印刷科学出版社发行各地新华书店经销 * 2005 年 3 月第一版开本 : / 年 3 月第一次印刷印张 :21 印数 : 字数 : 定价 :28.00 元 ( 如有印装质量问题, 我社负责调换 < >) 销售部电话 : , 编辑部电话 :

3 前 言 可视化 (visual) 程序设计是一种全新的程序设计方法, 全面采用面向对象的程序设计技术, 使用事件驱动机制进行程序设计 利用可视化开发工具可以快速 高效地开发应用程序 可视化的开发工具有很多, 如 Microsoft 公司推出的 Visual Studio 软件系列, Inprise(Borland) 公司的 Delphi C++ Builder 系列等 Inprise(Borland) 公司的 C++ Builder 是这些工具中的佼佼者, 是基于 C++ 语言的快速应用程序开发 (rapid application development,rad) 工具 C++Builder 充分利用已经发展成熟的 Delphi 的可视化组件库 (visual component library,vcl), 吸收 Borland C++ 优秀编译器的诸多优点, 结合先进的基于组件的程序设计技术, 已成为一个非常成熟的可视化应用程序开发工具, 可以快速 高效地开发出基于 Windows 环境的各类程序, 尤其在数据库应用和网络应用方面,C++ Builder 更是一个十分理想的软件开发平台 本书从实际应用出发, 根据 C++ Builder 的主要应用领域, 着重介绍了常用组件的使用 文件操作 数据库应用技术 Internet 网络应用程序设计技术 内容由浅入深, 注重典型性和实用性相结合, 同时强调如何使用 C++Builder 来构建 (architecture) 应用程序, 而不仅仅是编程 (program), 也就是先进的开发思想的学习 本书具有以下特点 : (1) 基本性 通过实例引入工程 工程管理的概念以及面向对象 事件驱动程序设计等概念, 避免了枯燥概念的描述 (2) 实践性 程序设计是一门实践性极强的课程, 因此需要读者通过大量的上机练习来理解和掌握程序设计方法 本书通俗易懂, 并提供了大量的编程实例 (3) 典型性 本书选择的实例都与实际应用相联系, 所选实例具有一定的代表性 趣味性 一方面有利于学生掌握有关的知识点, 另一方面能调动学生的学习积极性, 提高学习兴趣 本教材中, 选择学生成绩管理系统作为管理信息系统 (MIS) 的实例, 并充分运用 SQL 语言的功能强大 易于学习理解的特点, 重点体现强大的数据库应用开发能力 (4) 可扩展性 由于 C++ Builder 功能十分强大, 应用领域广泛, 在一本教材中进行全面阐述是不可能也是不现实的 因此在介绍学习内容的同时, 强调扩充知识的方法, 以引导读者进一步学习新知识 新技术 全书共 11 章可分为四个部分 : 第 1 至 3 章为第一部分, 是 Windows 应用程序设计基础 其中第 1 2 章是 C++ Builder 的编程基础, 介绍了创建 C++ Builder 应用程序的方法 ; 第 3 章介绍了如何使用通用的可视组件库 (VCL) 对象 第 4 5 章及第 9 10 章为第二部分, 是 Windows 应用程序设计进阶 其中第 4 章介绍了如何运用并设计菜单和工具栏 单文档与多文档界面 ; 第 5 章介绍了如何实现对文件的操作和管理 如何实现 Windows 通用对话框 ; 第 9 章介绍了多媒体及图形设计的方法 ; 第 10 章介绍了 C++ 程序设计基础知识, 以便读者根据实际需要设计并处理所要

4 ii C++ Builder 6 程序设计教程 实现的类 第 6 至 8 章为第三部分, 是数据库应用系统设计 其中第 6 章介绍 C++ Builder 数据库应用程序设计环境, 包括数据库工具的使用 SQL 语言及其运用, 并给出了大量实例 ; 第 7 章以学生成绩管理系统为例介绍了数据库应用程序开发方法 ; 第 8 章介绍了数据库报表设计方法 第 11 章为第四部分, 是多线程及分布式应用设计, 介绍了多线程 Internet 网络应用程序 动态链接库 DLL 注册表操作的程序设计方法 第 7 章和第 11 章是本书的重点 全书由陆卫忠策划并统稿, 刘文亮协编, 奚雪峰 张明亮参加了本书的编写工作 由于编者水平有限, 书中难免存在一些错误和缺点, 欢迎广大读者批评指正 编者 2004 年 12 月

5 目 录 第 1 章 C++ Builder 6 概述 初识 C++ Builder 6 的可视化开发环境 C++ Builder 6 快速入门 C++ Builder 6 的第一个示例 欢迎进入奇妙的 C++ Builder 世界! C++ Builder 的工程概述 面向对象编程的基本概念 面向对象的程序设计 类 对象 属性 方法 事件及事件过程 C++ Builder 6 的 IDE 应用环境进阶 应用程序的类型 创建控制台应用程序 在 IDE 中浏览和编辑代码 使用联机帮助 Help 使用联机帮助 Help 从 Internet 上获得帮助 17 本章小结 17 习题 1 18 第 2 章 C++ Builder 简单应用程序设计 VCL 组件及分类 VCL 组件库 VCL 组件功能分类 VCL 组件的常用属性 组件的属性及其设置方法 组件的常用属性 组件的布局 组件的添加 / 删除 组件的布局调整 基本组件的使用 标签组件 文本编辑组件 掩码编辑组件 备注组件 按钮组件 C++ Builder 中的数据类型 33

6 iv C++ Builder 6 程序设计教程 标准数据类型 字符串 字符串列表 输入与消息对话框函数 综合应用举例 38 本章小结 41 习题 2 42 第 3 章窗体与常用组件 组件应用基础 常用事件 Tab 键顺序和焦点 单选钮和检查框 单选钮与检查框 设置单选钮与检查框的状态 单选钮与检查框的使用 群组框和单选按钮组 列表框和组合框 列表框与组合框的设置 列表框与组合框的使用 TCheckListBox 组件 应用举例 其他常用组件 滚动条 定时器 TTrackBar 组件 TUpDown 组件 窗体 窗体的属性 窗体的运行与控制 C++ Builder 高级组件 TRichEdit 组件 TStringGrid 组件 TDateTimePicker 和 TMonthCalendar 组件及日期类函数 TPageControl 组件 TTreeView 和 TListView 组件 TSplitter 组件 TProgressBar 组件 程序调试方法 程序错误类型 83

7 目录 v 程序跟踪 标准数据检验 边界检查 综合应用举例 85 本章小结 87 习题 3 87 第 4 章菜单与工具栏 定制应用程序界面 设计应用程序主窗体 菜单的规划与设计 快捷菜单 状态栏 工具栏 应用 TActionList 组件 界面设计中的基本类 TApplication 类 TScreen 组件类 多文档应用程序 单文档和多文档 多文档用户界面设计 MDI 父窗体的属性和方法 创建应用程序主菜单与子菜单融合 多文档用户界面设计实例 108 本章小结 110 习题 第 5 章文件管理 文件管理组件 驱动器组件 TDriveComboBox 目录列表框组件 TDirectoryListBox 文件列表框组件 TFileListBox 文件过滤器组件 TFilterComboBox 文件及其处理 文件 I/O 函数 文件名操作函数 文件管理函数 通过组件直接访问文件 LoadFromFile 方法 SaveToFile 方法 具有 LoadFromFile 和 SaveToFile 方法的常用类 125

8 vi C++ Builder 6 程序设计教程 5.4 通用对话框 TOpenDialog 与 TSaveDialog 对话框组件 TOpenPictureDialog 与 TSavePictureDialog 对话框组件 TFontDialog 与 TColorDialog 对话框组件 TFindDialog 与 TReplaceDialog 对话框组件 TPrintDialog 与 TPrinterSetupDialog 对话框组件 130 本章小结 131 习题 第 6 章 C++ Builder 数据库开发环境 数据库基础 数据库的概念 关系型数据库基础 C++ Builder 数据库访问技术 C++ Builder 数据库管理辅助工具 数据库引擎管理器 数据库桌面 SQL 浏览器 结构化查询语言 SQL 概述 SQL 数据查询语句 SQL 数据操作语句 综合举例 150 本章小结 152 习题 第 7 章数据库应用程序设计 数据库应用程序的结构与设计方法 数据库应用程序的结构 数据库应用程序的设计步骤 数据控制组件 公共属性 TDBText 组件 TDBEdit 组件 TDBGrid 组件 TDBNavigator 组件 TDBMemo 组件 TDBImage 组件 TDBListBox 和 TDBComboBox 组件 TDBCheckBox 和 TDBRadioGroup 组件 TDBLookUpListBox 和 TDBLookUpComboBox 组件 167

9 目录 vii 7.3 数据访问组件 数据源组件 TDataSource 数据集组件 TTable 字段组件 TField TDatabase 组件 TSession 组件 数据集组件 TQuery 综合举例 200 本章小结 206 习题 第 8 章数据库报表设计 创建报表 报表组件 TQuickRep 组件 TQRBand 组件 TQRGroup 组件 显示内容的组件 报表设计示例 数据模块 创建及编辑数据模块 数据模块的使用 管理信息系统设计初步 管理信息系统设计方法 开发实例 学生成绩管理系统 227 本章小结 228 习题 第 9 章多媒体与图形处理 多媒体播放器设计 多媒体概述 多媒体组件 TMediaPlayer 动画组件 TAnimate 图形处理 画布 画布组件 TCanvas 简单动画设计 244 本章小结 247 习题 第 10 章 C++ 基础 C++ 类与对象 249

10 viii C++ Builder 6 程序设计教程 类与对象 类与对象的定义 对象与指针 函数的重载 构造函数和析构函数 构造函数 析构函数 继承 基类与派生类 派生类的构造函数 虚函数 264 本章小结 266 习题 第 11 章 C++ Builder 的高级应用 多线程应用程序 进程与线程 利用 Win32 API 编写多线程应用程序 线程间的同步与通信 TThread 类 TCP/IP 应用程序设计 传输控制协议 TCP 与套接字 Windows Sockets 基于 Winsock 的点对点聊天程序设计 利用 C++ Builder 组件编写 Internet 应用程序 动态链接库 动态链接 创建 DLL 使用 DLL 在 DLL 中使用 VCL 注册表操作 创建和释放 TRegistry 对象 指定要操作的键 从注册表中读取信息 向注册表中写入信息 键值维护 321 本章小结 322 习题 主要参考文献 326

11 第 3 章窗体与常用组件 窗体是在程序设计时, 用来规划用户输入输出界面的地方, 譬如在 Windows 操作环境下常看到可以自由缩放且有最大化 最小化和关闭钮的窗体界面以及不能改变窗体大小只有关闭钮的对话框等都是由窗体制作出来的 由于窗体是一个 VCL 组件的容器 (container), 因此可以将组件模板中的组件放置到窗体中, 作为构成用户界面的基本元素, 而窗体本身也是一个组件 本章将主要介绍构成用户界面的常用组件和窗体的使用方法 3.1 组件应用基础 C++ Builder 的组件尽管种类繁多, 使用设置也不尽相同, 但仍然还是有许多相同或相似的地方 在第 2 章已经介绍了组件的常用属性 除了常用属性以外, 组件还有一些常用的事件及其他的一些共性问题, 理解并掌握组件中的这些共性问题对程序的设计将起到事半功倍的效果 常用事件事件驱动编程 EDP(event-driven programming) 是指通过对事件做出反应来进行编程 从本质上讲, 事件驱动指的是程序并未限制用户下一个动作可以做或不能做什么 例如 : 在 Windows 编程时, 程序员不可能知道用户会对应用程序做什么动作 所以说, EDP 指的是对任何你感兴趣的事件都需要编制代码进行处理, 而不是写出那些限制好了总是会执行的代码 所有可能发生的事件能够分成两大类 : 1) 用户事件 用户事件是由用户的行动触发的 例如 :OnClick 事件 ( 用户单击鼠标 ) OnKeyPress 事件 ( 用户按下键盘上的一个键 ) OnDblClick 事件 ( 用户双击鼠标 ) 等都是用户事件的例子 可以看到, 这些事件总是依赖于用户的行动 2) 系统事件 系统事件是由操作系统触发的 例如 : OnTimer 事件 ( 由定时器组件每经一段预定义时间间隔后触发 ) OnCreate 事件 ( 某个组件被创建后触发 ) OnPaint 事件 ( 一个组件或窗体需要重画时触发 ) 等 通常, 系统事件并不会直接由用户触发 C++ Builder 中的组件能接收各种各样的事件, 有一些事件是绝大部分组件都具有的, 在程序设计中使用也非常普遍 1. OnClick 事件 OnClick 事件是组件中使用最为普遍也是最为重要的一个事件 C++ Builder 中的窗体与绝大部分组件都能响应该事件 当下列情况发生时会引发该事件, 同时执行 OnClick 事件中的代码 : 1) 当按钮或检查框具有焦点时, 按下 Space 键

12 第 3 章窗体与常用组件 45 2) 在活动窗体中存在 Default 属性为 true 的按钮且按回车键时 3) 在活动窗体中存在 Cancel 属性为 true 的按钮且按 ESC 键时 4) 当在列表框或组合框中通过按下箭头键选择一个项目时 5) 当按下一个按钮或选择框的访问键时 6) 当单选按钮的 Checked 属性被设为 true 时 7) 当一个检查框的 Checked 属性的值被改变时 8) 一个菜单项的 Click 方法被调用时 OnClick 事件经常使用在下列场合 : 1) 用来选取对象 2) 使对象获得焦点, 以利用键盘输入数据 3) 执行命令 要注意的是, 当 OnClick 事件发生时, 还会伴随着其他事件的发生 它们是 : OnMouseDown( 鼠标按下 ) 事件和 OnMouseUp( 鼠标松开 ) 事件 其发生的顺序一般为 :OnMouseDown OnMouseUp OnClick 一般情况下对 OnMouseUp 和 OnMouseDown 这两个事件并不编写代码, 因此也就不会响应了 2. OnDblClick 事件 OnDblClick 事件也称为双击事件, 它是通过鼠标的双击产生的 在 Windows 应用软件中的对话框中, 有许多场合可以使用鼠标双击来完成预定的功能 如在文件打开对话框中双击某个文件夹表示打开该文件夹, 在列表框中双击某个项目表示选中该项目等 这些功能正是通过编写某一组件的 OnDblClick 事件代码而得以实现的 C++ Builder 中支持双击事件的组件相当多 ( 但命令按钮不支持 ), 它主要应用于列表框 组合框 文件列表框等 事实上从应用软件的使用上可以看出, 双击操作只是一个辅助操作, 它实际上相当于选择某个项目后 ( 如选中 打开 文件对话框中的某个文件 ) 再单击某个按钮 ( 如 打开 按钮 ) 因此在编写某个组件的 OnDblClick 事件代码时, 一般只要显式调用某个命令按钮的 OnClick 事件过程即可 注意 : 如果一个组件既有 OnClick 事件代码, 又有 OnDblClick 事件代码, 则 OnDlbClick 事件将永远不会被触发, 因为 OnClick 事件是两个事件中首先被触发的事件 其结果是鼠标单击被 OnClick 事件截断, 从而使 OnDblClick 事件不会发生 3. OnKeyPress 事件 OnKeyPress 事件是在用户按下键盘上任何一个可打印的字符时发生, 只有能接收键盘输入的组件才有 OnKeyPress 事件 OnKeyPress 事件过程用得最多的是编辑框和组合框, 它可以截取在编辑框和组合框组件中所输入的击键, 而且可立即测试击键的有效性或在字符输入时对其进行一定的格式处理 例如, 在 TEdit 组件上捕获 OnKeyPress 事件, 判断输入的是否是字母 a, 如果是, 将其转换为 A, 相应的事件处理代码如下 :

13 46 C++ Builder 6 程序设计教程 void fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) // 参数 Key 是用户的击键的 ASCII 码, 若将它改为 0 则清除刚输入的字符 if(key=='a') Key='A'; 注意 :OnKeyPress 事件并不能识别功能键 (F1~F12) 上 下 左 右键 Shift 键 Ctrl 键以及 Alt 键等特殊控制键或是组合键, 要捕获这些按键可以采用 OnKeyDown 和 OnKeyUp 事件 4. OnKeyDown/OnKeyUp 事件 当按下某个键不放时, 产生 OnKeyDown 事件 ; 释放按键时, 则产生 OnKeyUp 事件 例如,TEdit 组件的 OnKeyDown 事件过程框架如下 : void fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) 其中参数 Key 返回键盘的虚拟码 可以使用虚拟码表示键盘上的非字母数字键的值, 如表 3-1 所示 表 3-1 一些按键的虚拟码 按键虚拟码按键虚拟码 F1~F12 Key_F1~Key_F12 Home Key_Home Left 键 Key_Left End Key_End Right 键 Key_Right 0~9 Key_0~Key_9 Up 键 Key_Up A~Z Key_A~Key_Z Down 键 Key_Down ESC Key_Escape Shift 参数提供事件发生时 Shift Ctrl 和 Alt 键的状态, 如表 3-2 所示 表 3-2 Shift 值对应的组合键 按下的组合键 Shift 值 语 法 Shift 键 ssshift if(shift.contains(ssshift)) Ctrl 键 ssctrl if(shift.contains(ssctrl)) Alt 键 ssalt if(shift.contains(ssalt)) 注意 : 要让某个对象产生 OnKeyDown 事件 OnKeyUp 事件或 OnKeyPress 事件, 先要让该对象获得控制权 ( 即变成作用对象 ) 若在该对象上按某个键再放开按键, 便会触发上面三个事件 如果三个事件中均有操作, 则其执行先后次序为 :OnKeyDown 事件先执行,OnKeyPress 事件其次,OnKeyUp 事件最后执行 5. OnMouseDown OnMouseUp OnMouseMove 事件 OnMouseDown OnMouseUp OnMouseMove 是当按下 (OnMouseDown) 释放

14 第 3 章窗体与常用组件 47 (OnMouseUp) 鼠标按键或在移动鼠标 (OnMouseMove) 时发生 发生在 TEdit 组件上 的 OnMouseDown OnMouseUp 和 OnMouseMove 事件过程框架如下 : void fastcall TForm1::Edit1MouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y) void fastcall TForm1::Edit1MouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y) void fastcall TForm1::Edit1MouseMove(TObject *Sender, TShiftState Shift,int X, int Y) 其中 Button 返回一个枚举型, 用来标识该事件的产生是按下 (OnMouseDown) 鼠标或者释放 (OnMouseUp) 鼠标的哪个按键引起的 值为 mbleft mbright mbmiddle 时分别表示左键 右键 中间键 X Y 返回一个指定鼠标指针当前位置的坐标 6. OnDragDrop/OnDragOver 事件 拖放 (DragDrop) 是 Windows 提供的一种快捷的操作方式 在某对象上按住鼠标不放, 将该对象移动的动作称为 拖动 (drag) 当对象拖动到目的对象上方, 放开鼠标左键将对象放下的动作称为 放置 (drop), 拖动对象正越过另一个对象上方的过程称为 越过 (DragOver) 拖放的源组件有两个属性:DragMode 属性用来设置拖动模式, 当 DragMode 置为 dmautomatic, 则用户在组件上按下鼠标时拖动自动开始, 如果置为 dmmanual( 默认 ), 则将通过处理鼠标事件来判断一个拖动是否可以开始 ;DragCursor 属性用于设置拖动光标, 默认值是 crdrag, 一般不要去修改它 OnDragOver 事件在拖放操作正在进行时发生 可使用此事件对鼠标指针在一个有效目标上的进入 离开或停顿等拖动状态进行监控 用户程序可以利用提供的参数 ( 坐标 源组件 ) 来确定放下的拖动是否可被接受, 当设置参数 Accept 为 true 时, 目标组件可以响应 OnDragDrop 事件 在一个完整的拖放动作 ( 即将一个组件拖动到一个对象上, 并释放鼠标按键 ) 完成时,OnDragDrop 事件发生 例如,TEdit 组件的 OnDragDrop/OnDragOver 事件过程为 : void fastcall TForm1::Edit1DragDrop(TObject *Sender, TObject *Source,int X, int Y) void fastcall TForm1::Edit1DragOver(TObject *Sender, TObject *Source,int X, int Y, TDragState State, bool &Accept) 其中参数 Source 表示正在被拖动的组件, 可用此参数在事件过程中引用该组件的属性和方法 X,Y 是目前鼠标指针的坐标 Accept 决定 OnDragOver 事件是否接受源组件的拖放结果 State 值表示被拖动组件 ( 源组件 ) 在相关目标窗体或组件 ( 目标组件 ) 中的拖动状态 :dsdragenter= 进入,dsDragMove= 越过,dsDragLeave= 离开 Tab 键顺序和焦点 在 Windows 应用软件的使用中, 要使组件获得焦点可以通过鼠标与键盘两种方法 利用键盘获得焦点也可以通过两种途径来实现 : 为组件设置访问键和利用 Tab 键 所谓 Tab 键顺序是指在按 Tab 键时, 焦点在组件之间的转移顺序

15 48 C++ Builder 6 程序设计教程 C++ Builder 中除菜单 TMainMenu 定时器 TTimer 等以外的组件都有一个属性值称 为 TabOrder 的 Tab 键顺序号, 它决定了组件在 Tab 键中的顺序 默认情况下,Tab 键顺 序号就是在窗体上添加组件的次序, 画到窗体上的第一个组件, 其 TabOrder 值为 0, 第 二个为 1, 以此类推 注意 : 对于无效的或不可见的以及不能接受焦点的组件尽管都具有自己的 TabOrder 属性值, 但 Tab 键将跳过这些组件 显然只要改变组件的 TabOrder 值即可以改变其在 Tab 键中的顺序 当一个组件的 TabOrder 值改变或某个组件删除后, 系统会自动对其他组件的 TabOrder 属性重新编号 组件的 TabOrder 值既可以在设计时修改, 也可以在运行时通过代码来修改, 例如 : btnok->taborder = 0; 即将确定按钮的 Tab 键顺序改为第一个 3.2 单选钮和检查框 用户对应用程序的使用通常是通过菜单 快捷菜单及对话框实现的 在使用过程中, 有许多情况是需要用户作出选择的 ( 如性别 特长 课程 班级等 ), 这些选择有时候范 围很小 ( 只需回答 Yes 或 No), 有时候范围很大 C++ Builder 提供了制作这类选择的组 件 : 适用于小范围选择的单选钮与检查框 适用于大范围选择的列表框与组合框 Windows 2000 游戏 的 纸牌 中, 可以发现在 选项 的对话框中利用上面两种组件所设计出来的用来进行游戏的设置, 如图 3-1 所示 本节先讨论前者, 后者将在下节讨论 单选钮与检查框 相信读者在许多 Windows 应用软件中使用过单选钮与检查框这两种屏幕元素 组件面板中 Standard 页的单选钮 TRadioButton 或检查框 TCheckBox 组件的区别有两点 : 第一, 两者的表现形态不同, 单选钮为圆形而检查框为方形 ; 第二, 一组单选钮中用户只能选择其中之一, 而检查框可以单选也可以多选 ( 检查框也称为复选框 ) 设置单选钮与检查框的状态 状态设置主要是指对单选钮与检查框的各种属性进行设置 对单选钮与检查框而言, 它们也具有诸如 Name Caption Width Height Top Left Color Enabled Visible TabOrder 等属性, 对这些属性的设置方法与含义在前几章已经作了阐述, 在此不再述及 在本书以后的叙述中, 为节省篇幅, 对常规属性的设置如无特殊情况就不再说明 Checked 属性决定了单选钮或检查框是否被选中, 用来表示其状态 1) 单选钮只有两种状态 : 选中或未选中, 如选中 Checked 值为 true; 如未选中则为 false( 默认为 false) 2) 检查框如 Checked 值为 true, 则表明已被选中, 其另一属性 State 值为 cbchecked; 如 Checked 值为 false, 表明未被选中, 此时有两种情况 : 未选取 (Unchecked), 其 State 值为 cbunchecked; 失效 (Grayed), 其 State 值为 cbgrayed

16 第 3 章窗体与常用组件 49 Checked 属性既可以在设计时设置, 也可以在运行时确定 在程序执行过程中用户对单选钮或检查框的操作实际上就是改变了其 Checked 的值, 所以在设计时对 Checked 值的设置仅仅是对其进行初始设置 单选钮与检查框的使用在程序中使用单选钮与检查框主要要解决两个问题 : 第一是当用户对单选钮或检查框作出响应后能准确判定出响应的位置及其取值 ; 第二是在程序中如何主动地设置单选钮或检查框的各种状态 在单选钮或检查框中最常用的事件是 OnClick 事件, 显然利用该事件可以很容易地得到组件的取值 如果是组件数组的话还可以得到引发 OnClick 事件的组件位置 这样第一个问题就得到了解决, 对第二个问题比较简单, 只要在适当的事件代码中对组件的可读写属性进行必要的设置就行了 例 3-1 设计一个简单的留言簿, 要求能改变输入文字的字体及字型 设计步骤如下 : 1) 在 C++ Builder 中新建一个窗体 2) 在窗体上放置一个标签 三个命令按钮 三个单选钮 三个检查框和一个编辑框 各组件的属性设置如表 3-3 所示 表 3-3 留言簿主要属性的设置组件名称属性名称取值 单选钮 radfont1/2/3 Checked true 检查框 chbfontu/i/b Checked true 编辑框 Memo1 ScrollBars ssvertical 设置后窗体布局如图 3-1 所示 图 3-1 留言簿窗体布局 3) 三个检查框的 OnClick 事件共享同一代码 ( 加粗 chbfontb 的 OnClick 事件 ) 4) 相关的事件过程代码如下 ( 按钮的事件代码不包括在内 ):

17 50 C++ Builder 6 程序设计教程 void fastcall TForm1::radFont1Click(TObject *Sender) // 另外两个按钮作类似处理 Memo1->Font->Name=" 宋体 " ; // 设置字体名称 void fastcall TForm1::ButtonDelClick(TObject *Sender) Memo1->Text=""; // 清空编辑框 void fastcall TForm1:: chbfontb(tobject *Sender) // 更改字体风格 // 字体风格的单击事件 int Count=0; if(chbfontb->checked==true) if(chbfonti->checked==true) if(chbfontu->checked==true) Count=Count+1; Count=Count+2; Count=Count+4; switch(count) case 0: Memo1->Font->Style=TFontStyles();break; // 无风格 case 1: Memo1->Font->Style=TFontStyles()<<fsBold;break; //Bold 风格 case 2: Memo1->Font->Style=TFontStyles()<<fsItalic;break; //Italic 风格 case 3: Memo1->Font->Style=TFontStyles()<<fsBold<<fsItalic;break; case 4: Memo1->Font->Style=TFontStyles()<<fsUnderline;break; case 5: Memo1->Font->Style=TFontStyles()<<fsBold<<fsUnderline; break; case 6: Memo1->Font->Style=TFontStyles()<<fsItalic<<fsUnderline; break; case 7: Memo1->Font->Style=TFontStyles()<<fsBold<<fsItalic <<fsunderline;break; ; 在编写以上代码时, 要注意 Windows 的字体名称不能写错, 标准的字体名称可以从属性中的 Font 对话框中获得 5) 事件代码编写完成后进行必要的调试, 运行结果如图 3-2 所示

18 第 3 章窗体与常用组件 51 图 3-2 留言薄运行结果 群组框和单选按钮组群组框 TGroupBox 是一个带有标题的容器组件, 它为一组相关联的组件提供一个分组 放在群组框中的组件就是它的子组件 典型的应用就是在 TGroupBox 中添加一组相关的单选钮 当需要从多个选项中选择一个时, 可以使用 TRadioGroup 组件 属性 Items 用来设置按钮的标题 ( 及数量 ),Colums 属性设置按钮的排列方式 ( 每行按钮数量 ),ItemIndex 用来指示当前选中的按钮的索引 ( 从 0 开始, 默认为 -1, 即没有选中任何一个按钮 ), 在它的 OnClick 事件中可以检查该属性的值以便作出判断 改写例 3-1, 将设置字体的三个单选按钮用一个 TRadioGroup 组件代替, 设置 Items 属性为 宋体 黑体 楷体 编写它的 OnClick 事件代码如下 : void fastcall TForm1::RadioGroup1Click(TObject *Sender) switch( RadioGroup1->ItemIndex) case 0 : Memo1->Font->Name=" 宋体 "; break; case 1 : Memo1->Font->Name=" 黑体 "; break; case 2 : Memo1->Font->Name=" 楷体 _GB2312"; break; 3.3 列表框和组合框 单选钮与检查框是供用户进行小范围选择的组件, 如果选择的范围比较大, 如学生选修的课程名称选择 国家名称的选择等就需要使用列表框或组合框组件了 列表框和

19 52 C++ Builder 6 程序设计教程 组合框在有限空间内提供了大量的选项, 如果项目的数量超过了列表框或组合框所能容 纳的数目, 会自动出现滚动条 图 3-3 与图 3-4 分别表示了两种组件的应用示例 组合框与列表框不同, 它根据其 Style 属性的设置有常见的三种不同风格 : 下拉组合框 简单组合框 下拉列表框 图 3-3 列表框 图 3-4 常见的三种组合框表现形式 1. 下拉组合框下拉组合框 (Style 属性为 csdropdown) 是默认的形式 程序运行时其下的列表框并不显示, 只有在用户单击了其下拉箭头后才能显示 这种形式在选择时既可以用键盘直接在编辑框内输入, 也可以在打开列表框后进行选择 ( 如 Word 中 格式 上的 字体 与 字号 下拉列表框就是典型的代表 ) 2. 简单组合框简单组合框 (Style 属性为 cssimple) 在任何时候都显示其项目列表, 因此没有下拉箭头 可以直接输入也可以在其下的列表框中选择, 这种格式一般使用不多 3. 下拉列表框下拉列表框 (Style 属性为 csdropdownlist) 形式上与下拉组合框相同, 但与下拉组合框不同的是它只能打开项目列表后选择列表中的项目, 而不能直接在编辑框中输入 这种格式一般用于项目是固定的, 用户不能随意更改只能选择的场合 ( 如 Word 的 页面设置 对话框中的 纸型 选择组合框 ) 另外还有 : 当 Style 属性为 csownerdrawfixed 或 csownerdrawvariable 时, 形式上与不带编辑框的下拉列表框相同 但它们为产生 OnDrawItem 事件提供了条件, 换句话说, 如果要产生 OnDrawItem 事件, 必须要将 Style 属性设置为上述两个值之一 一个 OnDrawItem 事件能够将图形元素添加进列表项目中, 或者用图形列表项目代替文本的列表项目 属性为 csownerdrawfixed 时, 表示列表项目的高度受 ItemHeight 属性所固定 ; 属性为 csownerdrawvariable 时, 列表项目高度不固定 从表现形式看两种组件的区别并不大, 组合框实际上可以看成是编辑框与列表框的组合 从使用上看列表框可以选择一个项目也可以选择多个项目, 而组合框通常只能选择或输入一个项目 所以组合框更适合于空间不足而需要显示大量项目的时候 列表框与组合框的设置除了常规属性外, 列表框还有一些特殊属性, 如表 3-4 所示

20 第 3 章窗体与常用组件 53 表 3-4 列表框常用属性及意义 属性名称 Items ItemIndex Count Sorted MultiSelect Style 设置及意义存放列表部分每一项内容的字符型数组, 下标 0~ItemCount-1 返回程序运行时用户所选择的项目顺序号, 其范围也在 0~ItemCount-1 返回列表部分项目的个数指定列表部分项目是否按字母表的顺序排列,true 排序,false 不排仅列表框有, 指明运行时用户能否进行复选 :false 禁止 ( 默认 ),true 允许指明显示风格 表 3-4 是 TListBox 中的一些常用的属性, 除 MultiSelect 属性外皆适用于 TComboBox 在 TComboxBox 中有 Text 属性而 TListBox 没有, 此 Text 返回程序运行时用户所选择项 目的文本内容 Items 属性是 TStrings 属性对象, 可以使用该对象的方法来维护列表项 列表框与组合框的使用 1. 项目的增加 无论是列表框还是组合框, 增加项目都有两种方法 : 一种是在设计时通过属性框中 的 Items 属性输入有关项目 ; 另一种是使用 AddItem 方法或 Items 属性的 Add 方法 前 者主要是用于赋初值, 后者使用了程序代码来实现对项目的动态增加 (1) 使用 Items 属性赋初值 选中需要赋初值的列表框或组合框, 打开对象查看器 (object inspector), 在 Items 属性的右侧双击或单击省略按钮, 即可打开 String List Editor 对话框进行项目添加 一条项目编辑完成后, 按下回车键, 开始另一个项目的编辑, 如图 3-5 所示 图 3-5 使用 Items 属性静态添加项目 (2) 使用 AddItem 方法动态增加项目为叙述方便, 假设有一个列表框名称为 lbkc, 其初值为 VFP 高等数学 基础会计 计算机网络 大学物理 面向对象程序设计, 如图 3-6 所示 AddItem 方法的原型是 : void fastcall AddItem(AnsiString Item, 图 3-6 列表框初始状态

21 54 C++ Builder 6 程序设计教程 TObject AObject); 其中 Item 是要加入到列表中的项目文本内容, 且必须是字符串数据, 默认添加到最后 ; AObject 指明与新增项目相关的对象 例如 : 在图 3-6 的 lbkc 框中增加一门 美学概论 的课程, 放在最后, 增加一个 按钮的事件处理过程 AddClick, 可用以下代码 : void fastcall TForm1::AddClick(TObject *Sender) lbkc->additem(" 美学概论 ",Sender); 也可使用 Items 属性的 Add 或 Insert 方法 : lbkc->items->add(" 美学概论 "); lbkc->items->insert(" 美学概论 ",1); // 插入到第二个位置 ( 索引从 0 开始 ) 2. 项目的删除 ( 移除 ) 运行中删除 ( 移除 ) 列表项目可以通过方法来实现 C++ Builder 提供了三种 方法 来处理, 它们的原型分别是 : virtual void fastcall DeleteSelected(void); // 删除选定项目 virtual void fastcall MoveSelection(TCustomListControl* Destination); // 移除选定项目到目标 Destination 中 void fastcall Clear(void); // 删除所有项目例如 : 执行 lbkc->clear(); 命令将把图 3-6 的 lbkc 列表框中的所有项目全部删除 相应地, 也可以使用 Items 属性的 Delete Move 和 Clear 方法 3. 项目的访问 列表框与组合框都具有 OnClick 事件和 OnDblClick 事件, 选择列表中的项目时将触发 OnClick 事件, 而双击列表项目时将触发 OnDblClick 事件 为这两个事件编写一定的过程代码就可以通过引用表 3-4 中的某些属性访问列表中的项目 项目的访问一般有以下几种情况 : (1) 访问列表中的所有项目可以用 Items 属性来访问列表中的所有项目 因为 Items 属性本身就是一个字符串型的数组, 列表中的每一个项目都是其元素 例如, 可用下列形式来得到指定项目的内容 : lbkc-> Items->Strings[ItemIndex]; 其中,ItemIndex 是待引用项目的顺序号 这种引用是一种绝对引用, 与用户的选择无关 ItemIndex 为 0 表示列表中的第一个项目 使用这种方法访问时要注意下标不要越界, 即 ItemIndex 的值不能超过 Count-1 例如: lbkc-> Items->Strings[3]; // 指列表框中的 基础会计 课程 (2) 访问用户选定的项目程序中更多的是要访问在程序运行时由用户所选定的项目, 要实现这一点必须要判断选定项目所在的位置 用 ItemIndex 属性即可判断选定位置并返回内容 例如, 下面的命令可以返回 lbkc 列表框中选定项目的内容 :

22 第 3 章窗体与常用组件 55 lbkc-> Items->Strings [lbkc->itemindex]; 对列表框而言, 如果没有选择则其 ItemIndex 的值为 -1 而对组合框中的简单组合 框与下拉组合框来说, 如果没有选择而是直接在其上的编辑框中输入新的项目, 其 ItemIndex 的值为 -1 (3) 返回项目总数与项目内容返回项目总数可通过 Count 属性 而返回项目的内容用以下方法均可, 如对 lbkc 列表框而言 : Edit1->Text=lbKC-> Items->Strings [Index]; // 由 Index 指定的项 Edit1->Text=lbKC-> Items->Strings [lbkc->itemindex];// 当前选中的项对于组合框 (TComboBox) 除了以上方法外, 还可以获取 Text 属性 : Edit1->Text=ComboBox1->Text; 这种方法利用了 TComboBox 中的 Text 属性,Text 属性总是对应当前选定项目的内容 (4) 复选项目的访问当列表框设置复选属性 MultiSelect 为 true 时, 可以通过 Selected 属性判断一个项目是否被选中 以下代码将删除被选中的项目 for(int i=listbox1->count-1;i>=0;i--) if(listbox1->selected[i]) ListBox1->Items->Delete(i); TCheckListBox 组件 TCheckListBox 组件是 TListBox 的一个扩展, 它的每一个项前都有一个复选框 用户可以选择列表的单个选项, 还可以单击复选框转换它们的状态, 很适合于多项选择 该组件在 Additional 组件页上 TCheckListBox 组件主要使用 Checked 和 State 数组属性 示例代码如下 : for(int i=0;i<checklistbox1->count;i++) if(checklistbox1->checked[i]) ListBox1->Items->Add(CheckListBox1->Items->Strings[i]); 应用举例 例 3-2 设计一个课程选择的窗体, 运行后如图 3-7 所示, 具体要求如下 : 图 3-7 课程选择 窗体运行界面

23 56 C++ Builder 6 程序设计教程 1) 用两个列表框分别显示 备选课程 与 拟选课程 2) 在 备选课程 中选择一门或多门课程后, 单击 添加 按钮可将其放在 拟 选课程 中 3) 单击 全部添加 按钮可将所有课程一次性地添加到右边的列表框中 4) 按钮的使用要带有智能判断, 如 : 当 拟选课程 中没有课程时, 移除 与 全 部移除 按钮禁止 ; 而当全部课程均添加后, 添加 与 全部添加 也应被禁止 5) 移除 与 全部移除 按钮的使用与 添加 按钮类似 6) 为两个列表框设置双击事件, 即双击左边的项目等同于单击 添加 按钮, 双 击右边的项目等同于单击 移除 按钮 本窗体设计时的主要问题及解决办法如下 : 1) 按钮使用的智能性可通过在相应的事件代码中设置按钮的 Enabled 属性来实现 2) 两个列表框都要能实现复选操作, 可以通过其 MultiSelect 属性设置 但对选中 项目的访问不能放置在本身的 OnClick 事件中, 而应放在相关按钮中 3) 双击事件的实现只要调用相应按钮的事件即可 这可以通过列表事件设置或在 有关的事件代码中声明调用 窗体上相关组件及其属性的设置如表 3-5 所示 列表框 (lbkc) 表 3-5 课程选择 窗体的主要组件属性设置 组件名属性名取值备注 MultiSelect Sorted List true true 如图 3-5 中所示 备选课程列表框 列表框 (lbnxkc) MultiSelect true 拟选课程列表框 命令按钮 (btnadd) Enabled true 初始允许 命令按钮 (btnaddall) Enabled true 初始允许 命令按钮 (btnmove) Enabled false 初始禁止 命令按钮 (btnmoveall) Enabled false 初始禁止 有关的事件过程代码如下 : // 全部添加 按钮事件过程 void fastcall TForm1::btnAddAllClick(TObject *Sender) lbkc->selectall(); lbkc->moveselection(lbnxkc); // 设置按钮的状态 btnadd ->Enabled=false; btnaddall ->Enabled=false; btnmove ->Enabled=true; btnmoveall ->Enabled=true;

24 第 3 章窗体与常用组件 57 // 全部移除 按钮事件过程 void fastcall TForm1::btnMoveAllClick(TObject *Sender) lbnxkc->selectall(); lbnxkc->moveselection(lbkc); btnmove->enabled=false; btnmoveall->enabled=false; btnadd->enabled=true; btnaddall->enabled=true; // 添加 按钮事件过程 void fastcall TForm1::btnAddClick(TObject *Sender) lbkc->moveselection(lbnxkc); lbkc->clearselection(); if(lbnxkc->count!=0) btnmove->enabled=true; btnmoveall->enabled=true; ; if(lbkc->count==0) btnadd->enabled=false; btnaddall->enabled=false; // 移除 按钮事件过程 void fastcall TForm1::btnMoveClick(TObject *Sender) lbnxkc->moveselection(lbkc); lbnxkc->clearselection(); if(lbkc->count!=0) btnadd->enabled=true; btnaddall->enabled=true; if(lbnxkc->count==0) btnmove->enabled=false; btnmoveall->enabled=false;

25 58 C++ Builder 6 程序设计教程 4) 列表双击事件的处理可以通过列表事件设置 以 lbkc 为例 (lbnxkc 类似 ), 双击事件功能与添加按钮相同 (lbnxkc 同 移除 按钮 ), 遵循这样的步骤 : 1 选中列表框 2 打开 Object Inspector( 对象查看器 ), 选择 Events 页 3 单击 OnDblClick 右侧下拉菜单, 在其中选择添加按钮事件 btnaddclick 即可 思考 :1. 本例中当选择多个项目时, 双击事件还有效吗? 2. 使用 Items 属性方法来实现上述功能如何改写程序? 3.4 其他常用组件 滚动条滚动条在文本类组件 ( 编辑框 列表框 组合框 ) 中用来滚动文本内容, 也可以作为 模糊 输入与定位组件 当不需要精确设置数值而只要一个大概的范围时 ( 如调整亮度 设置处理某一事件所花的大致时间等 ), 可以使用滚动条 TScrollBar 组件实现这一功能 注意 : 由滚动条组件创建的滚动条与一般附加在文本组件上的滚动条是不一样的, 这是因为附加在文本类组件上的滚动条是自动出现的 1. 滚动条的属性设置滚动条的常用属性如表 3-6 所示 其中 Max 和 Min 的值根据实际的应用确定 ( 如要设置某一种颜色值, 可将 Min 设为 0,Max 设为 255), 一般情况下 Min 应小于 Max 表 3-6 滚动条的属性设置 Kind 属性名称 设置及意义 sbhorizontal: 水平滚动条 ;sbvertical: 垂直滚动条 Min 滚动条的最小值 ( ~ ), 默认值为 0 Max 滚动条的最大值 ( ~ ), 默认值为 100 LargeChange 在滚动条上空白处单击时滚动条数值的增减量, 默认值为 1 SmallChange 单击滚动条两端的滚动箭头时滚动条数值的增减量, 默认值为 1 Position 滚动条的当前值, 默认值为 0 2. 滚动条的应用包含滚动条的程序运行时, 无论是单击滚动箭头或滚动条, 还是用鼠标直接拖动滚动块, 都会引起滚动块位置的变化 因此滚动条的应用关键是要随时监视滚动块的移动与滚动条的当前取值 当滚动条上的微动块 滚动区被按下或是滚动块被拖动再放开鼠标后将会触发

26 第 3 章窗体与常用组件 59 OnChange 事件, 通过 OnChange 事件来跟踪滚动条的状态变化, 在事件中取得滚动条的 Position 属性值可以获取当前的状态 例 3-3 使用滚动条来设置屏幕颜色 在 C++ Builder 中通过 RGB() 函数可以产生不同的颜色, 该函数的原型格式如下 : RGB(red, green, blue); 其中 red, green, blue 分别表示红 绿 蓝三基色的值, 其取值范围均为 0~255 本例要求使用三个滚动条 ( 模拟三基色 ) 和 RGB() 函数产生这些颜色, 并显示在一 个矩形框 ( 使用 Additional 页上的 TShape 组件 ) 上 组件 ) 窗体的布局如图 3-8 所示, 有关主要组件的属性及设置如表 3-7 所示 ( 不含简单的 表 3-7 窗体组件及属性设置 组件名称属性名称取值备注 水平滚动条 ScrollBarR ScrollBarG ScrollBarB Min Max LargeChange SmallChange 三个滚动条都采取同样的设置 标签 lblr 标签 lblg 标签 lblb Color Color Color 红色绿色蓝色 三个颜色标签的初始值均为 0 在滚动条 ScrollBarR 的 OnChange 事件过程中输入以下代码, 其他两个滚动条的 OnChange 事件也编写相似的事件代码, 即可实现本例的要求 void fastcall TForm1::ScrollBarRChange(TObject *Sender) // 将每种颜色的值显示在相应的颜色标签上 LabelR->Caption=IntToStr(ScrollBarR->Position); // 设置矩形框的画刷 TBrush 的颜色 Shape1->Brush->Color=RGB(ScrollBarR->Position, ScrollBarG->Position,ScrollBarB->Position); 图 3-8 例 3-3 的运行结果

27 60 C++ Builder 6 程序设计教程 定时器 定时器 TTimer 组件 (System 组件页 ) 是一种特殊的不可视组件, 它能有规律地以一定的时间间隔激发定时器事件 (OnTimer) 而执行指定的程序代码 定时器的主要 功能是 : 定时完成某项任务, 进行某种后台处理 定时器有两个重要属性 :Interval 属性 和 Enabled 属性 1)Interval 属性 Interval 属性反映了引发两次 OnTimer 事件的时间间隔, 以毫秒为 单位, 其取值在 0~65535 之间 取 0 表示不响应 OnTimer 事件, 默认值为 1000(1 秒 钟 ) 注意 :Interval 的值越小, 则 OnTimer 事件响应越频繁, 这样会降低系统的综合性能 因此除非必要, 设置的时间间隔不能过小 2)Enabled 属性 该属性与一般的组件的 Enabled 属性含义相同, 取 true 表示定时 器开始工作 ( 默认状态 ), 取 false 表示定时器停止工作 Enabled 属性通常在程序中动态 设置 定时器的状态设置完成后, 要在其 OnTimer 事件中加入需要完成的功能代码, 如需 要的话在相关的按钮事件过程中再加上启动或停止定时器代码 按钮 例 3-4 修改例 3-3 的窗体使其能每隔 0.5 秒随机显示一种颜色, 并加上启 / 停 打开例 3-3 的窗体, 在窗体上增加一个定时器组件, 再增加三个命令按钮, 分别为 开始 停止 退出 定时器的属性作如下设置 :Name 属性为 tmrcolor,enabled 属性为 false,interval 属性为 500 在定时器的 OnTimer 事件过程中编写以下代码 : void fastcall TForm1::tmrColorTimer(TObject *Sender) randomize(); // 产生随机因子 ScrollBarR->Position=rand()%256; // 取余数 ScrollBarG->Position=rand()%256; ScrollBarB->Position=rand()%256; Shape1->Brush->Color=RGB(ScrollBarR->Position, ScrollBarG->Position,ScrollBarB->Position); 程序运行后, 单击 开始 按钮, 每隔 0.5 秒在矩形区域内就会显示一种不同的颜色, 单击 停止 按钮, 定时器立即停止计时 TTrackBar 组件 TTrackBar 组件 (Win32 组件页 ) 是一种带有滑尺的组件, 用其滑尺指示当前位置 可以通过修改 TTrackBar 组件中的 Position 属性来改变它的位置 用户也可以使用鼠标或者键盘方向键以及 PgUp 键和 PgDn 键使滑尺移动, 每次移动的步长可以通过 LineSize 和 PageSize 属性进行设置 该组件的主要属性见表 3-8, 主要事件是 OnChange 事件

28 第 3 章窗体与常用组件 61 表 3-8 TTrackBar 组件的主要属性设置 属性名称 设置及意义 Max Min 这两个属性用来设置滑尺滚动的范围 Frequency 设置刻度单位 默认为 1 LineSize PageSize Orientation Position SelStart/SelEnd SliderVisible 设置当用户按下键盘上方向键移动滑尺时, 滑尺每次滑动的步长设置当用户按下 PgUp 键 PgDn 键或用鼠标单击跟踪条时, 滑尺每次滑动的步长设置跟踪条是水平放置还是垂直放置, 默认值为 tbhorizontal: 水平放置设置滑尺的位置这两个属性用来设置填充的起点和终点设置滑尺隐藏或显示 该属性值为 false 时, 滑尺将隐藏 ThumbLength 设置滑尺本身的宽度, 默认是 20 思考 : 怎样用 TTrackBar 组件改写例 TUpDown 组件 TUpDown 组件 ( 来自 Win32 页 ) 与其他组件 ( 如编辑框 ) 联合使用, 可以实现加减组件的效果 加减组件有一对上下箭头按钮, 按动按钮可以使编辑框中的数值连续增加或减少 编辑框中显示的数据就是 TUpDown 组件的 Position 属性, 组件的主要属性如表 3-9 所示 该组件的主要事件有 : 表 3-9 TUpDown 组件的主要属性设置 属性名称 Associate AlignButton ArrowKeys Position 设置及意义 用来指定一个联合使用的组件, 如编辑框等 运行期间,TUpDown 组件将自动调整位置紧靠该联合组件并与之保持一致 设置 TUpDown 组件显示在联合组件的位置,udLeft 为左侧,udRight 为右侧 用户按键盘上的上下方向键是否等价于鼠标单击上下键, 值为 true 表示是 组件的当前值, 变化范围由 Min 和 Max 属性设置 Increment 设置当用户单击上下箭头时 Position 属性变化的步长, 默认为 1 Min Max Thousands Wrap 设置 Position 属性的变化范围 值为 true 时, 当 Position 超过 1000 时, 将自动添加一个千分位符号 值为 true 时, 当 Position 大于 / 小于 Max/Min 时就自动回到 Max/Min 属性指定的值 1)OnChanging 事件 当用户正在单击上或下箭头时, 将触发这个事件 如果把事件参数 AllowChange 设为 true, 表示允许修改 Position 属性的值 2)OnChangingEx 事件 该事件与 OnChanging 类似, 但它传递了更多的信息 其中, 事件参数 NewValue 是 Position 属性的新值 ;Direction 参数表明 Position 属性将要增大还是减小 3)OnClick 事件 当用户单击上或下箭头时, 将触发这个事件 如果事件参数 Button 的值是 btnext, 表示按下的是上或右箭头 ; 如果 Button 参数值是 btprev, 表示按下的是

29 62 下或左箭头 图 3-9 联合编辑框的加减组件 C++ Builder 6 程序设计教程 例 3-5 在窗体上添加一个 TUpDown 组件和 TEdit 组件, 将 TUpDown 组件的 Associate 属性设为 TEdit 组件, 指定 TEdit 为 TUpDown 的联合组件 程序运行时, 单击 TUpDown 组件, 编辑框中的数字将发生变化, 如图 3-9 所示 3.5 窗体 窗体是设计 C++ Builder 应用程序的一个基本平台, 绝大部分 C++ Builder 组件都要放置在窗体之上, 用户正是通过操作窗体上的各种组件来使用应用程序的 前面关于组件使用的操作都是在窗体上进行的 C++ Builder 中的窗体也是一种对象, 也有自己的属性 事件与方法 通过对窗体属性的设置可以控制窗体运行时的状态, 通过编写特定的窗体事件过程代码可以对某些组件的属性或公用变量进行初始化或执行某种功能, 而通过调用窗体的方法可以实现窗体的显示 隐藏 切换等 窗体的属性当启动 C++ Builder 6.0 后或执行菜单的 File New Application 命令后, 在屏幕的右边会出现一个窗体, 其默认的标题名称为 Form1 注意 : 如果在屏幕上找不到 Form, 可以使用下列方式来寻找 : 1) 执行 View Forms 命令或 Shift+F12 键或单击工具栏, 将弹出 View Form 对话框, 选取所需的 Form 2) 通过 View Project Manager 命令进入 Project Manager 工程管理器窗体, 选择所需要的 Form 3) 用 F12 在代码编辑器和窗体设计器间切换 同组件一样, 窗体的状态包括窗体的外观 位置 行为等, 这些状态通过窗体的属性都可以进行设置 窗体的属性有很多, 每个属性都有其默认值, 除非对该属性有了解, 否则不要去更改其属性, 以免引起不必要的错误 表 3-10 所列是窗体的常用属性 表 3-10 窗体组件的常用属性 属性意义 BorderStyle( 边界 ) Caption( 标题 ) Color( 背景色 ) Ctrl3D( 外观 ) Font( 字体 ) 设置窗体边界格式, 共有 6 种格式, 运行时有效 : bsdialog 双线固定对话框 bsnone 没有框线 bssingle 单线固定 bssizeable 大小可调整 bssizetoolwin 可调整工具窗体 bstoolwindow 单线固定工具窗体 标题栏上的文字 设置窗体工作区背景色 设置窗体外观 :true 立体显示,false 平面显示 设置显示文字的字体样式

30 第 3 章窗体与常用组件 63 属性意义 续表 Height( 高度 ) Icon( 图标 ) Left( 左边界限 ) Name( 名称 ) Top( 上方界限 ) Visible( 显示 / 隐藏 ) Width( 宽度 ) WindowState( 窗体状态 ) 窗体的垂直高度 ( 单位为 Pixel) 窗体极小化时所用的图标 窗体左上角距屏幕左边的距离 ( 单位为 Pixel) 窗体对象的名称 窗体左上角距屏幕上面的距离 ( 单位为 Pixel) 窗体在屏幕上显示或隐藏 窗体的水平宽度 ( 单位为 Pixel) 设置运行时的状态 :wsnormal 正常, 与设计时相同 ; wsminimized 最小化 ;wsmaximized 最大化 窗体的运行与控制窗体作为一种特殊的对象, 有自己的事件和方法, 通过为窗体的事件编写代码或调用窗体的方法既可以控制窗体的运行, 又能完成用其他对象难以实现的工作 尽管在一般情况下, 用户针对窗体的操作并不多, 但由于窗体是组件的载体, 是程序运行的场所, 所以有些程序运行时所必需的初始化操作或程序退出后的 善后处理, 还是需要通过窗体的相关事件或方法来实现 1. 多重窗体对于一般的应用程序而言, 总要包含用以完成不同任务的多个窗体 在多重窗体中, 每个窗体都有自己的界面与程序代码, 都是以独立的.dfm 和.cpp 文件保存在工程中 利用 Project Add to Project 命令可将已有窗体添加进工程 利用 File New Form 命令可以创建一个新的窗体 当多重窗体设计调试完成后, 必须将这些窗体有机地联系起来以形成完整的应用程序 一般来说如果某个窗体是独立的且它只附属于应用程序, 那么就可以在应用程序相应的菜单项或工具栏中使用调用命令来调用该窗体 ; 如果某个窗体是附属于另外一个窗体, 那么调用该窗体的命令就应该放在那个窗体的相应事件代码中 当一个窗体使用完成后应该将其释放 调用一个窗体可以使用下述的 Show 方法, 而释放一个窗体则可以使用 Release 方法 2. 设置启动窗体缺省时, 在工程中创建并保存的第一个窗体会成为工程的主窗体, 也即运行时第一个生成的窗体, 称为启动窗体 当在工程中加入多个窗体后, 可能会决定指定另一个窗体作为应用程序主窗体 若要改变工程的主窗体, 可以按以下的步骤进行 : 1) 选择 Project Options 菜单项, 在弹出的 Project Options 对话框中 ( 参见图 1-8), 选中 Forms 选项卡 2) 在 Main Form 组合框中选择欲作为工程主窗体的窗体名, 并单击 OK 按钮 如果此时运行程序, 新选择的主窗体将被首先显示

31 64 C++ Builder 6 程序设计教程 3. 窗体的运行 窗体的生命周期是指窗体从开始运行到运行结束所经历的不同的状态 在整个生命 周期中, 窗体会经历创建 显示 活动 隐藏 消亡等多种状态 1) 创建状态 当一个窗体被创建且其 Visible 属性值为 true 时, 下列事件将会依次 触发 :OnCreate OnShow OnActivate OnPaint( 当窗体重画时, 触发 OnPaint 事件 ) 对 OnCreate 事件的捕获处理, 可以实现当窗体被创建之后需要完成的操作 2) 活动状态 当窗体处于活动状态时, 触发 OnActivate 事件 一个窗体何时处于 活动状态呢? 除了初始启动以外, 事实上, 当程序焦点 (focus) 转移到窗体上时, 该窗体 就处于活动状态 比如说, 鼠标单击窗体 3) 显示 / 隐藏状态 使用窗体的 Show 方法可以使窗体进入显示状态 某个窗体的 Show 方法将该窗体的 Visible 属性设置为 true, 并将其置于屏幕上所有窗体之前显示 Show 方法的格式如下 : HIDESBASE void fastcall Show(void); 例如 : 一个应用程序在密码验证窗体自动加载后, 如果用户的密码输入正确, 将需 要调用程序的主窗体 (frmmain) 此时只要在密码验证窗体的 确定 按钮的 OnClick 事件过程中加上如下语句 : 即可 frmmain->show(); 注意 : 将需调用窗体的 Visible 属性设为 true 也可以将窗体显示 一个窗体如果暂时不再需要, 可以考虑将窗体隐藏 隐藏窗体的命令是调用窗体的 Hide 方法, 其使用与 Show 方法相同 当一个窗体被隐藏后, 该窗体将变成不可见状态 且窗体的 Visible 属性被置为 false 调用语句如下 : frmmain->hide(); 4) 消亡状态 使一个窗体消亡可以有两种方法 : 窗体释放或窗体关闭 1 窗体释放是指销毁窗体, 并从内存中清除窗体, 回收窗体所占用的内存资源 一般如果窗体已经不再使用应及时将窗体释放 窗体释放可以采用 Release 方法, 如下 所示 : void fastcall Release(void); 使用 Release 方法后, 并不会马上从内存中清除窗体 只有当该窗体的事件或窗体 上的组件的事件全部处理完成之后, 窗体才被销毁 与窗体或子窗体相关的事件处理建 议使用 Release 方法, 否则可能会导致内存存取错误的发生 注意 :Release 调用后会马上返回, 并不会等到窗体释放后才有返回 2 窗体关闭 将窗体关闭可以使用 Close 方法 该方法格式为 : void fastcall Close(void); 下面代码实现了单击 Button1 按钮关闭 Form1 窗体的功能 void fastcall TForm1::Button1Click(TObject *Sender) Form1->Close();

32 第 3 章窗体与常用组件 65 在程序中关闭窗体时一定要特别小心, 因为一旦窗体被关闭, 与该窗体有关的所有 数据将全部清除 所以一定要将需要保存的数据保存完毕后才能关闭窗体 但有时候窗 体的卸载是由于用户的误操作而引起的 ( 如用户单击了 关闭 按钮 ), 如何才能捕捉到 这种误操作呢? 为此 C++ Builder 安排了一个特殊而又重要的 OnCloseQuery 事件, 该事 件在窗体关闭前会触发, 这样为取消关闭窗体的操作提供了机会 对 OnCloseQuery 事件处理返回一个 bool 变量 CanClose, 默认值为 true, 即允许关 闭 可以在该事件处理中加入询问操作, 对用户是否关闭窗体的操作进行确认 例如 : 对某个窗体的 OnCloseQuery 事件处理程序中, 加入如下代码 : void fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) if (MessageDlg(" 确实要关闭本窗体吗?", mtconfirmation, TMsgDlgButtons() << mbok << mbcancel,0) == mrcancel) CanClose = false; // 选择取消按钮, 不关闭窗体 程序运行后, 只要关闭窗体 ( 单击窗体的 关闭 按钮或触发了关闭窗体的方法, 如上面的 Button1 按钮被按下 ) 就会弹出 确实要关闭本窗体吗? 的消息框, 如选择 Cancel 则不关闭, 如选择 OK 窗体正常关闭 Show 方法 Hide 方法 Close 方法在多重窗体的设计中是非常重要的, 在 C++ Builder 的应用程序设计中正是通过这些方法将多个窗体连成一个完整的系统的 如果要求应用程序中将一个窗体打开后, 只有新打开的窗体被关闭后应用程序才能继续运行, 这样的窗体称为模式窗体 打开 ( 显示 ) 一个模式窗体的方法是 ShowModal 例 3-6 多重窗体设计示例 : 设计一个具有密码验证 增加用户 修改密码三个窗体的多重窗体程序 1) 密码验证窗体 添加窗体名称为 Form1 后首先在其上添加相应组件, 添加后如图 3-10 所示, 单元文件名为 Exam03_06 为了能实现密码修改和增加用户的功能, 需要 : 1 在 Form1 中设置两个公用数据成员 : 数组 strname[4] 和 strpass[4], 用以存放不同的用户名称及其对应的密码 ( 最多只能存放 4 位用户 ) 再设置一个公用数据成员整型量 intnum 用来存放当前用户序号 ( 参见代码部分 ) 2 当用户单击 修改密码 按钮时, 要判断用户及其密码的合法性 如是合法的则调用 修改密码 窗体 (Form2) 3 当用户单击 增加用户 按钮时, 要求用户必须是管理员用户而且当前用户的数目不能大于 4 假设管理员用户的用户名与初始密码均是 SYSTEM 2) 密码修改窗体 (Form2) 密码修改窗体的布局如图 3-11 所示 窗体中有两个编辑框和两个按钮 要求密码输入两次, 相同后才能完成修改 写入代码放置在 确定 按钮的 OnClick 事件中 单元文件名为 Exam03_06_1 3) 增加用户窗体 (Form3) 增加用户窗体的布局如图 3-12 所示 它所要完成的是在增加用户时, 用户名不能为空, 两次输入的密码必须一致, 否则给出适当的提示信息要求重新输入, 单元文件名为 Exam03_06_2

33 66 C++ Builder 6 程序设计教程 图 3-10 登录验证 窗体 图 3-11 密码修改 窗体 图 3-12 增加用户 窗体 4) 为使用户不能对窗体进行最大化或最小化, 将三个窗体的 BorderStyle 属性均设 为 bsdialog 窗体与组件的主要属性设置如表 3-11 所示 表 3-11 例 3-6 相关属性设置 对象名称属性名称设置值备注 From1 Caption 登录登录验证窗体 编辑框 edtusername 编辑框 edtpassword 命令按钮 btnadduser 命令按钮 btnchangepass 命令按钮 btnok 命令按钮 btncancel PasswordChar Caption Caption Default Caption * 增加用户修改密码 true 取消 用户名密码显示字符 默认按钮 Form2 Caption 密码修改密码修改窗体 编辑框 edtnewpass1 编辑框 edtnewpass2 命令按钮 btnok PasswordChar PasswordChar Default * * true 新密码确认密码 Form3 Caption 增加用户增加用户窗体 编辑框 edtusername 编辑框 edtpassword1 编辑框 edtpassword2 命令按钮 btnok PasswordChar PasswordChar Default * * true 用户名密码确认密码 5) 当在一个窗体中调用另一个窗体 ( 或窗体中的对象 ) 时, 需要添加被调用对象的声明文件 如在 Form1 中要调用 Form2, 则在 Form1 中要加上 Form2 的声明文件 : #include < frmexam03_06_1.h > 6) 相关代码如下 :

34 第 3 章窗体与常用组件 67 // 主窗体 Form1 头文件 frmexam03_06.h class TForm1 : public TForm public: bool LoginSucceeded; // 登录成功标志 String strname[4], strpass[4]; int intnum; // 主窗体 Form1 文件 frmexam03_06.cpp #include <frmexam03_06_1.h> // 添加 Form2 和 Form3 的.h 文件, // 以便调用它们 #include <frmexam03_06_2.h> // 否则将出现编译错误 // 增加用户事件过程 void fastcall TForm1::btnAddUserClick(TObject *Sender) if((edtusername->text=="system")&&( edtpassword->text=="system")) if (intnum>=4) ShowMessage(" 用户数已满, 不能增加!"); else Form3->Show(); else ShowMessage(" 只有管理员才能增加用户, 请返回!"); // 取消按钮事件过程 void fastcall TForm1::btnCancelClick(TObject *Sender) Close(); // 修改密码窗体事件过程 void fastcall TForm1::btnChangePassClick(TObject *Sender)

35 68 C++ Builder 6 程序设计教程 if(loginsucceeded==true) Form2->Show(); // 如是合法用户则调用 Form2 以供密码修改 else ShowMessage(" 无效的密码或用户名, 请重试!"); // 确定按钮事件过程 // 检查正确的用户名与密码 void fastcall TForm1::btnOkClick(TObject *Sender) LoginSucceeded=false; for(int i=0;i<intnum;i++) if((edtusername->text== strname[i]) &&( edtpassword->text== strpass[i])) LoginSucceeded=true; IntNum=i; if(loginsucceeded==true) ShowMessage(" 密码正确, 欢迎进入!"); else ShowMessage(" 无效的用户名或密码, 请重新输入!"); edtusername->setfocus() ; // 修改密码 Form2 窗体代码 frmexam03_06_1.cpp #include <frmexam03_06.h> // 添加 Form1 的.h 文件 void fastcall TForm2::btnOkClick(TObject *Sender) // 确定按钮事件过程 if(edtpassword1->text!= edtpassword2->text) ShowMessage(" 两次输入的密码不同, 请重新输入!"); else Form1->strPass[Form1->User_Num]=edtPassword1->Text; ShowMessage(" 修改成功!"); Form2->Hide(); // 隐藏本窗体

36 第 3 章窗体与常用组件 69 // 增加用户 Form3 窗体代码 frmexam03_06_2.cpp #include <frmexam03_06.h> // 添加 Form1 的.h 文件 // 从便调用它们 void fastcall TForm3::btnOkClick(TObject *Sender) // 确定按钮事件过程 if((edtusername->text=="") (edtpassword1->text!= edtpassword2->text)) ShowMessage(" 用户名缺或密码错! 请重新输入 "); else Form1->strName[Form1->intNum]= edtusername->text; Form1->strPass[Form1->intNum]= edtpassword1->text; if(form1->intnum<4) Form1->intNum++; else ShowMessage(" 用户已满, 不能增加!"); Form3->Hide(); 3.6 C++ Builder 高级组件 TRichEdit 组件 TRichEdit 组件 ( 来自 Win32 页 ) 提供了丰富的文本编辑功能 除了一般的文本编辑功能之外, 还可以编辑字符格式和段落格式, 并且提供了打印文本的功能 1. Text 和 Lines 属性这两个属性存放 TRichEdit 文本, 可以在设计期间 (Lines 属性 ) 或运行期间访问 2. DefAttributes 和 SelAttributes 属性 DefAttributes 属性是 TRichEdit 文本的当前默认字体式样 ; 而 SelAttributes 属性可以设置或返回被选择文本的字符格式 如果当前没有选中文本, 则 SelAttributes 返回当前插入点的前一个字符的格式 示例代码如下 : RichEdit1->DefAttributes->Color = clblue; RichEdit1->DefAttributes->Style << fsbold << fsitalic; RichEdit1->SelAttributes->Color = clred;

37 70 C++ Builder 6 程序设计教程 RichEdit1->SelAttributes->Height += 5; RichEdit1->Lines->Add("This line of text will be red."); 3. Paragraph 属性通过 TRichEdit 的 Paragraph 属性, 可以设置或返回插入点所在段落的格式 如果选择了多个段落, 则 Paragraph 属性描述的是其中第一个段落的格式 Paragraph 属性是 TParaAttributes 对象 表 3-12 列出了 TParaAttributes 对象的属性 表 3-12 TParaAttributes 类的主要属性属性名称意义 Alignment 段落的对齐 ( 右 左和居中 ) FirstIndent LeftIndent Numbering RightIndent Tab TabCount 首行缩进的像素数左缩进的像素数表明是否要用项目符号右缩进的像素数制表键的数组, 每个制表键的位置以像素值表示 Tab 数组中制表键的个数 4. PlainText 属性 当 PlainText 属性设置为 true 时, 则 TRichEdit 组件中显示 RTF 文件时将以普通文本的方式显示出来, 否则以 RTF 文件中的格式显示 5. Print 方法 调用组件的 Print 方法可以打印编辑器中的文本 Print 方法需要传递一个字符串, 用于在 Windows 打印管理器中标识打印任务 例如 : RichEdit1->Print( MyProgram- +FileName); 这种方法只能打印文本, 无法指定打印边距 格式等 要使一个文字处理程序具有复杂的打印功能, 需要调用 Windows 的 API 和处理 Windows 的 EM_FORMATRANGE 消息 该部分内容读者可以参考 C++ Builder 帮助文档 例 3-7 设置 TRichEdit 字体格式应用举例 本例在窗体创建代码中, 生成了一个 TRichEdit 实例, 该实例充满了整个窗体的客户区 在该 TRichEdit 的编辑区中, 设置 Paragraph 属性的各种取值, 体现了段落的不同格式 程序相关代码如下 : #include <ComCtrls.hpp>; // TRichEdit 的声明 void fastcall TForm1::FormCreate(TObject *Sender) TRichEdit *prich = new TRichEdit(this); // 创建 TRichEdit 组件 prich->parent = this;

38 第 3 章窗体与常用组件 71 prich->align = alclient; prich->lines->clear(); // 设置数字风格 prich->paragraph->numbering = nsbullet; prich->lines->add("introduction"); prich->lines->add("new members to our team"); prich->lines->add("new Budget discussion"); prich->lines->add("facilities"); prich->lines->add("q & A"); prich->paragraph->numbering = nsnone; prich->paragraph->alignment = tacenter; prich->lines->add(""); prich->lines->add("suggested Topics: "); prich->lines->add(""); prich->paragraph->alignment = taleftjustify; prich->paragraph->firstindent = 10; prich->lines->add(""); prich->lines->add("parking lot repair"); prich->lines->add("cost overruns"); 程序的运行结果如图 3-13 图 3-13 TRichEdit 组件的设置段落格式示例在 C++ 中创建一个对象 ( 类的实例 ) 需要使用 C++ 的内存分配运算符 new, 相应地用 delete 释放对象已分配的内存 一般用法为 : 对象名 =new 类名 ; delete 对象名 ; TStringGrid 组件 TStringGrid 组件 ( 来自 Additional 组件页 ) 是一个二维字符型数组 该组件能以表格形式显示二维字符型数组中每个单元的数据 TStringGrid 组件常用于处理数据界面组件无法处理的二维数据表的问题, 如校历表 学生班级成绩表等 使用该组件时, 可

39 72 C++ Builder 6 程序设计教程 通过 RowCount 与 ColCount 属性确定数组的行数与列数 数组元素用 Cells 属性表示 例如, 使用 StringGrid1->Cells[Col][Row] 来表示二维数组第 Col 列 第 Row 行的元素值 ( 从 0 开始 ) 1. TStringGrid 组件主要属性 TStringGrid 组件主要属性如表 3-13 所示 表 3-13 TStringGrid 组件的主要属性 属性名称意义 RowCount ColCount FixedRows FixedCols FixedColor Cells Options 用来确定 TStringGrid 组件数据表的行数用来确定 TStringGrid 组件数据表的列数用来设置表格显示过程中固定不变的行数用来设置表格显示过程中固定不变的列数用来设置固定行与固定列的颜色用来表示表格中的单元格用于控制表格线的显示方式, 如行 列是否可互换, 单元格数据是否可编辑等 以下代码可以在表格中输出 九九表 : void fastcall TForm1::btnComputeClick(TObject *Sender) for(int i=1;i<10;i++) for(int j=1;j<10;j++) StringGrid1->Cells[i-1][j-1]=IntToStr(i)+ "*"+IntToStr(j)+"="+IntToStr(i*j); 2. TStringGrid 组件的主要方法 MouseToCell 方法可将表格相对于屏幕的坐标转换为行和列数, 并返回屏幕坐标 (X,Y) 所在单元的行和列 函数的原型为 : void fastcall MouseToCell(int X, int Y, int &ACol, int &ARow); 3. TStringGrid 组件的主要事件 TstringGrid 组件主要有以下几个事件 : 1)OnRowMoved/OnColumnMoved 事件 当行 / 列的位置改变后, 触发该事件 只有 Options 属性中 gorowmoving/gocolmoving 值为 true 时, 该事件才能发生 2)OnDrawCell 事件 当表格中的单元需要绘制时, 触发该事件 3)OnSelectCell 事件 表格中的单元被选中前, 触发该事件 事件过程中的 ACol 和 ARow 参数指定将要被选中单元的行列索引, 设置 CanSelect 参数为 false 可以防止单元被选中 例如, 下列代码保证了非空单元不被选中 void fastcall TForm1::StringGrid1SelectCell(TObject *Sender, long

40 第 3 章窗体与常用组件 73 Col, long Row, bool &CanSelect) CanSelect = (StringGrid1->Cells[Col][Row]== ""); 4)OnSetEditText 事件 当用户编辑单元值时, 触发该事件 事件过程中 Value 参数为 ACol 和 ARow 参数指定单元的新值 只有 Options 属性中 goediting 值为 true 时, 该事件才能发生 例 3-8 鼠标拖放功能的实现 文艺会演节目单制作程序设计 设计要求 : 会演的节目保存在 TListBox 组件中, 从该组件中将节目拖放到 TStringGrid 组件上, 同时也可以将一个单元格的节目拖动到另一个单元格中, 以便调整节目顺序 设计步骤 : 1) 新建一个工程 Exam03_08 新建一个 TListBox 组件, 并在其 Items 属性中输入会演节目 2) 在窗体上放置一个 TStringGrid 组件, 并按下列要求设计其属性 :Align 为 alclient, 充满剩余客户区 ;Options 下的 goediting 子属性为 true, 允许编辑表格中的内容 ;ColCount 为 3, 共有 3 列 ;FixedRows 为 1, 固定行为 1;FixedCols 为 1, 固定列为 1 3) 在窗体类的定义.h 文件中, 添加类的私有成员 : class TForm1 : public TForm private: String TempCell; // 保存拖放前单元格内容 int TempCol,TempRow; // 保存拖放前单元格坐标 4) 编写事件处理代码 ( 功能见注释 ): void fastcall TForm1::FormCreate(TObject *Sender) // 初始化表格 StringGrid1->RowCount=ListBox1->Count+1; for(int i=1;i<listbox1->count+1;i++) StringGrid1->Cells[0][i]=IntToStr(i); void fastcall TForm1::ListBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) // 开始进行拖动操作, 源组件 if (Button ==mbleft) ListBox1->BeginDrag(false); void fastcall TForm1::StringGrid1DragDrop(TObject *Sender, TObject *Source, int X, int Y) // 拖动结束, 目标组件

41 74 C++ Builder 6 程序设计教程 int Column,Row; StringGrid1->MouseToCell(X, Y, Column,Row); // 取得单元格坐标 if(column>0 &&Row>0) if((source==listbox1)&&(stringgrid1->cells[column][row]=="")) // 源组件是 TlistBox 则将 TListBox 组件中的内容添加到当前单元格 StringGrid1->Cells[Column][Row]= ListBox1->Items->Strings[ListBox1->ItemIndex]; ListBox1->Items->Delete(ListBox1->ItemIndex); // 删除 ListBox1 中的项 if((source==stringgrid1)&& (StringGrid1->Cells[Column][Row]=="")) // 源组件是 TStringGrid, 将一个单元格的内容拖动到另一个单元格 StringGrid1->Cells[Column][Row]=TempCell; StringGrid1->Cells[TempCol][TempRow]=""; // 清除原单元格内容 void fastcall TForm1::StringGrid1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) // 拖动过程中经过目标组件 if ((Source==ListBox1) &&(Sender=StringGrid1)) Accept=true; // 源组件是 ListBox1 else if ((Source==StringGrid1) &&(Sender==StringGrid1)) // 源组件是 StringGrid1 Accept=true; StringGrid1->BeginDrag(true); else Accept=false; StringGrid1->BeginDrag(false); void fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) // 准备进入拖放, 源组件是 StringGrid1, 开始拖放前保存坐标位置及数据 StringGrid1->MouseToCell(X,Y,TempCol,TempRow); if (Button ==mbleft)

42 第 3 章窗体与常用组件 75 StringGrid1->BeginDrag(true); TempCell=StringGrid1->Cells[TempCol][TempRow]; TDateTimePicker 和 TMonthCalendar 组件及日期类函数 1. TDateTimePicker 组件 TDateTimePicker 组件 ( 来自 Win32 组件页 ) 用编辑框方式显示 编辑日期或时间 程序运行时, 当用户单击编辑框下拉按钮时, 组件将用日历表方式供用户选择当前的日期, 如图 3-14 所示, 主要属性如表 3-14 所示 图 3-14 TDateTimePicker 组件选择日期 图 3-15 TMonthCalendar 组件的显示 表 3-14 TDateTimePicker 组件的主要属性 属性名称意义 Date Time Kind DateFormat 设置用户规定的日期, 也可返回用户选择的日期 设置用户规定的时间, 也可返回用户选择的时间 用来选择 TDateTimePicker 组件的显示类型 当 Kind 属性为 dtkdate 时,TDateTimePicker 组件显示 编辑日期 ; 当 Kind 属性为 dtktime 时, 显示编辑时间 用来控制日期的显示格式 值为 dfshort 时, 以短日期格式显示两位年份, 如 3/21/97; 值为 dflong 时, 以长日期格式显示 4 位年份, 如 Friday, March 21, TMonthCalendar 组件 TMonthCalendar 组件 ( 来自 Win32 组件页 ) 以月历方式显示日期, 如图 3-15 所示 主要属性如表 3-15 所示 表 3-15 TMonthCalendar 组件的主要属性 属性名称意义 Date MaxDate MinDate MultiSelect EndDate 设置用户规定的日期, 也可返回用户选择的日期 日期变化的最大值 日期变化的最小值 与 EndDate 属性结合实现 TMonthCalendar 组件的多选功能 值为 true 时, 运行时可按下 Shift 键用鼠标选择连续的多个日期, 起始 / 终止日期由 Date/EndDate 属性决定 值为 false 时, 只能单选日期 见 MultiSelect 属性的意义描述

43 76 C++ Builder 6 程序设计教程 续表 属性名称意义 ShowToday ShowTodayCircle FirstDayOfWeek WeekNumbers 该值为 true 时, 在日历表下方显示今天的日期 ; 否则不显示当该值为 true 时, 在日历表上用红圈标注今天的日期 ; 否则不标注该属性决定日历表以星期几开始排列, 当值为 dowmonday 时, 星期一排在首位当值为 true 时, 在日历表的左侧显示周列表 3. 日期类函数 1) 返回日期 时间函数有以下三个 : Date() 函数返回系统当前日期 Time() 函数返回系统当前时间 Now() 函数返回系统当前日期与时间, 相当于调用 Date()+Time() 2) 日期类转换函数有以下几个 : DateToStr(date()) 函数将日期转换为字符串 TimeToStr(time()) 函数将时间转换成字符串 DateTimeToStr(Now()) 函数将日期时间转换成字符串 EncodeDate(year,month,day) 函数将年 月 日转换成日期 DecodeDate(date,year,month,day) 函数将日期转换成年 月 日 EncodeTime(hour,min,sec) 函数将时 分 秒转换成时间 DecodeTime(time,hour,min,sec) 函数将时间转换为时 分 秒 DayOfWeek() 函数返回 TDateTime 日期类型对应的星期数下面的例子使用了一个 TEdit 组件和一个 TButton 组件, 按下 Button1 将会弹出一个对话框, 显示输入日期所对应的星期数 void fastcall TForm1::Button1Click(TObject *Sender) char days[7][10] = "Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday" ; TDateTime dtdate = StrToDate(Edit1->Text); ShowMessage(Edit1->Text + AnsiString(" is a ") + days[dtdate.dayofweek() - 1]); TPageControl 组件 TPageControl 组件 ( 来自 Win32 组件页 ) 称为多页组件, 用来实现多页面窗体技术, 每个页面上均能添加若干组件 程序运行时, 通过单击页面标签可以在多页面之间进行切换 将 TPageControl 组件放到窗体上后, 用鼠标右键单击 TPageControl 组件并在弹出式菜单中选择 New Page 选项可添加新页, 选中 Delete Page 选项可删除当前页 注意 : 单击 TPageControl 组件标题时, 选中的是 TPageControl 对象 ; 单击 TPageControl

44 第 3 章窗体与常用组件 77 组件页面时, 选中的是 TTabSheet 对象 选择不同对象时在 Object Inspector 中将显示不同对象的属性 表 3-16 和表 3-17 分别列出了 TPageControl 和 TTabSheet 组件的主要属性 表 3-16 TPageControl 组件的主要属性属性名称意义 ActivePage MultiLine Images Pages ActivePageIndex 设置 TPageControl 组件的当前页 单击该属性的下拉列表框, 可选择不同页面 该值为 true 时,TPageControl 组件呈多行风格 指定与 TPageControl 组件相关联的 TImageList 组件名, 以便使用 TImageList 中的图像 运行时属性, 记录 TPageControl 的所有页面 该属性是个数组, 其元素类型为 TTabSheet, 元素个数存放在 PageCount 属性中, 索引从 0 开始 当前活动页的索引, 从 0 开始计数 该属性也是运行时属性 表 3-17 TTabSheet 组件的主要属性 属性名称意义 Caption PageIndex TabVisible ImageIndex 设置页标签的名称 PageIndex 为该页在 Pages 数组中的下标, 从 0 开始用来设置本页是否可见本页所使用图像在 TImageList 中的索引值 例 3-9 TPageControl 组件应用示例 本例使用了一个 TPageControl 组件 设计时无新页面, 运行时由窗体的 OnCreate 事件处理代码生成新页面 当单击 TPageControl 组件的标签时将弹出消息框, 提示当前页面的后续页标题和前页标题 程序代码如下 : void fastcall TForm1::FormCreate(TObject *Sender) for (int i = 0; i < 5; i++) TTabSheet *ppage = new TTabSheet(PageControl1); ppage->pagecontrol = PageControl1; ppage->caption = AnsiString("Page") + IntToStr(i); ppage->name = AnsiString("ts") + ppage->caption; void fastcall TForm1::PageControl1Change(TObject *Sender) AnsiString PrevCaption, NextCaption; TPageControl *ppc = (TPageControl *)Sender; PrevCaption = ppc->findnextpage(ppc->activepage,true,false)->caption;

45 78 C++ Builder 6 程序设计教程 NextCaption=pPC->FindNextPage(pPC->ActivePage,false,false)->Caption; ShowMessage(AnsiString("Next tab caption: '") + PrevCaption + AnsiString("' Previous tab Caption: '") + NextCaption + AnsiString("'")); // TTreeView 和 TListView 组件 1. TTreeView 组件 图 3-16 系 班树形目录结构 TTreeView 组件 ( 来自 Win32 页 ) 用树形目录结构显示 编辑 删除数据项 例如 : 可以用树形目录结构显示各系部名称 班级等信息, 如图 3-16 所示 表 3-18 列出了 TTreeView 组件的主要属性 表 3-18 TTreeView 组件的主要属性 属性名称意义 Items Selected AutoExpand HotTrack Images ShowButtons ShowLines ShowRoot SortType TTreeView 组件通过该属性来存储所有数据项 它的类型为 TTreeNode 该属性指出当前选中的数据项, 类型为 TTreeNode 如无数据项被选中, 则返回 NULL 该属性值为 true 时,TTreeView 组件的数据项自动展开和折叠 ; 否则, 不会自动展开 该属性值为 true 时, 鼠标所指数据项被加亮显示 ; 属性值为 false 时, 正常显示 该属性用来保存 ImageIndex 与 SelectedIndex 指定的图标, 类型为 TImageList 值为 true 时,TTreeView 组件显示展开和折叠的 + - 按钮 值为 true 时,TTreeView 组件显示连接父 子数据项的直线 值为 true 时,TTreeView 组件显示根目录 指定组件中的数据何时自动排序 :stnode 不排序 ;stdata 数据对象改变时重排 ; sttext 数据项标题改变时重排 ;stboth 数据对象或标题改变时重排 TTreeView 组件主要方法和事件如下 : 1)FullCollapse 方法 : 用来折叠所有数据项 2)FullExpand 方法 : 用来扩展所有数据项 3)OnChanging 事件 : 当被选数据项要发生变化时, 触发该事件 4)OnChange 事件 : 当被选数据项发生变化后, 触发该事件 5)OnCollapsed 事件 : 当某个数据项被折叠后, 触发该事件 6)OnExpanded 事件 : 当某个数据项被扩展后, 触发该事件 TTreeView 组件通过其 Items 属性来存储其所有的数据项 要向该组件添加或删除数据项可以使用 Items 编辑器 双击 TTreeView 组件 单击 Items 属性省略按钮或右键单击 TTreeView 组件, 选择弹出式菜单中的 Items Editor 选项均可打开 Items 编辑器, 如图 3-17 所示 在 Items 编辑器中, 可以使用下列 4 个按钮进行编辑 : 1)New Item: 添加数据

46 第 3 章窗体与常用组件 79 图 3-17 Items 编辑器 2)New SubItem: 添加数据项的子项 3)Delete: 删除当前项及其所有子项 4)Load: 从文本文件中读取数据项 文本文件格式为每一行写一个数据项, 第二层的数据项前加 Tab 键 向 Items 添加的每一个数据项都有 4 个属性, 用来显示数据项的值或图像 这 4 个属性分别是 : 1)Text: 数据项显示文本 2)Image Index: 图像索引, 值为与 TTreeView 相关联的 TImageList 中的图像索引 运行时, 该数据项前显示相应的图像 3)Selected Index: 显示选中项的图像索引,-1 禁止显示图像 4)State Index: 为一个数据项选择附加图像索引,-1 禁止显示图像 2. TListView 组件 TListView 组件 ( 来自 Win32 页 ) 可用 4 种图形方式 ( 大图标 小图标 列表 详细列表 ) 来描述选项内容 TListView 组件的主要属性如表 3-19 所示 表 3-19 TListView 组件的主要属性 属性名称意义 ViewStyle Items LargeImage SmallImage Columns ShowColumnHeaders ColumnClick 用来选择数据项的 4 种显示方式 :vsicon, 大图标 ;vssmallicon 小图标 ;vslist, 列表 ;vsreport, 详细列表 用来表示 TListView 组件的数据项, 数据项可以用 Items 属性编辑器输入 当 ViewStyle 属性为 vsicon 时, 数据项对应的大图标放在 LargeImages 属性指定的 TImageList 组件中, 图像索引由各个数据项的 ImageIndex 属性指定 当 ViewStyle 属性不为 vsicon 时, 数据项对应的小图标放在 SmallImage 属性指定的 TImageList 组件中, 图像索引由各个数据项的 ImageIndex 属性指出 当 ViewStyle 属性为 vsreport 时,ListView 组件以报表方式 ( 即详细列表 ) 显示数据项, 报表各列的标题 宽度等信息可以用 Columns 属性设置 该属性为 true 时, 显示列标题 ; 为 false 时, 不显示列标题 该属性为 true 时, 可以单击表头, 同时触发 OnColumnClick 事件 TListView 组件的主要事件如下 : 1)OnSelectItem 事件 : 当某个数据项被选中时触发该事件

47 80 C++ Builder 6 程序设计教程 2)OnColumnClick 事件 : 当 TListView 工作于报表方式时, 单击表头按钮触发该事件 TListView 组件通过其 Items 属性来表示 TListView 数据项 要向该组件添加或删除 数据项可以用 Items 编辑器, 如图 3-18 所示 图 3-18 TListView 组件的 Items 编辑器 在 Items 编辑器中有 3 个按钮 :NewItem New SubItem Delete, 分别用来添加数 据项 添加数据项子项和删除数据项 注意 :TListView 组件与 TTreeView 组件在数据项显示方式上有所不同, 当 TListView 组件工作于 vsicon 大图标 vssmallicon 小图标 vslist 列表方式时, 只显示 第一层数据项而不显示其子数据项 当 TListView 组件工作于 vsreport( 详 细列表 ) 时, 用 NewItem 按钮添加的第一层数据项将显示在第一列, 用 NewSubItem 按钮添加的子数据项将从第二列开始依次向后排列 当 ViewStyle 属性为 vsreport 时,TListView 组件以报表方式 ( 即详细列表 ) 显示数 据项 报表各列的标题 宽度等信息用 Columns 属性设置 双击 TListView 组件可以进 入 Columns 属性编辑器, 通过编辑器中的 4 个按钮可进行插入 删除 上移 下移报表列 TSplitter 组件 TSplitter 组件 ( 来自 Additional 页 ) 可以实现窗体分割 如果想要建立一个运行时可以自由改变大小的区域, 可以使用该组件 TSplitter 组件在各个组件间合理分隔 Form 空间 1. TSplitter 组件的主要属性 TSplitter 组件的主要属性见表 3-20 表 3-20 TSplitter 组件的主要属性 属性名称意义 Align 控制 TSplitter 组件的位置和移动方向 值为 alleft 或 alright 时, 该组件可以沿水平方向移动 ; 值为 altop 或 albottom 时, 该组件可以沿垂直方向移动 Beveled 值为 true 时, 在 TSplitter 组件上将出现两条垂直 (Align=alLeft 或 alright) 或水平凹下去 (Align=alTop 或 albottom) 的直线 MinSize 如果 Align 属性为 alleft 或 alright, 则 TSplitter 组件左右两边组件的宽度不能小于 MinSize 值 ; 如果 Align 属性为 altop 或 albottom, 则 TSplitter 组件上下两边组件的宽度不能小于 MinSize 值

48 第 3 章窗体与常用组件 TSplitter 组件的主要事件 Tsplitter 组件的主要事件如下 : 1)OnCanResize 事件 : 当用户试图移动 TSplitter 组件时被触发 2)OnMoved 事件 : 当 TSplitter 组件被拖动且改变了相应组件的大小后被触发 3. TSplitter 组件应用 TSplitter 组件可以在设计时设置它的 Align 属性, 调整它的位置, 通常与其他容器 类组件配合使用 也可在运行期间通过程序代码来控制它, 以下的示例便是通过代码来 使用 TSplitter 组件 例 3-10 本例演示了如何使用 TSplitter 组件, 动态划分窗体区域并列出当前文 件夹位置及其中的所有文件 程序代码如下 : #include <Extctrls.hpp> #include <Filectrl.hpp> void fastcall TForm1::Form1Create(TObject *Sender) TSplitter* ps = new TSplitter(Form1); // 动态创建 TSplitter 组件 TFileListBox* pflb = new TFileListBox(Form1); // 动态创建 TFileListBox 组件 TDirectoryListBox* pdlb = new TDirectoryListBox(Form1); // 动态创建 TDirectoryListBox 组件 // 将目录列表置于窗体左侧 pdlb->parent = Form1; pdlb->align = alleft; pdlb->width = Form1->ClientWidth/3; // 使用 TSplitter 组件区分目录区和文件区 ps->parent = Form1; ps->left = pdlb->left+pdlb->width + 1;// Move to right of directory list. ps->align = pdlb->align; // Give same alignment as directory list. // 每一个区至少有窗体宽度的 1/4 大小 ps->minsize = Form1->ClientWidth/4; // 创建文件列表区 pflb->parent = Form1; pflb->align = alclient; pdlb->filelist=pflb;//link the file list box to the directory list box. 运行结果如图 3-19 所示

49 82 C++ Builder 6 程序设计教程 图 3-19 TSplitter 组件应用 TProgressBar 组件 TProgressBar 进度条组件 属性如表 3-21 所示 ( 来自 Win32 页 ) 用来显示程序执行的进度, 它的主要 表 3-21 TProgressBar 组件的主要属性 属性名称意义 Max Min Position Step 用来设置 TProgressBar 组件中位置的坐标的最大值用来设置 TProgressBar 组件中位置的坐标的最小值提供 TProgressBar 组件中填充块的位置坐标值, 以实现对其它组件的滚动控制用来设定 TProgressBar 组件的每步间隔 例 3-11 本例演示了 TProgressBar 进度条的使用 单击 Button1 按钮, 执行事 件处理 程序代码如下 : void fastcall TForm1::Button1Click(TObject *Sender) for(int i=1;i<100;i++) // 可添加实际数据处理过程, 替换函数 Sleep Sleep(100); ProgressBar1->Position = i; 程序的运行结果如图 3-20 所示 图 3-20 TProgressBar 进度条的使用

50 第 3 章窗体与常用组件 程序调试方法 一套完整的应用程序从程序代码的角度看通常包含若干个模块组件 对开发人员来说程序代码的编写只解决了问题的一部分 因为在程序编制的过程中, 不可避免地存在着各种各样的错误, 为了改正这些错误, 任何形式的程序代码在编制过程中都需要经过调试 程序调试的过程实际上是发现错误 修改错误的过程 程序错误类型 1. 语法错误语法错误是程序中最容易出现也是最好修改的错误 主要是由于键盘输入错误 命令格式不对 粗心大意等原因造成的 如关键字写错 表达式不对 使用了全角的标点符号 变量或函数未定义 语句对不匹配等 一般的语法错误在编译时能被检测出来 2. 运行错误运行错误是指程序在输入或编译时没有出现错误, 但在运行代码时产生了错误而导致了运行的中断 这类错误往往是由于在指令代码中出现了一些非法的操作而引起的 例如试图打开一个不存在的文件 被 0 除 磁盘空间不足等 3. 逻辑错误逻辑错误实际上是算法上的错误, 这种错误在编译和运行时是无法发现的, 但程序运行结束后所得到的却是错误的或并非预期的结果 这类错误只能通过仔细检查程序代码并借助于调试工具来判断才能加以排除 程序的基本调试方法有 : 程序跟踪 标准数据检验 边界检查等 程序跟踪对于比较复杂的大型程序来说, 通常程序中总是存在着各种各样的错误 程序跟踪是寻找错误原因的最重要的调试手段 程序跟踪的基本原理是让程序分步执行, 通过观察和分析程序执行过程中数据及程序执行流程的变化来查找错误 分步执行的情况可以是程序一句一句执行, 或执行到指定语句时停留等 程序跟踪可以采用两种方法 : 一种是传统方法, 通过在程序中直接设置断点 输出重要变量内容等来掌握程序的运行情况 ; 另一种是直接利用 C++ Builder 中的单步执行 (step over) 跟踪(trace into) 断点设置(add breakpoint) 监视表达式(add watch) 等功能对程序进行跟踪 1. 单步执行单步执行就是逐条语句地执行代码, 通过查看应用程序的窗体和相关的调试窗体来判断该语句的执行是否正确 ( 主要是观察变量和表达式的值是否正确, 窗体上的显示是

51 84 C++ Builder 6 程序设计教程 否正常等 ) 选择 Run Step Over 或 F8 键, 即可开始程序的单步执行, 每次执行光标所在行的一条语句, 当前语句执行完成后, 象征当前程序执行位置的光带停留在下一条语句上 当把鼠标移到光带停留位置附近的变量时, 就会显示出该变量当前值, 从而判断计算过程是否有问题 2. 跟踪执行当需要得到函数调用过程中数据传递和函数内处理过程的细节时, 可以通过在函数的调用位置选择跟踪 (Trace Into)(F7), 在函数内再使用单步执行进行调试 3. 设置断点将鼠标移动到需要设置断点的代码行, 然后双击编辑框左边界, 会出现红色圆点及阴影区, 则表示断点已经设置成功 当程序执行到断点位置时, 会自动暂停 4. 监视表达式有时在运行过程中需要了解一些重要变量或表达式的值 可以添加需要观察的变量或表达式, 从而配合单步执行来观察 要添加变量, 可以选中 Run Add Watch 命令, 将出现 Watch Properties 对话框, 如图 3-21 所示 在 Expression 栏中选择需要观察的变量, 单击 OK 按钮即可 图 3-21 Watch Properties 对话框 标准数据检验在程序编译 连接通过以后, 就进入了运行调试阶段 运行调试的第一步就是用若干组已知结果的标准数据对程序进行检验 标准数据的选择非常重要, 一是要有代表性 ; 二是要比较简洁, 容易对其结果的正确性进行分析 边界检查在设计检查用的数据时, 要重点检查边界和特殊情况 例如, 对于循环 while(count < 1000)

52 第 3 章窗体与常用组件 85 就应该设计数据检验 Count 等于 999/1000/0 或者负数等情况 若程序中有 if-else 语句等分支结构, 则应该设计相应的数据, 用来检验分支中的每一条路径 3.8 综合应用举例 例 3-12 学生基本信息录入界面设计 (1) 学生基本信息录入界面包含了各种常用组件 该界面信息包括 : 学生姓名 学号 性别 民族 是否团员 所属系部等信息, 具体界面布局如图 3-22 所示 图 3-22 学生基本信息录入界面 (2) 窗体与组件的主要属性设置如表 3-22 所示 表 3-22 例 3-9 相关属性设置组件名称属性名称设置值备注 单选按钮 Radiomale 单选按钮 Radiofemale Caption Caption 男 女 学生性别选择 检查框 CheckBox1 检查框 CheckBox2 Caption Caption 汉族 团员 是否汉族是否团员 列表框 ListBoxDepartment 所属系部 Memo MemoInfo 所录入学生基本信息 命令按钮 btnok Caption 确定 录入信息确认 命令按钮 btninput Caption 录入 信息录入 编辑框 EditName 编辑框 EditNum 学生姓名录入学生学号录入 (3) 程序的相关代码如下 : // 录入信息确认事件处理

53 86 C++ Builder 6 程序设计教程 void fastcall TForm1::btnOkClick(TObject *Sender) int position=0; // 是否为空判断 if(editname->text=="") Application->MessageBox(" 姓名为空, 请重新输入!", " 出错 ", MB_OK); return; if(editnum ->Text=="") Application->MessageBox(" 学号为空, 请重新输入!", " 出错 ", MB_OK); return ; If(!(Radiomale->Checked Radiofemale->Checked)) Application->MessageBox(" 性别为空, 请重新输入!", " 出错 ", MB_OK); return ; If((Radiomale->Checked) sex= " 男 "; else sex= " 女 "; if(checkbox1->checked) nation=" 是 "; if(checkbox2->checked) group =" 是 "; if(listboxdepartment->itemindex=-1) Application->MessageBox(" 请选择系部!", " 出错 ", MB_OK); return ; position= ListBoxDepartment->ItemIndex; MemoInfo->Text = " 姓名 :" +EditName->Text + ", " + " 学号 :" +EditNum->Text + ", " + " 性别 :" +sex + ", " + " 汉族 :" +nation + ", " + " 团员 :" +group + ", " + " 所属系部 :"+ ListBoxDepartment->Items->Strings[position];

54 第 3 章窗体与常用组件 87 本章小结 1. 常用事件应用程序中需要用户处理的常用事件有 :OnClick OnDblClick OnKeyPress OnKeyDown OnKeyUp OnDragDrop OnDragOver 等 2. 常用的输入组件常用的输入组件中, 单选按钮和检查框可用于在较少选项中选择一个项的情况 组件的 Checked 属性表示当前的状态, 组件的主要事件是 OnClick 列表框和组合框主要用于具有较多选项选择的场合 通过对 TStrings 类型的 Items 属性进行操作, 可以维护列表的内容 ItemIndex 属性代表当前选中的项在列表中的位置 3. 窗体窗体是设计应用程序中用户界面的基础, 窗体的属性有 :BorderStyle( 边界 ) Caption ( 标题 ) Color( 背景色 ) Ctrl3D( 外观 ) Visible( 显示 / 隐藏 ) Width( 宽度 ) WindowState ( 窗体状态 ) 等 打开 ( 显示 ) 窗体的方法是 Show ShowModal; 隐藏一个窗体的方法是 Hide; 关闭一个窗体的方法是 Close 4. C++ Builder 高级组件 TRichEdit 组件可以编辑带格式的文档 通过 Text 和 Lines 属性可以在设计期间或运行期间访问组件中存储的文本 通过 DefAttributes 和 SelAttributes 属性设置文本的格式 TStringGrid 组件可以构造一个电子表格 通过 Cells 属性访问单元格的内容 5. 程序调试方法程序中的错误类型有 : 语法错误 运行错误 逻辑错误 程序的调试方法主要是跟踪程序的运行, 以便找到逻辑错误所在 跟踪的方法有 : 单步执行 (Step Over) 跟踪(Trace Into) 设置断点(Add Breakpoint) 添加监视表达式 (Add Watch) 习题 组件中有哪些常用的属性与事件? 其含义与用法如何? 3-2 组件默认的 Tab 键顺序是什么? 如何改变? 3-3 什么情况下会产生 OnClick 事件? 3-4 试说明在以下动作中会引发哪些事件 : (1) 在编辑框中输入字符 (2) 编辑框中的内容发生变化

55 88 C++ Builder 6 程序设计教程 (3) 某一个组件失去焦点时 3-5 组合框有几种形式? 有何异同? 通过什么属性值来改变? 3-6 能使用编辑框与列表框来实现组合框吗? 3-7 设计一个多重窗体程序, 要求如下 : (1) 成绩数据处理 窗体上有三个按钮 : 成绩输入 成绩计算 结束 (2) 单击 成绩输入 时弹出 成绩输入 窗体, 该窗体上放置几个文本框和标签用于输入各门课程的成绩, 课程名称自定 其上还有一个 返回 按钮, 用于返回到 成绩数据处理 窗体 (3) 单击 成绩计算 时弹出 成绩计算 窗体, 在该窗体上显示学生的平均成绩与总成绩, 同样设置一个 返回 按钮 3-8 设计一个 通信录 程序 编程要求 : (1) 当用户在下拉列表框中选择某一人名后, 在 电话号码 文本框中显示出对应的电话号码 (2) 当用户选择或取消 单位 和 住址 复选框后, 将打开或关闭 工作单位 或 家庭住址 文本框, 如图 3-23 所示 (a) (b) 图 3-23 窗口 3-9 编写一段程序, 当同时按下 Alt Shift 和 F6 键时, 在窗体上显示 Good Bye!, 并终止程序的运行 3-10 编写一个程序, 当按某个键时, 程序以十六进制和八进制形式输出该键的 KeyCode 3-11 利用恰当的组件, 设计一个类似 Windows 资源管理器的界面

56 第 4 章菜单与工具栏 菜单和工具栏是用户界面的重要组成部分, 两者对用户界面的友好性 易用性有着直接的影响 而作为一个应用软件, 其界面的友好性是其质量的重要标志 菜单与工具栏的任务是将应用程序所能完成的任务有机地组织起来以方便用户的使用 在 Windows 环境下, 几乎所有的软件都有菜单与工具栏, 而且这些菜单与工具栏从构成 组织到操作方法甚至快捷键都非常相似 因此, 对菜单与工具栏的熟悉和应用, 就变得非常必要了 4.1 定制应用程序界面 设计应用程序主窗体当通过菜单的 File New Application 命令打开一个窗体和对应的单元时便产生一个工程, 此时可以在 Form 上设计该程序的输入 / 输出界面, 接着再进入代码编辑器窗体编写对应的 Unit 程序, 简单的程序就可以这样完成 其中,Form 是一个组件,Unit 是指程序代码 ( 参见图 1-1) 一个 C++ Builder 应用程序往往由多个相关的文件构成, 通过使用称为 工程 的特殊文件来管理应用程序的所有不同的文件 若当前工程中有两个窗体 Form1 和 Form2, 使用菜单命令 View Units 快捷键 Ctrl+F12 或工具栏的按钮均可打开 View Unit 将对话框, 选择工程文件 Project1.cpp( 假设工程文件名使用默认名 ) 并打开, 该文件内容将显示如下 : #include <vcl.h> #pragma hdrstop USEFORM("Unit1.cpp", Form1);// 当前工程中的窗体单元文件名及窗体名 (Name 属性 ) USEFORM("Unit2.cpp", Form2);// 本例中有 2 个窗体 Form1,Form2 WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) //Windows 应用程序的入口 try Application->Initialize(); // 应用程序初始化 Application->CreateForm(_classid(TForm1), &Form1); // 应用程序自动创建窗体 Application->CreateForm(_classid(TForm2), &Form2);

57 90 C++ Builder 6 程序设计教程 Application->Run();// 应用程序开始运行, 进入 Windows 消息循环 catch (Exception &exception) // 捕获运行过程中出现的异常错误 // 运行过程中出现异常错误, 显示异常错误 Application->ShowException(&exception); catch (...) // 捕获其他未知错误 try throw Exception(""); catch (Exception &exception) Application->ShowException(&exception); return 0; 工程文件中的 Application 对象的 CreateForm 方法用于程序启动时创建一个窗体, 它被调用的先后顺序决定了窗体显示的顺序 可以通过选择 Project Options 打开 Project Options 对话框, 在该对话框的 Forms 选项卡的 Main Form 组合列表框中选择一个窗体 ( 如 Form2) 作为工程主窗体的窗体名 再编译运行该程序,Form2 将首先显示出来 观察 Project1.cpp, 可以看到 Form1 和 Form2 的先后顺序已被 IDE 修改了 如果应用程序有许多窗体, 且有些窗体不经常使用, 为了减少应用程序占用的资源, 这些窗体不需要在程序启动时自动创建, 而是在需要时创建 如果在 Project Options 对话框中的 Forms 选项卡上的 Auto-create forms 列表中列出了自动创建的窗体, 将其移到 Available forms 列表中后便不会自动创建 以下代码可以实现在单击一个按钮后, 创建并显示一个窗体 : #include "Unit2.h" // 窗体 Form2 的声明文件 void fastcall TForm1::Button1Click(TObject *Sender) TForm2 *Form2=new TForm2(Application); // 创建窗体 // 或者使用 Application->CreateForm( classid(tform2),&form2); Form2->Show(); // 显示窗体 菜单的规划与设计 Windows 环境下的各种应用软件通常都有自己的菜单, 而且菜单的结构都相同 菜单系统一般由以下四大部分组成 :

58 第 4 章菜单与工具栏 91 1) 菜单栏指位于窗体标题栏下方包含若干个菜单标题的水平矩形条状区域 2) 菜单标题指菜单栏中菜单的名称 每个菜单标题标识了一个下拉列表 3) 菜单项包含于菜单之中的各个选项, 当选中某个菜单项后, 可能会执行一条命令也可能是执行一个过程或函数, 甚至可能弹出一个子菜单 4) 子菜单是指激活一个带有 标记的菜单选项后打开的列表, 它也由一系列菜单项构成 在每个菜单标题或菜单项右侧均有相应的访问键, 有些菜单项还有快捷键, 有关访问键和快捷键的概念 操作方法与 Windows 中菜单的使用方法是一致的 1. 规划菜单应用程序的菜单系统很大程度上决定了应用程序的实用性和易用性 因此对菜单系统进行精心的规划与设计既有助于准确体现应用程序的功能, 又能帮助用户轻松掌握 灵活方便地使用应用程序 在进行菜单系统的规划时, 一般应考虑如下原则 : 1) 基于用户 要从使用者的角度出发, 按照用户所要执行的任务流程来组织菜单系统, 而不应该按应用程序的层次组织菜单系统 2) 名称通俗 在给每个菜单或菜单项进行命名时, 要尽量避免使用那些过于专业的或似是而非的名词, 而应该使用比较通俗易懂又能体现其功能的日常用语 3) 组织合理 一般情况下, 对菜单项目的组织要按照菜单项估计使用频率或者菜单项使用的逻辑顺序, 这样有助于提高操作的效率, 同时使用起来也得心应手 4) 适当分隔 按照菜单项之间的逻辑关系, 将内容相近的菜单项并在一个逻辑组中, 并在每个逻辑组之间放置分隔线 5) 控制数目 一般一个菜单的项目个数不应该超过一个屏幕 如果项目过多, 可以考虑为其中某些菜单项设置一些子菜单 6) 灵活利用访问键 / 快捷键 好的菜单系统既可以使用鼠标进行操作又可以使用键盘操作, 对那些需要经常使用的菜单还应该为其设置快捷键以提高操作效率 在指定访问键和快捷键时, 要注意遵守一般的 Windows 应用软件的习惯 例如 :Alt+F 可以作为 文件 菜单的访问键 ;Ctrl+P 可以作为 打印 菜单项的快捷键 例如, 对于本书中所使用的 学生成绩管理系统 的菜单体系结构如表 4-1 所示 表 4-1 学生成绩管理系统 菜单体系文件 (F) 编辑 (E) 查询 (Q) 系统维护 (S) 帮助 (H) 注册 (L) 成绩编辑 (C) Ctrl+J 按班级 (D) Ctrl+I 课程设置 (K) 内容 F1 退出 (X) 补考录入 (B) Ctrl+B 按个人 (G) Ctrl+G 学生档案 (U) 关于 通用查询 (T) Ctrl+T 班级编码 (I) 课程编码 (C) 专业编码 (Z) 用户管理 (M)

59 92 C++ Builder 6 程序设计教程 2. 菜单设计通过 C++ Builder 所提供的菜单编辑器可以方便地设计应用程序所需要的菜单 利用菜单编辑器不仅可以设计一个新的菜单, 而且可以对已有菜单进行修改 在整个菜单的设计过程中, 几乎不需要编程, 通过可视化方式即可完成菜单的制作 (1) 菜单编辑器要使用菜单编辑器, 必须首先打开一个拟放置菜单的窗体 ( 通常是应用程序的主窗体 ) 然后在 Standard 组件页上选取 TMainMenu 组件图标, 将它添加到主窗体中 打开菜单编辑器有下列两种常用方法 : 1) 在 TMainMenu 组件上, 双击鼠标 2) 在 TMainMenu 组件上, 单击鼠标右键, 在弹出的快捷菜单上单击 Menu Designer 选项, 即可打开菜单编辑器, 如图 4-1 所示 图 4-1 菜单编辑器在 C++ Builder 中, 每个菜单标题或菜单项均被看成是在菜单编辑器中所定义的一个菜单组件, 它们的用法与命令按钮等组件相似 它们也具有其外观或行为的各种属性, 如 :Name Caption Enabled Visible Checked 等 菜单组件的事件比较简单, 主要是 OnClick 事件, 当用键盘或鼠标选中菜单时将触发相应的 OnClick 事件 一般只要对菜单选项编制 OnClick 事件 菜单组件的大部分属性通过菜单编辑器就可以设置, 也可以在运行时对某些属性进行重新设置以达到预定的功能 (2) 菜单的创建通过 菜单编辑器 可以方便地创建一个菜单, 下面以表 4-1 为实例介绍 MainMenu ( 主菜单 ) 的设计过程 例 4-1 主菜单示例 主要步骤如下 : 1) 打开要创建菜单的窗体, 也可新建一个窗体 ( 如 MainForm) 在窗体上放置 TMainMenu( 主菜单 ) 组件, 打开菜单编辑器 ( 如上所示方法 ) 2) 打开菜单编辑器后, 反白停在左上角方格内, 然后在 Object Inspector 窗体中, 分别在 Caption 属性中输入希望在菜单上显示的文本 ( 如 文件 ), 并在 Name 属性中输入该菜单组件的名称, 用于在代码中引用 ( 如 mnufile) 命名时一般要体现菜单所在的层次 例如 : 文件 菜单下的 注册 选项可命名为 mnufile_login 若要在菜单栏中增加新选项, 则鼠标移至 文件 选项右边虚线方框中, 同上继续编辑菜单栏选项 3) 编辑菜单项 若要编辑 文件 菜单下的菜单项, 则将鼠标移至 文件 选项下面虚线方框内, 设置 Caption 和 Name 属性值 如果需要还可以设置菜单组件的其他属性, 如图 4-2 所示 4) 编辑分隔线 若想要在各选项之间加入分隔线, 以表示不同类别选项, 则可将该组件的 Caption 属性设为 - 分隔线也是一个组件, 它也有自己的属性, 如图 4-2 中 注册 与 退出 菜单项间的一条横线

60 第 4 章菜单与工具栏 93 注意 : 虽然分隔线也算是一个菜单组件, 但它们既不能被选取, 也不能响应 OnClick 事件 5) 编辑子菜单 若要在菜单项中 注册 选项上添加它的二级菜单 ( 子菜单 ), 则将鼠标移至 注册 选项上, 单击鼠标右键, 在弹出的快捷菜单上选择 Create Submenu 选项, 将在 注册 选项右边出现一个方格 ( 如图 4-3 所示 ) 用与前面相同的步骤继续编辑子菜单 图 4-2 菜单界面 图 4-3 设计子菜单 6) 插入和删除菜单项 选取要插入选项位置, 按 Ins 键, 目前反白的选项会下移或 右移 选取要删除的选项, 按 Del 键, 目前选项与子菜单选项一并删除 重复 2)~5) 步直到将所有的菜单全部创建完成 (3) 菜单组件事件代码 前面已经提到, 应用程序的功能都是通过菜单来体现的 用户一般也是通过使用应 用程序的菜单来执行其相应的功能 当一个菜单系统利用以上的方法创建完成后只能算 完成了一半, 因为更重要的是要将各个有关的菜单选项与某个要执行的功能联系起来 也就是说当选中了某个菜单选项后能获得响应以便完成相应的功能 实现这一点只有通 过菜单选项组件的 OnClick 事件过程 菜单创建完成后, 所创建的菜单标题将显示在所在的窗体上 单击某一个菜单标题 即可拉下该菜单标题对应的菜单选项 通过单击某一个菜单选项可以打开其相应的 OnClick 事件代码窗体, 用来编写相应的代码 例如, 要在选中 注册 菜单项时, 显示系统的登录界面, 可在它的 OnClick 事件过程写入 : frmlogin->show(); 当然也可以在该事件中进行一些调用的准备工作 例如, 数据的初始化 参数的传递等 (4) 菜单访问键与快捷键一般的菜单标题或菜单选项都具有访问键, 对于一些常用的菜单选项还需要设置快捷键 1) 访问键的设置 在菜单编辑器中选择要加访问键的菜单组件, 在其 Caption 属性框中文本前面或后面输入一个前导字符 &, 再输入要作为访问键的字母 例如 : 在 文件 菜单中想使用 F 作为访问键可在其 Caption 框输入 文件 (&F), 这样当菜单运行时, 它就会变成 文件 (F) 的式样, 用 Alt+F 键即可打开该菜单 注意 : 在同一个菜单标题下, 不能使用相同的访问键, 否则这个访问键不会起作用 2) 快捷键的设置 快捷键用于在不打开菜单的情况下快速执行命令, 一般只对那些使用频繁的菜单选项设置快捷键, 而且快捷键在整个菜单系统中应该是唯一的, 不能出现相同的快捷键

61 94 C++ Builder 6 程序设计教程 快捷键的设置方法是首先选择要设置快捷键的菜单选项, 然后在该菜单项的 ShortCut 属性中选取一个快捷键 ( 通常都是各种组合键 ) 当快捷键设置好后, 在菜单项的右侧就会出现快捷键名称 提示 : 如要删除一个已经设置好的快捷键, 请在 ShortCut 框中选择 None 注意 : 快捷键的设置要符合一般的 Windows 软件的习惯, 不要与已定义的快捷键发 生冲突 例如 :Ctrl+C Ctrl+X Ctrl+V 已经分别用于读者十分熟悉的复制 剪切与粘贴, 那么在应用系统中就不要另作他用 (5) 在运行时设置菜单组件 在 Windows 应用软件的菜单系统中, 菜单选项的表现形式共有六种 ( 直接执行 无 效 弹出对话框 选中 单选和子菜单 ), 分别使用不同的方式来表示 例如 : 暂时无效 的菜单选项是灰色的 在菜单选项前加 表示选中等 另外, 有些菜单下的选项是 动态的, 某些项目有时是可见的, 有时又是隐藏的 所有这些都可以在运行时通过对菜 单组件进行适当的设置来实现 1) 使菜单选项有效或无效 有些菜单命令在执行时需要一定条件, 如果条件不满 足则用户不能选择 例如 : 如果剪贴板上没有内容, 那么 粘贴 命令就不能执行, 其 在菜单上的表现为灰色 此时不仅对鼠标不作响应, 而且键盘的快捷键也同样不起作用 控制菜单组件的 Enabled 属性可以实现此功能 每个菜单组件都有一个 Enabled 属性, 当 Enabled 属性为 True 时, 该菜单选项有效, 否则无效 显然这种设置只能在程序运行 时根据实际情况进行 例如, 在 学生成绩管理系统 的 系统登录 窗体中设置一个公用变量 LoginSucceeded, 当其值为 True 时表示是合法用户, 将 编辑 与 系统维护 菜单置为有效 ; 否则就是非法用户, 对非法用户不允许其进行数据编辑或维护 在菜单编辑器中首先将这两个菜单设置为无效, 然后在 登录 窗体中 确定 按钮的 OnClick 事件过程中输入以下代码 : If (LoginSucceeded) MainForm->mnuEdit->Enabled = True; // 使 编辑 菜单有效 MainForm->mnuSystem->Enabled = True; // 使 系统维护 菜单有效 2) 增减菜单项 菜单组件的 Visible 属性决定了该菜单在运行时是否可见 利用这个属性可以在程序运行时动态地增减菜单项 设计时要将所有的菜单项全部设计完成, 将某个菜单项的 Visible 属性置为 false, 就可以将该菜单项隐藏起来 程序运行时如需要该菜单项显示, 只要将 Visible 属性设为 true 即可 有些情况下, 不仅菜单项的数目是动态的, 而且菜单项的名称也是动态的 ( 如 :Word 软件中 文件 菜单下列出的最近打开的文档列表 ) 显然用上述方法是无法实现这种功能的, 在 C++ Builder 中可使用菜单项的 Add 或 Insert 方法插入菜单项, 利用它可以实现这种要求 关于这一方面的内容请感兴趣的读者参考其他相关资料或 C++ Builder 联机帮助 3) 在菜单项上使用选中标记 有些菜单项本身是一个开关, 打开即执行某项功能, 关闭则不执行 如控制应用程序状态栏的显示 / 关闭, 在菜单项状态栏前加上选中标记 表示状态栏被打开, 去掉 表示状态栏被关闭 利用菜单组件中的 Checked

62 第 4 章菜单与工具栏 95 属性可以实现这一功能, 当 Checked 属性为 true 时表示选中, 将出现在菜单项的左侧 ; 当 Checked 属性为 false 时, 标记即消失, 表示关闭某功能 如 : mnudisplay->checked=! mnudisplay->checked; // 将当前值取反 StatusBar1->Visible=!StatusBar1->Visible; // 状态栏显示 / 关闭通过以上内容的学习, 不难设计出表 4-2 所描述的菜单系统 该菜单系统运行情况 如图 4-4 所示 3. 添加菜单图像 图 4-4 学生成绩管理系统 菜单 C++ Builder 提供了特殊的组件 TImageList ( 位于 Win32 页 ), 专门为 Windows 公共组件保管图像 可以将 TImageList 组件看成是一个保管图像的仓库, 它提供了一份单 一的图像目录, 通过其 Key 属性或 Index 属性就可以引用其中的图像, 提供给 TMainMenu TTreeView TListView 等组件使用 要为 学生成绩管理系统 的主菜单添加图像菜单, 其设计步骤如下 : 1) 打开主窗体, 添加一个 TImageList 组件 2) 双击 TImageList 组件, 打开编辑器, 向 TImageList 组件中添加 删除图像, 如 图 4-5 所示 通过 Add Delete Clear 按钮分别向 TImageList 添加 删除 编辑或清除 图像 C++ Builder 6 自带的图像文件位于 Program Files\Common Files\Borland Shared\Images 目录下, 其 Buttons 子目录下的每幅位图含有一个可使用和一个禁止的图 像, 输入时一分为二, 并可删除其中不需要的部分 3) 将主菜单的 MainMenu1 的 Images 属性设置为 ImageList1, 使主菜单 MainMenu1 与 ImageList1 关联 4) 打开菜单设计器, 选择 文件 菜单项, 将其 ImageIndex 属性值设置为 0, 以 便使用 ImageList1 中索引值为 0 的图像 其他菜单用同样的方法设置 保存工程文件 图 4-5 ImageList 编辑器

63 96 C++ Builder 6 程序设计教程 快捷菜单 大部分 Windows 应用软件都提供快捷菜单 (PopupMenu) 以方便用户的使用, 操作 时单击鼠标右键就可以调出快捷菜单然后选择某一个菜单项, 不需要再将鼠标移到窗体 顶部去打开一层一层的菜单了 快捷菜单也称为弹出式菜单, 它实际上是独立于菜单栏 而显示在窗体上的浮动菜单, 一般而言常将与鼠标所指对象密切相关的操作集中在快捷 菜单中 快捷菜单的设计仍然还是采用菜单编辑器 快捷菜单的内容与鼠标所指的对象相 关 因此, 就需要针对不同窗体的不同对象编制不同的快捷菜单 例 4-2 快捷菜单示例 : 为 节例 3-2 窗体中的 备选课程 列表框编写一 个快捷菜单, 包含两个菜单选项 添加选定 添加全部, 其作用与按钮 添加 和 全 部添加 的功能类似 设计步骤如下 : 1) 打开例 3-2 中的窗体, 添加一个 TPopupMenu 组件 ( 位于 Standard 页 ) 到当前窗体中 2) 双击 TPopupMenu 组件, 从而打开菜单编辑器, 在 TPopupMenu 中添加两个选 项, 其 Caption 分别为 添加选定 与 添加全部,Name 属性为 PopSelected 和 PopAll 设置该快捷菜单的 Name 属性为 poptj 3) 设置组件具有 PopupMenu 功能 若希望鼠标移至特定选项 ( 如列表框 ) 按右键 出现快捷菜单, 则先将此 poptj 编辑完毕, 选择希望具有 PopupMenu 的组件 ( 如列表框 lstkc), 在它的 PopupMenu 属性中填入快捷菜单名称 poptj 4) 编写菜单事件过程 当在弹出的快捷菜单中选择某一项时, 需要调用相应按钮 的功能 实现该功能只需要双击该快捷菜单 poptj, 选中某一个菜单项, 如 添加选定, 然后在 Object Inspector 中单击该菜单项的 Events 页, 选择 OnClick 项, 会出现一个下拉 列表框, 可以选择需要调用的事件 例如 : 选择 添加 按钮的 cmdaddclick, 即可共 享 添加 按钮的事件代码 5) 调试程序并运行 本例运行结果如图 4-6 所示 图 4-6 快捷菜单示例

64 第 4 章菜单与工具栏 97 思考 : 如何为 拟选课程 列表框添加快捷菜单, 使其包含 移除选定 移除全部 菜单选项 状态栏一般的 Windows 软件的主界面底部都有一个状态栏, 用于显示程序执行时的各种状态数据, 如 : 菜单命令的功能介绍 键盘的状态 软件的提示信息等 在 C++ Builder 中也可设计这样类似的状态栏 状态栏的设置是通过 TStatusBar 组件来实现的 1. 状态栏的创建打开需要设置状态栏的主窗体, 选中组件面板的 Win32 页上的 TStatusBar 组件, 然后在窗体的任意位置单击, 则在窗体的底部就会出现一个状态栏 在属性页中将该组件的 Name 属性改成自定义名称如 :stacjgl 状态栏组件由若干个称为 Panel 的对象构成 Panel 对象在状态栏中又称为窗格, 默认只有一个窗格 2. 状态栏的设置状态栏的设置主要包括状态栏的外观设置 创建需要的窗格 设置窗格的属性 例 4-3 为 学生成绩管理系统 主窗体设置含两个窗格的状态栏 第一窗格中显示 欢迎使用学生成绩管理系统!, 第二窗格中显示当前所执行命令的功能介绍 设计的步骤如下 : 1) 打开学生成绩管理系统的主窗体 MainForm, 创建一个名为 stacjgl 的状态栏 2) 右击状态栏组件选择 Panels Editor, 在弹出的 Editing StatusBar1 Panels 对话框中单击工具栏上的 Add New(Ins) 按钮, 如图 4-7 所示 3) 先对第一个 ( 索引值为 0) 窗格进行设置 : 在 Style 框中选择 pstext, 在 Text 框中输入 欢迎使用学生成绩管理系统!,Width 取 200 4) 单击 Add New(Ins) 按钮, 注意此时索引值变成图 4-7 状态栏属性设置了 1, 在 Text 框中输入 无显示 这是一个初始值, 当程序运行时这个窗格的内容需要动态修改 5) 关闭 Editing StatusBar1 Panels 对话框 程序运行后即可在窗体的底部看到状态栏及其文字 3. 在运行中设置状态栏状态栏一般反映程序运行时的一些状态数据, 所以其中相应窗格的内容需要根据实际情况进行动态更新 状态栏包含有一个窗格对象的集合 Panels, 其集合的成员是每个窗格 要引用某个窗格, 可以通过窗格的索引值 Index 例如: 要在第二个窗格中显示 正在登录注册, 可以使用如下语句 :

65 98 C++ Builder 6 程序设计教程 stacjgl->panels->items[1] ->Text=" 正在登录注册 "; 该语句可以放在相应的事件代码过程中 ( 如 : 菜单的 OnClick 事件 工具按钮的 ButtonClick 事件等 ) 本例的运行情况如图 4-8 所示 图 4-8 状态栏运行示例 工具栏工具栏由多个按钮构成, 它提供了对应用程序中最常用命令的快捷访问 每个按钮一般对应菜单中的一项, 按钮上一般都有图片来形象地说明该按钮的作用, 当鼠标指向某个按钮时, 还会出现文本提示以说明该按钮的功能 工具栏中可加入任意种类的组件 除按钮之外, 还可放置其他组件 可以使用以下方法来将工具栏加到窗体中 : 1) 在窗体中放置面板 (TPanel) 组件并在其中添加组件 ( 一般为快捷按钮 ) 2) 使用工具栏组件 (TToolBar) 代替 TPanel, 并在其中添加组件 1. 使用面板组件创建工具栏使用面板组件 TPanel 将工具栏加入窗体的步骤如下 : 1) 从组件面板的 Standard 页把一个面板组件 TPanel 加入窗体 2) 将面板的 Align 属性设为 altop, 对齐窗体的顶端, 这样即使窗体的尺寸发生变化, 其宽度也会始终完全匹配窗体客户区宽度, 而高度保持不变 3) 把快捷按钮 TSpeedButton 或其他组件加入面板中 快捷按钮的属性设置 ( 如添加图像 ) 及使用方法参见 节 通过按钮的 GroupIndex 可以创建成组的快捷按钮 2. 使用工具栏组件创建工具栏工具栏组件 (TToolBar) 提供了面板组件所没有的按钮管理和显示特性 使用工具栏组件将工具栏加入窗体的设计步骤如下 : 1) 从 Win32 页中将工具栏组件 TToolBar 加入到窗体顶端 2) 添加工具按钮或其他组件加到工具栏中 在工具栏上右击并选择 New Button 添加一个工具按钮, 选择 New Separator 将添加一个分隔符, 以便使按钮根据其功能成组 3) 给工具按钮分配图像 每个工具按钮都是用 ImageIndex 属性来确定其运行时显示的图像, 所需的图像从 TImageList 组件中获取,ImageIndex 值与 TImageList 中的图像列表的索引值对应 将工具栏的 Images 属性设置为 TImageList 组件, 每个按钮的 ImageIndex 属性根据其位置自动分配一个值, 可以根据需要修改按钮的 ImageIndex 属性

66 第 4 章菜单与工具栏 99 值 添加工具栏后的 学生成绩管理系统 主窗体如图 4-9 所示 图 4-9 具有工具栏的主窗体 也可以根据需要为工具按钮的被禁用状态或鼠标指针置于其上时的状态分别分配 不同的图像, 通过将不同的图像列表分别分配给工具栏的 DisabledImages 及 HotImages 属性, 使按钮图像在被禁用和激活时各不相同 4) 设置工具按钮外观及初始状态 表 4-2 列出了工具按钮外观相关属性及设置 表 4-2 设置工具按钮外观相关的属性 属性 快捷按钮外观 设置 Down 显示被按下状态 按钮 Down 属性设置为 true Enabled 显示被禁用状态 按钮 Enabled 属性设为 false Indent 包含左边界 工具栏 Indent 属性设为大于 0 的值 Flat 显示具有 弹出式 边界 工具栏 Flat 属性设为 true 5) 创建成组的工具按钮 为创建工具按钮组, 可选择相关的按钮并将它们的 Style 属性设为 tbscheck, 然后将它们的 Grouped 属性设为 true 选择分组中任何按钮时都将使组中其他按钮弹起, 以便提供一组互斥的选择 所有相邻且不间断的且其 Style 属性设为 tbscheck 他 Grouped 属性设为 true 的工具按钮将成为一个分组 就像 TSpeedButton, 使用 AllowAllUp 属性可将一个分组中的工具按钮设为切换按钮 : 单击一次, 按钮被按下 ; 再次单击, 按钮弹起 3. 响应单击事件用户在工具栏上单击按钮, 执行菜单中某个菜单项同样的功能, 可以使菜单与某特定按钮共享相同的单击事件处理代码, 方法为 : 1) 选择工具按钮, 如图 4-9 中的第一个按钮 ( 注册 按钮 ) 2) 在对象查看器中, 定位该按钮的 OnClick 事件列表, 选择已经设计好的 文件 注册 菜单项对应的事件处理过程 这样该工具按钮的操作与对应的菜单项操作一致 4. 隐藏和显示工具栏工具栏不必是始终可见的 实际上, 有许多可用的工具栏只在用户需要时才显示它们, 这种方式常常更加方便 通过将工具栏 面板组件的 Visible 属性设为 false 就可以在运行期间隐藏工具栏, 需要时将该属性设置为 true 就可以显示工具栏

67 100 C++ Builder 6 程序设计教程 还可以提供工具栏的切换 在下例中, 可通过主工具栏的按钮切换一绘图笔的工具栏 每次单击按下或松开该按钮, 在 OnClick 事件处理程序中可根据按钮是按下或弹起的状态来显示或隐藏绘图笔的工具栏 void fastcall TForm1::PenButtonClick(Tobject *Sender) PenBar->Visible = PenButton->Down; 应用 TActionList 组件通过动作列表组件 (TActionList, 位于 Standard 页 ) 实现集中处理对用户命令的响应 ( 动作 ) 动作指的是作用于目标对象的用户命令, 如选中菜单项 一般一个动作对应于用户界面的一个或多个元素, 如菜单命令或工具栏按钮 通过使用动作对象集中处理动作, 从而将应用程序的执行过程与用户界面分离 例 4-4 利用 TRichEdit 设计一个写字板程序, 程序的主菜单中含有一般应用程序都具有的 文件 编辑 帮助 等菜单 要求利用 TActionList 组件实现 编辑 中的剪切 复制 粘贴等功能, 共享 TActionList 组件提供的事件代码 设计方法如下 : 1) 创建一个工程并创建相应的菜单, 在窗体中添加一个 TRichEdit 组件, 并将它的 Align 属性设置为 alclient, 使之充满整个客户区 如果需要还可创建 TToolBar 工具栏 2) 添加动作列表组件 TActionList 到窗体中, 双击动作列表打开 ActionList 编辑器 如图 4-10 所示 3) 添加系统定义的标准行为 在工具栏上单击 New Action(Ins) 按钮列表, 选择 New Standard Action Ctrl+Ins, 打开 Standard Action Classes 对话框, 如图 4-11 所示 按下 Ctrl 键, 用鼠标选择 TFileOpen TFileExit TEditCut TEditCopy TEditPaste 等系统标准行为, 将它们加入 TActionList 中, 加入后的结果见图 4-10 图 4-10 ActionList 编辑器 图 4-11 New Standard Action Classes 4) 使菜单对象与指定系统标准行为关联 所有组件都包括一个公共的属性 Action, 指定组件的行为 分别为 剪切 复制 粘贴 菜单项的 Action 属性设置为 EditCut1 EditCopy1 和 EditPaste1 5) 添加自定义的动作行为 在 ActionList 编辑器中, 执行 New Action Ins, 创建动作行为对象 Action1 设置其 Name 为 ActionTest, 它的 Category 属性为已存在的 Edit( 可

68 以新命名 ), 以便为该行为分类 第 4 章菜单与工具栏 101 6) 为自定义行为 Action1 设置 OnExecute 事件, 指出所要执行的操作 可以从已存 在的事件处理过程中选择一个或建立一个事件处理过程, 如 : RichEdit1->Clear(); 7) 使菜单与自定义行为关联 在编辑菜单下添加一个 清除 菜单项, 将该菜单 项的 Action 属性设置为 ActionTest 由于这时的 Caption 属性被改为 ActionTest, 故需要 重新修改菜单项的 Caption 属性 这样当用户进行剪切 复制 粘贴操作时, 将执行标准的行为动作, 而执行 清除 操作时, 将执行自定义的操作 4.2 界面设计中的基本类 TApplication 类 TApplication 类通过提供属性和方法来封装标准的 Windows 应用, 并由此形成 Windows 应用程序的基础 TApplication 是一个典型的运行期组件, 只能在运行时使用 它 使用 C++ Builder 编写的应用程序是由 TApplication 对象控制的 在所有基于可视化组件 (VCL) 的 Windows 应用程序中都有 TApplication 类的全局变量 Application Application 与应用程序封装在一起, 提供创建应用程序主窗体 处理消息 处理上下文帮助和异常等 在创建工程时, 可以通过 Project Options 菜单项的 Application 选项卡设置 TApplication 的一些属性 1. TApplication 类主要属性 Active 属性 当应用程序拥有当前的输入焦点时,Active 属性为 true, 否则为 false ExeName 属性 该属性返回应用程序的全路径和文件名, 只读属性 下面的代码将 ExeName 属性的值显示在主窗体的标题栏上 Application->MainForm->Caption = Application->ExeName; MainForm 属性 该属性指定了作为主窗体的窗体, 其类型为 TForm MainForm 是一个只读属性, 只能在设计时通过 Project Options 对话框中的 Forms 选项卡把一个窗体指定为主窗体 Icon 属性和 Title 属性 Icon 属性用于设置当应用程序最小化时代表应用程序的图标, 可以修改 Icon 属性来改变应用程序的图标 Title 属性指定应用程序在任务栏和任务管理器中显示的字符串 HelpFile 属性 HelpFile 属性用于指定帮助文件的文件名 需要向 TApplication 的 HelpContext 方法以及其他类似的方法传递帮助文件的文件名 2. TApplication 主要方法 1)ProcessMessages 方法 其原型为 :

69 102 C++ Builder 6 程序设计教程 void fastcall ProcessMessages(void); ProcessMessages 用于从 Windows 消息队列中检索任何等待处理的消息并进行处理 如果程序正在执行一个很长的循环而又不希望中断其他代码的执行 ( 诸如响应 取消 按钮 ), 这时候就要用到 ProcessMessages 方法 2)MessageBox 方法 其原型为 : int fastcall MessageBox(const char * Text, const char * Caption, int Flags = MB_OK); MessageBox 方法用来打开一个 Windows 消息框 3)Minimize 方法 其原型为 : void fastcall Minimize(void); Minimize 方法用来把应用程序的主窗体最小化 4)Restore 方法 其原型为 : void fastcall Restore(void); Restore 方法用来把应用程序的主窗体恢复成最大化或最小化之前的大小 5)Terminate 方法 其原型为 : void fastcall Terminate(void); Terminate 用于终止应用程序的执行, 如 : Application->Terminate(); 3. TApplication 主要事件 OnActivate 和 OnDeactivate 事件 当应用程序被激活时将触发 OnActivate 事件 当应用程序被挂起 ( 例如切换到其他应用程序 ) 时, 将触发 OnDeactivate 事件 OnException 事件 当一个未处理的异常发生时, 将触发 OnException 事件 用户可以为未处理的异常添加默认处理过程 OnHelp 事件 当用户请求帮助的时候将触发 OnHelp 事件 如用户按下 F1 键或程序调用 HelpCommand HelpContext 或 HelpJump 方法 OnMessage 事件 当应用程序接收到一个消息时将触发 OnMessage 事件 特别要注意, 所有的消息都会触发这个事件 OnHint 事件 当鼠标指向某个组件时将触发 OnHint 事件, 这样就可以显示提示信息 以下代码创建了 OnHint 事件处理句柄, 规定由当前对象的 DisplayHint 方法处理 OnHint 事件, 所有提示信息将显示在状态栏上 void fastcall TForm1::FormCreate(TObject *Sender) Application->OnHint = DisplayHint; void fastcall TForm1::DisplayHint(TObject * Sender) StatusBar1->SimpleText = GetLongHint(Application->Hint);

70 第 4 章菜单与工具栏 TScreen 组件类当 C++ Builder 应用程序运行时, 要创建一个类型为 TScreen 的全局变量 Screen Screen 封装了应用程序运行时所在的屏幕状态 TScreen 类的主要属性如表 4-3 所示 表 4-3 TScreen 类的主要属性 属性名称意义 ActiveControl ActiveForm Cursor Cursors Fonts FormCount Forms HintFont 返回屏幕上当前活动的组件, 只读属性 返回当前活动的窗体 用来指定整个应用程序使用的光标 保存当前应用程序所支持的各种光标 可以直接指定应用程序使用的光标, 如 :Screen->Cursor=Screen->Cursors[3]; 返回应用程序支持的字体名称列表, 只读 返回应用程序当前已建立的窗体个数 应用程序当前已建立的窗体组成的数组, 序号从 0 开始 用于指定提示窗体的字体 例如, 使用下列代码, 在窗体创建时获取系统已安装的字体列表 : void fastcall TForm1::FormCreate(TObject *Sender) ComboBox1->Items=Screen->Fonts; 4.3 多文档应用程序 多文档 MDI(multiple document interface) 应用程序由一个父窗体和多个子窗体构成, 它允许用户同时显示多个文档, 每个文档显示在一个子窗体中 每个子窗体均被限制在父窗体中, 当子窗体最小化后将以图标的形式显示在父窗体中, 而不会出现在任务栏中 当子窗体最大化时, 它只能充满整个父窗体, 而不会充满整个屏幕, 在任务栏中出现的仅有父窗体 单文档和多文档 1. Windows 应用程序的基本类型在 Windows 中, 有两种应用程序, 一种是一个主界面内同一时间只能打开一个文档, 比如 : 画图板 记事本等都是属于这一类的应用程序, 这种应用程序被称为 SDI 应用程序 ; 另一种可以在主界面中同一时间打开多个文档, 如 Excel Word 等都属于这一类应用程序, 这种应用程序被称为 MDI 应用程序 2. 单文档和多文档用户界面单文档 SDI(single document interface) 界面是由 SDI 应用程序生成的文档窗体, 在

71 104 C++ Builder 6 程序设计教程 同一时间只允许打开一个窗体 生成一个单文档应用程序框架的步骤如下 : 1) 选择 File New Other 菜单项, 打开 New Items 对话框 2) 选择 Projects 选项卡, 双击 SDI Application 图标 3) 设置应用程序存放的目录, 单击 OK 按钮, 即可生成一个单文档应用程序框架 多文档 MDI(multiple document interface) 界面是由 MDI 应用程序生成的界面 多文档应用程序可同时打开多个文档, 它简化了文档之间的信息交换过程 生成一个多文档应用程序框架的步骤如下 : 1) 选择 File New Other 菜单项, 打开 New Items 对话框 2) 单击 Projects 选项卡, 双击 MDI Application 图标 3) 设置应用程序存放的目录, 单击 OK 按钮, 即可生成一个多文档应用程序框架 图 4-12 一个典型的 MDI 程序一个典型的 MDI 程序如图 4-12 所示 多文档用户界面设计一个 MDI 程序至少应包含两种类型的窗体 : 一种是 父 窗体, 其 FormStyle 属性应当设为 fsmdiform; 另一种是 子 窗体, 其 FormStyle 属性应当设为 fsmdichild 如果 FormStyle 属性为 fsnormal, 则该窗体既不是 父 窗体, 也不是 子 窗体 一个 MDI 程序只能有一个父窗体, 但可以有多个子窗体, 且子窗体的类型可以不同 1. MDI 父窗体及其子窗体的创建 1)MDI 父窗体的创建 把一个窗体的 FormStyle 属性设为 fsmdiform, 这个窗体便成为父窗体 一般而言, 父窗体总是在程序启动时显示的第一个窗体, 所以, 需要将父窗体设为第一个启动窗体 这可以通过 Project Options 对话框实现 例如 : 将 学生成绩管理系统 的主窗体 FormStyle 属性的值设为 fsmdiform, 则该窗体将成为一个 MDI 父窗体, 如图 4-13 所示 图 4-13 学生成绩管理系统 的父窗体 2)MDI 子窗体的创建 当 MDI 父窗体创建完成后, 即可创建其子窗体 子窗体可 以是一个新建的窗体, 也可以是一个已经存在的窗体 只要将已经存在的窗体的

72 第 4 章菜单与工具栏 105 FormStyle 属性设置为 fsmdichild 即可变成子窗体 与普通窗体的设计过程一样, 子窗 体上可以添加各种组件 设置属性 编写事件代码等 对于一个应用程序而言, 除了父窗体以外, 其他窗体并不一定是子窗体, 它们也可 以是标准的非 MDI 窗体, 如关于 (About) 对话框 此时, 这些窗体的 FormStyle 属性 为 fsnormal 3)MDI 子窗体的动态创建 可以在程序运行过程中动态创建子窗体, 这时需要 : 1 先建立好一个 MDI 子窗体, 该子窗体将作为运行时创建的子窗体的模板 2 在父窗体中用 #include 语句包含该子窗体的.h 文件, 或使用 File Include Unit Hdr 将该子窗体的.h 文件包含到父窗体 3 编写相关菜单项的事件处理程序 形式如下 : TMDIChild *Child; // 创建一个新的子窗体,TMDIChild 是预先创建的子窗体 Child = new TMDIChild(Application); Child->Caption = Name; // 设置窗体的标题 (Name 变量 ) 子窗体创建成功后, 将立刻显示在父窗体中 2. MDI 窗体的显示 MDI 父窗体作为应用程序的主窗体, 在运行时会自动作为第一个窗体显示出来 对于子窗体, 既可以在应用程序启动时创建, 也可以在运行期动态创建并显示, 如 : void fastcall TStuMainForm::CreateMDIChild(String Name) TStuReg *Child; Child = new TStuReg(Application); Child->Caption = Name; void fastcall TStuMainForm::mnuFile_LoginClick(TObject *Sender) CreateMDIChild(" 学生注册 " + IntToStr(MDIChildCount+1)); 在上例 MDI 父窗体中, 文件 菜单上的 注册 命令用来创建子窗体的实例 CreateMDIChild 首先声明一个 TStuReg 类型 (TStuReg 是子窗体的名字 ) 的变量, 然后创建 TStuReg 类型的一个实例, 并把它赋给 Child 变量, 最后设置这个子窗体的标题 在父窗体中可以直接调用子窗体的 Show 方法显示一个子窗体, 如 FormQuery-> Show() 但不能将 MDI 子窗体或者 MDI 窗体显示为模式窗体, 即在使用时不能用 ShowModal 方法显示窗体

73 106 C++ Builder 6 程序设计教程 3. MDI 窗体的关闭 MDI 窗体的关闭和一般窗体的关闭类似 比如子窗体的关闭可以由下列程序实现 : Void fastcall TForm1::Button1Click(TObject *Sender) for(int i = MDIChildCount-1; i >= 0; i--) MDIChildren[i]->Close(); 上述程序将所有子窗体一起关闭 注意 : 在运行过程中要关闭子窗体, 还应在子窗体的 OnClose 事件处理中写入以下语句 : Action = cafree; 窗体的关闭, 有一个问题需要考虑 : 由于 MDI 子窗体属于 MDI 父窗体, 所以当关闭 MDI 父窗体时, 其包含的所有子窗体将一并关闭 这样有可能造成在窗体关闭之前, 子窗体中的信息根本没有来得及保存 那么如何避免这种情况的发生呢? 在 3.5 节的窗体的运行中介绍过窗体的 OnCloseQuery 事件, 该事件会在窗体关闭时触发, 利用它可以提供一个保存窗体信息的机会 实际上在 MDI 窗体中也有该事件, 它的触发过程是 : 当 MDI 父窗体关闭时,MDI 父窗体首先触发 OnCloseQuery 事件, 然后每一个打开的子窗体也都触发该事件 如果在 OnCloseQuery 事件中没有代码, 则将关闭每一个子窗体, 最后关闭 MDI 父窗体 因此利用 OnCloseQuery 事件就可以解决上述的问题 具体思路可以是 : 1) 为每个子窗体设置一个公用变量, 用来记录该窗体中的信息改变情况 如 : 在子窗体的声明部分加上 : public: bool bolsaveflag; 2) 根据窗体上的信息变化情况设置该公用变量的值 当某些组件的信息改变后, 在相关的事件过程中 ( 如文本框的 OnChange 事件 ) 置 bolsaveflag 为 True, 而当窗体上的信息保存后 ( 如单击 保存 按钮 ) 则在保存的事件过程中将该标志置为 False 3) 在 MDI 窗体的 OnCloseQuery 事件的处理中判断 bolsaveflag 的值以确定是否需要提醒用户保存数据 例如, 可以在 OnCloseQuery 事件输入如下代码 : void fastcall TStuReg::FormCloseQuery(TObject *Sender, bool &CanClose) if(bolsaveflag) if (MessageDlg(" 需要保存修改信息吗?", mtconfirmation, TMsgDlgButtons() << mbok << mbcancel,0)!= mrcancel) FileSaveClick(this);// 调用保存信息操作 如无, 该操作需要自行编写 有些组件中含有相应的属性 ( 如 TMemo 组件的 Modified 属性 ) 用来保存当前数据被修改的情况, 这时直接判断该属性就可以了

74 第 4 章菜单与工具栏 MDI 父窗体的属性和方法 1. MDI 的主要属性 WindowMenu 属性 该属性指定用以列出当前打开的文档所属的菜单栏名, 并能通 过此功能对打开的文档进行切换 例如 : 要在主菜单的 窗体 菜单栏下列出已打开的 文档, 需要把主窗体的 WindowMenu 属性设为 窗体 ActiveMDIChild 属性 通过该属性可获得当前活动的子窗体, 是只读属性 MDIChildren 和 MDIChildCount 属性 MDIChildren 属性是一个保存所有子窗体的 数组, 下标从 0 开始, 元素为 TForm 类型, 记录子窗体的对象实例 在数组中子窗体的 保存顺序与其生成次序相反, 即 MDIChildren[0] 返回最后一个生成的子窗体 MDIChildCount 属性记录子窗体的个数 以下代码将关闭所有子窗体 : for(int i = MDIChildCount-1; i >= 0; i--) MDIChildren[i]->Close(); 2. MDI 的主要方法 1)Next 和 Previous 这两个方法用来设置将要获得焦点的子窗体 Next 将焦点移到下一个子窗体,Previous 则相反 2)Cascade 排列子窗体, 使所有子窗体重叠显示 3)Tile 排列子窗体, 使所有子窗体水平或垂直平辅 在使用该方法之前先设置 MDI 窗体的 TileMode 属性, 以决定平辅模式 平辅模式有两种 :tbhorizontal( 水平 ) tbvertical( 垂直 ) 如: TileMode = tbvertical; Tile(); 4)ArrangeIcons 该方法用以排列已最小化的子窗体的图标 创建应用程序主菜单与子菜单融合 父窗体的菜单应作为应用程序的主菜单 如果子窗体有菜单, 则当子窗体在运行中获得焦点并最大化时, 子窗体的菜单项将融合到父窗体菜单, 即子窗体的菜单将插入主窗体的菜单中, 或将替换部分或全部的父窗体菜单 进行菜单融合需设置的两个属性 : 窗体的 Menu 属性和菜单项的 GroupIndex 属性 Menu 属性定义窗体的活动菜单, 而菜单融合只对活动菜单进行 如果窗体有多个菜单组件, 运行时可通过以下代码改变当前窗体使用的菜单 : Form1->Menu = SecondMenu; GroupIndex 属性决定出现在菜单条中各菜单项的位置, 在菜单融合中,GroupIndex 将决定融合菜单是插入还是替换主窗体菜单条中的菜单 GroupIndex 的默认值是 0, 可以用以下规则确定其值 : 1) 数值越小, 菜单的位置越靠左 例如 :GroupIndex 为 0 的菜单将出现在菜单条中的最左端 随着 GroupIndex 数值的增大, 菜单项依次向右排列

75 108 C++ Builder 6 程序设计教程 2) 若需替换主菜单中的某一菜单项, 则将子菜单相应菜单项的 GroupIndex 设为与之相等的值 这条规则适合一个或多个菜单项 例如, 主菜单中的 Edit 菜单项的 GroupIndex 的值为 1 将子菜单的一个或多个菜单项的 GroupIndex 的值设为 1, 则在运行时, 这些菜单项替换主窗体的 Edit 菜单 将同一窗体的多个菜单项的 GroupIndex 设为相同值, 原有的排列顺序在菜单融合时将保持不变 3) 若要在菜单融合时插入菜单项, 需在主菜单中预留数值 位置 例如, 主菜单的两菜单项数值为 0 5, 则子菜单 GroupIndex 数值为 的菜单在融合时将插入其中 多文档用户界面设计实例 例 4-5 学生成绩管理系统的多文档用户界面设计 1) 基本要求 : 本例中以学生成绩管理系统为父窗体 以学生信息注册界面为子窗体, 即在打开 文件 注册 菜单后, 会有子窗体弹出, 用来编辑录入注册信息 学生信息注册界面 布局如图 4-14 所示 图 4-14 学生信息注册界面 子窗体 2) 设计步骤 : 1 以 节设计的 学生成绩管理系统 菜单界面为基础, 将其设为父窗体, 设置该窗体的 FormStyle 属性值为 fsmdiform 2 添加 3.7 节的例子 : 学生基本信息录入界面, 将其 Caption 属性改为学生注册 ; 并设置其 FormStyle 属性值为 fsmdichild 3 在父窗体 文件 注册 菜单响应方法中编写处理程序, 用来实现子窗体的创建 4 添加 OnCloseQuery 事件的处理过程 3) 相关代码如下 : // 添加对父窗体 文件 注册 菜单的响应

76 第 4 章菜单与工具栏 109 void fastcall TStuMainForm::CreateMDIChild(String Name) TStuReg *Child; Child = new TStuReg(Application); Child->Caption = Name; void fastcall TStuMainForm::fileRegClick(TObject *Sender) CreateMDIChild(" 学生注册 " + IntToStr(MDIChildCount+1)); // 在子窗体添加 OnCloseQuery 事件的处理过程 void fastcall TStuReg::FormCloseQuery(TObject *Sender, bool &CanClose) if(bolsaveflag) if(messagedlg(" 需要保存修改信息吗?", mtconfirmation, TMsgDlgButtons() << mbok << mbcancel,0)!= mrcancel) FileSaveClick(this); // 调用保存信息操作 如无, 需要自行编写 // 在子窗体添加 OnClose 事件的处理 void fastcall TStuReg::FormClose(TObject *Sender, TCloseAction &Action) Action = cafree; 4) 运行结果如图 4-15 所示 图 4-15 学生信息注册界面 子窗体

77 110 C++ Builder 6 程序设计教程 本章小结 1. 定制应用程序界面应用程序的主窗体是应用程序运行时第一个出现的窗体, 可以根据需要更改主窗体 一个窗体可以在程序启动时创建, 也可在运行时创建 2. 菜单的规划与设计菜单由菜单栏 菜单标题 菜单项 子菜单组成 通过菜单设计器设计菜单, 并可在菜单上添加图像 3. 状态栏和工具栏通过 TStatusBar 组件可以创建一个状态栏, 程序运行时的状态可以反映在状态栏上 通过工具栏可以实现快捷操作 工具栏可用 TPanel 组件创建, 也可用 TToolBar 组件创建 工具按钮或快速按钮可以共享对应菜单的单击事件 通过 TActionList 组件可以共享一组系统标准的行为动作 4. 界面设计中的基本类利用 TApplication 类可以获取和控制应用程序运行过程中的信息 ; 利用 TScreen 组件可获取运行环境中屏幕的相关信息 5. 多文档应用程序多文档 MDI(multiple document interface) 应用程序由一个父窗体和多个子窗体构成, 它允许用户同时显示多个文档, 每个文档显示在一个子窗体中 将窗体的 FormStyle 属性值设为 fsmdiform, 该窗体就成为 MDI 父窗体 将窗体的 FormStyle 属性值设为 fsmdichild, 该窗体将成为子窗体 MDI 父窗体的主要属性有 :ActiveMDIChild WindowMenu MDIChildren MDIChildCount 通过设置窗体的 Menu 属性和菜单项的 GroupIndex 属性, 可以实现应用程序主菜单与子菜单的融合 习题 默认情况下, 哪一个窗体会成为工程运行时产生的第一个窗体? 如何手动设置运行时第一个产生的窗体? 4-2 菜单分成哪两种? 设计菜单时用到的一个关键工具是什么? 4-3 状态栏中如何显示当前日期和时间? 试编写代码实现 4-4 工具栏的显示和隐藏, 其实质是该组件的什么属性被改变了? 4-5 在多文档程序设计中, 父窗体和子窗体在属性上最大的不同是什么? 4-6 在多文档应用程序中, 启动程序时同时生成父窗体和子窗体 不编程, 如何实现?

78 第 4 章菜单与工具栏 菜单组件与普通组件有何异同? 如何编写菜单组件的事件过程? 4-8 什么是快捷菜单? 它与普通菜单有何不同? 如何显示快捷菜单? 4-9 OnMouseDown 事件和 OnMouseUp 事件何时被引发? 它们与 OnClick 事件有 何不同? 如何利用这两个事件来显示弹出式菜单? 4-10 如何将 TImageList 组件中的图像与工具栏组件中的按钮联系起来? 4-11 如何在状态栏中反映当前所执行的菜单命令? 4-12 在 MDI 窗体卸载时, 如何及时保存子窗体中的信息? 4-13 OnCloseQuery 事件在什么时候被触发? 有何用途? 4-14 完成例 4-4, 使之成为一个多文档应用程序 4-15 设计两个窗体 fstform 和 sndform, 以 fstform 为启动窗体, 程序运行后, 单 击窗体 fstform, 则卸载 fstform, 然后显示窗体 sndform; 若用户单击 sndform 窗体, 则显示 fstform, 然后卸载 sndform 4-16 设计一个符合以下要求的应用程序界面 要求 : (1) 按表 4-4 要求设计菜单和快捷按钮 表 4-4 应用程序中的菜单 菜单级别 标题 名称 快捷键 状态 工具栏按钮 主菜单项 文件 (&F) mnufile 一级子菜单 打开 (&O) mnuopen Ctrl+O 有 一级子菜单 设置 (&S) mnuset 二级子菜单 字体 (&F) mnufont Ctrl+F 有 二级子菜单 颜色 (&C) mnucolor 有 一级子菜单 - mnuspbar1 一级子菜单 退出 (&X) mnuexit F4 主菜单项 编辑 (&E) mnuedit 一级子菜单 剪切 (&T) mnucut Ctrl+X 无效 ( 灰色 ) 有 一级子菜单 复制 (&C) mnucopy Ctrl+C 无效 有 一级子菜单 粘贴 (&P) mnupaste Ctrl+V 无效 有 主菜单项 帮助 (&H) mnuhelp 一级子菜单 关于 (&A) mnuabout (2) 工具栏上的快捷按钮与相应的菜单项的事件代码一致, 并对窗体中的 TRichEdit 组件执行相应操作 (3) 当用户选中某菜单项或快捷按钮进行操作时, 将该操作的状态显示在状态栏左侧的窗格上 4-17 按下列要求设计由一个 MDI 窗体和三个 MDI 子窗体组成的 MDI 应用程序界面 要求 : (1) 执行 层叠 平铺 排列图标 子菜单项时, 三个 MDI 子窗体分别按要求排列 ;

79 112 C++ Builder 6 程序设计教程 (2) 单击分隔条下方的某 MDI 子窗体名称时, 该窗体名前出现, 同时该窗体被激活 ; (3) 单击某 MDI 子窗体的任意位置时, 该窗体被激活, 同时菜单中该窗体名前出现 ( 要求只有一个菜单中 MDI 子窗体名称前出现 )

80 第 5 章文件管理 一般情况下, 对文件的处理由操作系统的文件系统来完成 任何一种应用程序一般总要对其相关的文件进行各种各样的处理, 为了提高应用程序的开发效率,C++ Builder 提供了强大的对文件系统的支持 在程序中可以使用文件管理组件或通用对话框来交互式地打开文件 保存文件, 同时某些组件本身也提供了相关方法来对文件进行输入 / 输出操作, 应用程序中也可以直接编程对文件进行操作 5.1 文件管理组件 在应用程序中, 经常要对文件进行各种各样的操作, 如 : 打开文件 创建文件 确定文件的位置等 实现这样的操作首先要了解有关驱动器 目录及文件的相关信息 为此 C++ Builder 提供了驱动器列表框 (TDriveComboBox) 目录列表框(TDirectoryListBox) 文件列表框 (TFileListBox) 文件过滤器(TFilterComboBox) 四个组件用于实现这些功能 这些组件均位于 Win3.1 页中 驱动器组件 TDriveComboBox 要查找定位一个文件必须知道三个要素 : 驱动器 路径与文件名, 与其对应的三个文件管理组件可以满足这些需要, 如图 5-1 所示 TEdit TDirectoryListBox TFileListBox TFilterComboBox TDriveComboBox 图 5-1 文件管理组件运行示例 驱动器 组件是一个下拉式列表框, 用于指定或显示当前驱动器 运行时, 在默认情况下只显示当前驱动器的名称, 单击下拉箭头即会显示本地计算机上所有的驱动器, 可以选择所需要的驱动器, 也可以直接输入有效的驱动器字母来实现选择 新的驱动器一旦选定, 该驱动器名称将出现在列表框中的顶端 ( 如图 5-1 所示 ) 1. 常用属性 驱动器组件有以下两个常用属性 : 1)DirList 属性 该属性用于指定驱动器组件对应的目录列表组件, 使目录列表框

81 114 C++ Builder 6 程序设计教程 组件的驱动器与驱动器组件的当前驱动器相关联 可以在对象查看器中设置或通过以下 代码设置 : DriveComboBox1->DirList= DirectoryListBox1; 2)Drive 属性 该属性是运行时可以访问的属性, 用于设置或返回当前选择的驱动 器字母 以下代码用来设置当前驱动器为 D: DriveComboBox1->Drive='D'; 2. 常用事件 驱动器组件的常用事件是 OnChange 事件, 每当用户选择或指定了一个新的驱动器 后, 就会引发该事件 由于一般驱动器列表框组件都不是单独使用的, 它常常与目录列表框及文件列表框配合使用, 因此在运行时必须根据用户的选择对目录列表框与文件列表框进行更新, 以保持一致 可以在该事件中通过返回的 Drive 属性来更新其他两个组件 由于该组件提供的 DirList 属性可以实现这一功能, 所以一般不需要在事件中编码 ( 其他几个组件也有相同的事件, 但通常都不使用 ) 目录列表框组件 TDirectoryListBox 目录列表框主要是用于显示当前或指定的驱动器上的目录结构, 它是一个列表框 显示时从根目录开始, 各子目录按层次结构依次缩进, 类似于 Windows 98 中的 打开文件 对话框 利用单击或光标键的移动可以选择某个目录, 双击目录会打开该目录下的所有子目录 常用属性如下 : 1)FileList 属性 该属性用来指定目录列表框所关联的文件列表框, 使得文件列表框的目录与目录列表框的当前目录关联 如 : DirectoryListBox1->FileList=FileListBox1; 2)DirLabel 属性 该属性用来记录当前目录的路径, 可以设置一个 TLabel 组件与之关联, 当当前路径发生变化时, 自动更新 TLabel 组件的 Caption 属性, 如 : DirectoryListBox1->DirLabel=lblPath; 3)Drive 和 Directory 属性 这两个属性都是运行时可以访问的属性 Drive 属性用于设置或返回当前选中的驱动器,Directory 属性用于设置或返回当前选中的目录 目录列表框中对路径的改变并不能改变系统的当前目录 TDirectoryListBox 是从 TCustomListBox 继承而来的, 因此它可以使用 TListBox 的部分属性 如想了解目录列表框当前显示的目录下有多少直接的子目录, 可以访问目录列表框的 Count 属性 文件列表框组件 TFileListBox 驱动器列表框与目录列表框可以定位文件所在的磁盘与路径, 但要显示所需要的文件就得借助于文件列表框了 文件列表框 (TFileListBox) 是一种列表框, 用于显示当前目录中的所有文件或指定文件的清单 常用属性如下 : 1)FileEdit 属性 该属性用于指定文件列表框的文件名编辑框, 使编辑框中显示的文件名与文件列表框中选定的文件关联, 也可以在编辑框中指定要查找的文件名, 且可

82 以使用通配符 第 5 章文件管理 115 2)MultiSelect 属性 该属性取值为 true 时, 允许在文件列表框中同时选定多个文件 3)Drive 属性 运行时可以访问该属性, 返回当前选中的文件所在的驱动器 4)Directory 属性 运行时可以访问该属性, 返回当前选中的文件所在的目录路径 5)FileName 属性 运行时可以访问该属性, 返回当前选中的文件名 6)FileType 属性 这是一个数组属性, 用于设置是否允许在文件列表框中显示指定 属性的文件 属性的取值可以是 :ftreadonly fthidden ftsystem ftvolumeid ftdirectory ftarchive ftnormal, 分别表示文件的属性为只读 隐含 系统 卷标 目录 归档 普 通 值为 true 时显示相应属性的文件 文件过滤器组件 TFilterComboBox TFilterComboBox 组件是一个下拉列表框, 用于显示指定模式的文件 默认时, 文 件列表框将显示当前目录中的所有文件, 即其值为 *.* 如果需要显示指定模式的文件可以改变 TFilterComboBox 的 Filter 属性的值, 该属 性支持通配符 * 和? 例如 : *.txt 显示所有的.txt 文件 ; *.c;*.frm 显示所有的.c 文件和.frm 文件 Filter 属性既可以在设计时设置, 也可以在运行时设置 如 : FilterComboBox1->Filter = "All files (*.*) *.* Header files (*.h;*.hpp) *.h;*.hpp"; TFilterComboBox 组件的另一个常用属性是 FileList, 用来指定与文件过滤器关联的文件列表框名, 使文件列表框的文件类型与过滤器当前的设置类型一致 例 5-1 利用文件管理组件按图 5-1 的界面设计一个文件打开对话框, 打开的文本文件内容显示在 TMemo 组件 ( 在界面上添加该组件 ) 中 设计步骤 : 1) 新建一个窗体, 根据图 5-1 所示的界面添加所需的组件 2) 设置组件的属性 按表 5-1 设置文件管理组件的主要属性 表 5-1 例 5-1 中组件的属性设置 组件名属性名称取值 TDriveComboBox DirList DirectoryListBox1 TDirectoryListBox FileList FileListBox1 TFileListBox FileEdit Edit1 TFilterComboBox Filter FileList Text files(*.txt) *.txt All files(*.*) *.* FileListBox1 3) 编写事件处理代码 为 确定 按钮设计单击事件处理代码, 在 TMemo 组件中显示选中的文本 : void fastcall TForm1::ButtonOKClick(TObject *Sender) Memo1->Lines->LoadFromFile(FileListBox1->FileName);

83 116 C++ Builder 6 程序设计教程 为 TFileListBox 组件的双击事件 OnDblClick 事件设计处理代码, 以便在 TFileListBox 组件中双击所选的文件时, 显示该文件 因它的功能与 确定 按钮的单击事件功能相同, 可以共享同一事件, 即在对象查看器的事件页上使 OnDblClick 事件处理函数使用 确定 按钮的单击事件处理函数 ButtonOKClick 5.2 文件及其处理 文件系统组件只是解决了文件的定位与查找问题, 在实际的应用程序编写中, 还需要对文件进行各种各样的操作 如 : 文件的创建或打开 文件的读写 文件的关闭等 文件的分类有多种方式, 比如 : 缓冲文件和非缓冲文件 ; 二进制文件和文本文件等 在 C 语言中, 把文件看作是一个字节流, 根据数据的组织形式, 可分为两种文件类型 : 二进制文件和文本文件 在 C++ Builder 中, 可以使用多种方法对文件进行操作 : 基于 ANSI C 中的文件操作 基于 C++ 的文件操作 基于 Windows API 的文件操作和基于 C++ Builder 库的文件操作 本节主要介绍基于 BCB(Borland C++ Builder) 库的文件操作 事实上无论何种类型的文件, 文件的处理步骤基本都是 : 1) 打开文件 2) 读写文件 3) 关闭文件 C++ Builder 提供的文件操作函数中, 可分为三种类型 : 文件 I/O 函数 文件名函数 文件管理函数, 这些函数使用很方便 要使用这些函数, 需在头文件中包含 SysUtils.hpp 文件 文件 I/O 函数文件 I/O 函数完成对文件的读写相关的操作, 表 5-2 列出这类操作常用的函数及其功能 表 5-2 文件 I/O 函数 函数功能 FileOpen() FileClose() FileRead() FileSeek() FileWrite() FileCreate() 打开文件关闭文件读文件文件定位写文件创建文件 1. FileOpen() 原型 :int fastcall FileOpen(const AnsiString FileName, unsigned Mode); 功能 : 打开文件, 如果成功返回其句柄, 否则返回 -1 参数 :FileName 要打开的文件名

84 第 5 章文件管理 117 Mode 打开的方式, 取值如下表 5-3, 可用 " 或 "(" ") 运算符连接 表 5-3 文件打开方式 常量 值 说明 fmopenread 0 以只读方式打开 fmopenwrite 1 以只写方式打开 fmopenreadwrite 2 以读 / 写方式打开 fmsharecompat 0 兼容 FCB 方式 fmshareexclusive 16 共享方式 : 以独占方式打开 fmsharedenywrite 32 共享方式 : 拒绝写访问 fmsharedenyread 48 共享方式 : 拒绝读访问 fmsharedenynone 64 共享方式 : 无限制, 允许读写 用法 : int i=fileopen("d:\\bcd\\ch06\\readme.txt",fmopenreadwrite fmshareexclusive); 2. FileClose() 原型 :void fastcall FileClose(int Handle); 功能 : 关闭打开的句柄 参数 :Handle 要关闭的句柄用法 :FileClose(i); // 将句柄 i 代表的文件关闭 3. FileRead() 原型 :int fastcall FileRead(int Handle, void *Buffer, unsigned Count); 功能 : 读文件, 返回实际读取的字节数, 句柄必须首先由 FileOpen 或 FileCreate 创建 参数 :Handle 要读取的句柄 Buffer 存放读取的数据的缓冲区 Count 读取的字节数用法 :char buffer[400]; FileRead(hnd1,buffer,400); 4. FileSeek() 原型 :int fastcall FileSeek(int Handle, int Offset, int Origin); 功能 : 移动文件读取指针, 成功返回文件指针的位置, 失败返回 -1 参数 :Handle 相关联的句柄 Offset 移动的量 Origin 起始点,0= 文件头,1= 当前位置,2= 文件尾 用法 :ShowMessage(FileSeek(fd,0,2)); // 取得文件的长度

85 118 C++ Builder 6 程序设计教程 5. FileWrite() 原型 :int fastcall FileWrite(int Handle, const void *Buffer, unsigned Count); 功能 : 写文件, 返回实际写入的字节数, 句柄必须首先由 FileOpen 或 FileCreate 创建 参数 :Handle 要写入的句柄 Buffer 存放写入数据的缓冲区 Count 写入的字节数用法 :char buffer[]="file Test"; FileWrite(fd,buffer,strlen(buffer)); 6. FileCreate() 原型 :int fastcall FileCreate(const AnsiString FileName); 功能 : 创建文件 成功返回其句柄, 否则返回 -1 参数 :FileName 要创建的文件名用法 :if(!fileexists("test.txt")) fd=filecreate("test.txt "); 文件名操作函数通过文件名操作函数可以对文件的名称 所在目录 驱动器和扩展名等进行操作 表 5-4 列出了文件名操作函数及其功能 表 5-4 基于 C++ Builder 文件操作中的文件名操作函数 函数 说明 ExpandFileName() 返回文件的全路径 ( 含驱动器 路径 ) ExtractFileExt() ExtractFileName() ExtractFilePath() ExtractFileDir() ExtractFileDrive() ChangeFileExt() ExpandUNCFileName() ExtractRelativePath() ExtractShortPathName() 从文件名中取扩展名从文件名中取不含路径的文件名从文件名中取路径名从文件名中取目录名从文件名中取驱动器名改变文件的扩展名返回含有网络驱动器的文件全路径从文件名中取相对路径信息把文件名转化为 DOS 的 8.3 格式 1. ExpandFileName() 原型 :AnsiString fastcall ExpandFileName(const AnsiString FileName); 功能 : 返回文件的全路径 ( 含驱动器 路径 ) 参数 :FileName 要处理的文件名用法 :ShowMessage(ExpandFileName(Application->ExeName)); // 显示当前执行的应用程序名, 如 D:\BCB\EXAM06\EXAM06_03.EXE

86 第 5 章文件管理 119 //Application->ExeName 是当前执行的应用程序名 2. ExtractFileExt() 原型 :AnsiString fastcall ExtractFileExt(const AnsiString FileName); 功能 : 从文件名中取扩展名参数 :FileName 要处理的文件名 ( 完整路径 ) 用法 :ShowMessage(ExtractFileExt(Application->ExeName)); // 显示当前执行的程序的扩展名 3. ExtractFileName() 原型 :AnsiString fastcall ExtractFileName(const AnsiString FileName); 功能 : 从文件名中取不含路径的文件名参数 :FileName 要处理的文件名用法 :ShowMessage(ExtractFileName ("C:\\WINNT\\NOTEPAD.EXE")); // 显示当前执行的程序名 :NOTEPAD.EXE 4. ExtractFilePath() 原型 :AnsiString fastcall ExtractFilePath(const AnsiString FileName); 功能 : 从文件名中取路径名参数 :FileName 要处理的文件名用法 :ShowMessage(ExtractFilePath("C:\\WINNT\\NOTEPAD.EXE")); // 显示 C:\WINNT 5. ExtractFileDir() 原型 :AnsiString fastcall ExtractFileDir(const AnsiString FileName); 功能 : 从文件名中取目录名 ( 和上个函数不同, 不包括最后的 "\") 参数 :FileName 要处理的文件名用法 :ShowMessage(ExtractFileDir("C:\\WINNT\\NOTEPAD.EXE ")); // 显示 C:\WINNT, 注意和上个函数的区别 6. ExtractFileDrive() 原型 :AnsiString fastcall ExtractFileDrive(const AnsiString FileName); 功能 : 从文件名中取驱动器名参数 :FileName 要处理的文件名用法 :ShowMessage(ExtractFileDrive("C:\\WINNT\\NOTEPAD.EXE "));// 显示 C: 7. ChangeFileExt() 原型 :System::AnsiString fastcall ChangeFileExt(const System::AnsiString FileName, const System::AnsiString Extension);

87 120 C++ Builder 6 程序设计教程 功能 : 更改文件名的扩展名, 不是对真正的文件进行改名, 只是对文件名这个字符串进行处理 参数 : FileName 要改名的文件名 Extension 新的扩展名用法 :ShowMessage(ChangeFileExt("C:\\WINNT\\NOTEPAD.EXE ",".OOO")); // 显示 "C:\WINNT\NOTEPAD.OOO" 8. ExpandUNCFileName() 原型 :AnsiString fastcall ExpandUNCFileName(const AnsiString FileName); 功能 : 返回含有网络驱动器的文件完整路径, 格式为 :\\ 机器名 \ 共享名 \ 文件名参数 :FileName 要处理的文件名用法 :ShowMessage(ExpandUNCFileName("F:\\DOC\\GUIDE.DOC")); // 如果 F: 是映射的网络驱动器 \\ShareDIR, // 则显示 "\\ ShareDIR\ DOC\GUIDE.DOC " 9. ExtractRelativePath() 原型 :AnsiString fastcall ExtractRelativePath(const AnsiString BaseName, const AnsiString DestName); 功能 : 从文件名中取相对路径信息, 如..\ DOC\GUIDE.DOC 这种形式参数 : BaseName 基准文件名 DestName 目标文件名用法 :ShowMessage(ExtractRelativePath("D:\\BCB\\CH06\\EXAM06_02", "D:\\ BCB\\CH06\\EXAM06_01\\MAIN.CPP")); // 显示 "..\EXAM06_01\MAIN.CPP " 10. ExtractShortPathName() 原型 :AnsiString fastcall ExtractShortPathName(const AnsiString FileName); 功能 : 把文件名转换为 DOS 的 8.3 格式参数 :FileName 要处理的文件名用法 :ShowMessage(ExtractShortPathName("C:\\Program Files\\Microsoft Office \\Office\\EXCEL.EXE")); // 显示 "C:\Progra~1\Micros~4\ Office\EXCEL.EXE " 文件管理函数文件管理函数包括设置和读取驱动器 目录和文件的相关操作, 表 5-5 列出这类操作常用的函数及其功能

88 第 5 章文件管理 121 表 5-5 文件管理函数 函数 CreateDir() DeleteFile() DirectoryExists() DiskFree() DiskSize() FileExists() FileGetAttr() FileGetDate() GetCurrentDir() RemoveDir() SetCurrentDir() 功能创建新的子目录删除文件判断目录是否存在获取磁盘剩余空间获取磁盘容量判断文件是否存在获取文件属性获取文件日期获取当前目录删除目录设置当前目录 例 5-2 文件的处理示例程序 建立一个学生基本信息表数据文件, 基本信息包括姓名 班级 性别和年龄 要求程序中可以 : 1) 浏览文件中的记录 2) 添加记录 3) 修改记录 设计步骤 : 1) 设计程序界面, 界面中三个区域分别用 TBevel( 学生信息 ) 和 TGroupBox( 按钮 ) 组件分隔, 窗体运行后的界面如图 5-2 所示 图 5-2 例 5-2 运行示例 2) 在窗体的.h 文件中定义一个学生基本信息的结构体, 以便访问数据文件中的记录, 并添加窗体类的数据成员和函数, 以用于数据文件的读取 : #ifndef mainh #define mainh #include <Classes.hpp> #include <ExtCtrls.hpp>

89 122 C++ Builder 6 程序设计教程 typedef struct char Name[8]; // 姓名 char ClassName[20]; // 所在班级 int Sex; // 性别 int Age; // 年龄 StudInfo; class TForm1 : public TForm private:// User declarations StudInfo StudentInfo; // 学生记录 int ifile; // 文件句柄 int icurrentrecord; // 当前记录 int ireclen; // 记录长度 void fastcall DispRecord(); // 显示当前记录 3) 编写事件处理代码 : void fastcall TForm1::btnExitClick(TObject *Sender) // 关闭程序 FileClose(iFile); // 关闭文件 Close(); void fastcall TForm1::FormCreate(TObject *Sender) // 窗体初始化 ireclen=sizeof(studinfo); ifile=fileopen("studet.dat",fmopenreadwrite); // 打开文件 if(ifile==-1) // 文件不存在, 创建文件 ifile=filecreate("student.dat",fmopenreadwrite); else FileRead(iFile,&StudentInfo,iRecLen); // 读出第一个记录 DispRecord(); // 显示第一个记录 icurrentrecord=0; // void fastcall TForm1::DispRecord() // 显示当前记录

90 第 5 章文件管理 123 Edit1->Text=StudentInfo.Name; Edit2->Text=StudentInfo.ClassName; Edit3->Text=StudentInfo.Age; RadioGroup1->ItemIndex=StudentInfo.Sex; void fastcall TForm1::btnSaveClick(TObject *Sender) // 保存当前记录 memset(&studentinfo,0,ireclen); // 清除缓冲区 memcpy(studentinfo.name,edit1->text.c_str(),8); memcpy(studentinfo.classname,edit2->text.c_str(),20); StudentInfo.Sex=RadioGroup1->ItemIndex; StudentInfo.Age=StrToInt(Edit3->Text); FileWrite(iFile,&StudentInfo,iRecLen); // 写入文件 btnsave->enabled=false; btnchange->enabled=true; btnappend->enabled=true; btnexit->enabled=true; // 设置按钮状态 btnprior->enabled=true; btnnext->enabled=true; void fastcall TForm1::btnPriorClick(TObject *Sender) // 读取前一条记录 if(icurrentrecord<=0) // 已经在第一条记录 return; FileSeek(iFile,-iRecLen,1); icurrentrecord--; // 读取一条记录 FileRead(iFile,&StudentInfo,iRecLen); FileSeek(iFile,-iRecLen,1); DispRecord(); void fastcall TForm1::btnNextClick(TObject *Sender) // 读取下一条记录 if(fileread(ifile,&studentinfo,ireclen)==ireclen); // 成功读取一个记录 icurrentrecord++; DispRecord(); // 当前显示记录

91 124 C++ Builder 6 程序设计教程 void fastcall TForm1::btnAppendClick(TObject *Sender) int ilength; btnsave->enabled=true; // 设置按钮状态 btnchange->enabled=false; btnappend->enabled=false; btnexit->enabled=true; btnprior->enabled=false; btnnext->enabled=false; Edit1->Text=""; // 初始化编辑框中的数据 Edit2->Text=""; Edit3->Text=""; RadioGroup1->ItemIndex=0; ilength=fileseek(ifile,0,2); // 将文件指针定位到结尾 icurrentrecord=ilength/ireclen; // 当前记录指针位置 void fastcall TForm1::btnChangeClick(TObject *Sender) btnsave->enabled=true; // 设置按钮状态 btnchange->enabled=false; btnappend->enabled=false; btnexit->enabled=true; btnprior->enabled=false; btnnext->enabled=false; 本程序的功能如果用数据库来处理则简单得多 5.3 通过组件直接访问文件 为方便编程,C++ Builder 在很多需要与文件打交道的组件中都提供了直接访问文件的方法, 使用这些方法可以很方便地实现将组件中处理的数据保存到文件, 或从文件中读取数据到组件中 LoadFromFile 和 SaveToFile 就是访问文件的最直接的方法 LoadFromFile 方法 LoadFromFile 方法是从指定的文件中读取数据 原型 :

92 第 5 章文件管理 125 virtual void fastcall LoadFromFile(const AnsiString FileName); 其中 FileName 参数指定文件名和所在路径 TMemo 组件的 Lines 属性是 TStrings 类, 提供了该方法 例如 : Memo1->Lines->LoadFromFile(FileListBox1.FileName); 该语句将文件列表框中 FileName 属性指定的内容读入到 Memo1 组件的 Lines 属性 SaveToFile 方法 SaveToFile 方法是把数据写到指定的文件中 原型 : virtual void fastcall SaveToFile(constAnsiString FileName); 其中 FileName 参数指定文件名和所在路径 例如 : Memo1->Lines->SaveToFile (FileListBox1.FileName); 该语句将 Memo1 组件中的文本数据写入到文件列表框中 FileName 属性指定的文件中 具有 LoadFromFile 和 SaveToFile 方法的常用类 1. TStrings 类 TStrings 类提供的 LoadFromFile 和 SaveToFile 方法可以访问文本文件 因此, 凡是 有 TStrings 类型的属性的组件都可以直接读写文件 如 :TMemo 和 TRichEdit 组件的 Lines 属性,TListBox 组件的 Items 属性等 2. TGraphic 类 TGraphic 类是许多处理图形数据类的基类 在 TGraphic 类中提供的 LoadFromFile 和 SaveToFile 方法只是虚方法, 并不能实现图形文件的存取 但是其派生类 ( 如 :TBitmap TIcon TJpegImage 等 ) 都重载了这两个方法, 以处理不同格式的图形文件 3. TPicture 类 TPicture 类在读取和保存文件时, 能自动根据文件的扩展名调用不同的类方法处理 如 ( 详见例 7-8): DBImageZP->Picture->LoadFromfile(OpenDialog1->FileName); 5.4 通用对话框 在 Windows 及其系列应用软件中, 有许多对话框的外观及操作都很相似, 如 : 打开 另存为 颜色 字体 打印 对话框等 尽管利用 C++ Builder 所提供的文件管理组件可以方便地设计有关文件管理类的窗体, 但在实际编程时, 仍很不方便 实际上,C++ Builder 也提供了用来制作这些标准对话框的组件, 它们位于 Dialogs 页上

93 126 C++ Builder 6 程序设计教程 TOpenDialog 与 TSaveDialog 对话框组件 TOpenDialog 与 TSaveDialog 对话框组件用于选择要打开 保存的文件, 使用组件 的 Execute 方法可显示 Windows 标准的 打开 保存 对话框 常用属性如下 1. Filter 属性 Filter 属性设置文件类型过滤器 它可确定文件类型和在文件类型下拉列表框中的顺 序 该属性的取值是一个字符串, 由一组或多组文件类型表达式构成, 每组代表一类文 件 构成规则是 : 类型说明字符串 类型通配表达式 [ 类型说明字符串 类型通配表达式 ] 以下代码在文件类型组合列表框中增加了.TXT 和.cpp 两种类型的文件过滤器 : OpenDialog1->Filter = "Text files (*.txt) *.TXT C++ files (*.cpp) *.cpp "; 此外, 在同一个过滤器中, 还可以有多种文件后缀 : OpenDialog1->Filter = "C++ files *.cpp;*.cpp;*.h "; 在对话框中还有一个 DefaultExt 属性, 用来设置默认的文件扩展名 当保存一个没 有指定扩展名的文件时, 将自动为文件添加默认的扩展名 2. FilterIndex 属性 FilterIndex 属性设置对话框的默认过滤器 数值从 1 开始计算, 如 FilterIndex 等于 2, 表示程序运行时出现在文件类型下拉框的过滤器是第 2 个过滤器 3. InitialDir 属性 InitialDir 属性设置 打开 保存 对话框的初始路径设置 如果默认或指定目录 无效, 则指向当前工作目录 4. Options 属性 Options 属性设置对话框的出现模式和操作模式 属性值的类型定义如表 5-6 所示 表 5-6 打开 保存 对话框的 Options 属性取值及含义 取值 ofallowmultiselect ofcreateprompt ofextensiondifferent offilemustexist ofnochangedir 含义 值为 true, 则允许在文件名列表中选择多个文件 值为 true, 当用户在文件编辑框中输入一个不存在的文件名, 并选择 OK 按钮, 则会出现消息框, 提示用户此文件不存在并询问是否以此文件名创建一新文件 值为 true, 从对话框中返回的文件扩展名将不同于默认扩展名 其值存入 DefaultExt 属性中 值为 true, 当用户在文件编辑框中输入一个不存在的文件名时, 并选择 OK 按钮, 则会出现一消息框提示用户此文件不存在, 并询问是否输入了正确的路径和文件名 值为 true, 当前目录将设置成对话框第一次出现的目录, 并忽略任何目录改变

94 第 5 章文件管理 127 续表 取值 ofoverwriteprompt OfPathMustExist 含义 值为 true, 当用户试图保存一个已存在的文件时, 将出现一消息框, 提示用户此文件已存在, 并询问是否覆盖 值为 true, 用户在文件名编辑框只能输入有效路径名, 否则出现消息框, 提示用户路径无效 5. Title 属性 Title 属性用来设置对话框标题中显示的内容 6. FileName 属性 FileName 属性返回用户最后选择的文件名, 文件名中包含了文件所在的路径 如果在打开对话框前 Options 属性中设置了 ofallowmultiselect, 也就是可以一次选 择多个文件, 则通过读取 Files->Strings[i] 的值可以获取所有选中的文件名 其中 i 为一 个整型循环变量, 从 0 开始递增到 Files->Count-1 当用户单击对话框中的 确定 按钮时, 对话框 ( 包括其他对话框 ) 中的 Execute 方法返回 true, 否则为 false 示例代码如下 : if(opendialog1->execute()) for(int i=0 ; i<opendialog1->files->count ; i++) ListBox1->Items->Add(OpenDialog1->Files->Strings[i]); 例 5-3 利用通用对话框设计一个能够打开 显示 另存 C++ Builder 源程序文件与文本文件的窗体 在窗体上添加一个多行带滚动条的 TMemo 组件 三个命令按钮, 添加 打开 保存 对话框各一个 编写相关的事件过程代码如下 : void fastcall TForm1::btnOpenClick(TObject *Sender) if(opendialog1->execute()) Memo1->Lines->LoadFromFile(OpenDialog1->FileName); // void fastcall TForm1::bntExitClick(TObject *Sender) Close(); // void fastcall TForm1::btnSaveClick(TObject *Sender) if(savedialog1->execute()) Memo1->Lines->SaveToFile(SaveDialog1->FileName);

95 128 C++ Builder 6 程序设计教程 // void fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) Action=caFree; // 将单元文件以 frmexam05_3 为名保存 程序运行时, 单击 打开文件 按钮, 出现标准的 打开 对话框, 打开一个文件后, 文件的内容即显示在文本框中, 如图 5-3 所示 图 5-3 程序运行示例 TOpenPictureDialog 与 TSavePictureDialog 对话框组件 TopenPictureDialog 与 TSavePictureDialog 对话框组件分别用于打开和保存图形文件 它们都通过 Execute 打开相应的对话框 组件的用法与前述的 TOpenDialog 与 TSaveDialog 相似, 只是在 TOpenPictureDialog 对话框显示的时候, 右侧多了一个可以预览图形的区域 如果选中的文件被组件所支持, 则图形可以显示在预览区域 可以识别的文件有 :.bmp.jpg.ico.wmf 等 TFontDialog 与 TColorDialog 对话框组件 1. TFontDialog 对话框组件 TFontDialog 对话框组件用于在应用程序中打开字体对话框, 如图 5-4 所示 用户可在对话框中进行字体选择和属性设置 用户选择字体并单击 OK 按钮, 有关信息便存储在组件的 Font 属性中 应用程序可通过调用 字体 对话框的 Execute 方法来显示该对话框, 当用户单击 确定 按钮时,Execute 返回 true 值, 否则返回 false 值 如下代码利用用户的字体选择结果设置 Memo1 组件的字体属性 if(fontdialog1->execute()) Memo1->Font=FontDialog1->Font;

96 第 5 章文件管理 TColorDialog 对话框组件使用 TColorDialog 对话框组件可以显示 Windows 的 颜色 对话框, 如图 5-5, 用户可以从中选择一种颜色, 当用户选中一种颜色并单击 确定 按钮时, 选中的颜色被保存在组件的 Color 属性中 如 : if( ColorDialog1->Execute()) Memo1->Color=ColorDialog1->Color; 图 5-4 字体 对话框 图 5-5 颜色 对话框 TFindDialog 与 TReplaceDialog 对话框组件 1. TFindDialog 对话框组件 TFindDialog 对话框组件为应用程序提供 查找 对话框, 用户可使用 查找 对话框在文本文件中查找字符串 应用程序要查找的字符串放在其 FindText 属性中 Options 属性可决定 查找 对话框中有哪些选项 例如, 用户可选择是否显示匹配检查框 Options 的常用选项如表 5-7 所示 表 5-7 TFindDialog 对话框组件的 Options 的常用选项 取值含义 frdown frdisableupdown frfindnext frmatchcase frwholeword 值为 true, 对话框中出现 Down 按钮, 查找方向向下 否则,Up 按钮将被选中, 查找方向向上 可在设计或运行时设置 值为 true,up 和 Down 按钮将变灰, 用户不能进行选取 值为 true, 应用程序查找在 FindText 属性中的字符串 值为 true, 匹配检查框被选中 设计 运行时均可设置 值为 true, 整字匹配检查框被选中, 设计 运行时均可设置 如果用户在 查找 对话框中输入字符, 并单击 查找下一个 按钮, 将触发 OnFind 事件 在 OnFind 事件中可使用 Options 属性来决定以何种方式查找

97 130 C++ Builder 6 程序设计教程 2. TReplaceDialog 对话框组件 TReplaceDialog 对话框组件为应用程序提供 替换 对话框 它包括 查找 对话框的所有功能, 此外还允许使用者更换被选中的字符串 组件的 FindText 属性是应用程序需查找的字符串 ReplaceText 属性是被选中字符串的替换字符串 Options 属性决定 替换 对话框的显示方式, 其值如下 : 1)frRelpace: 值为 true, 应用程序将 ReplaceText 属性中的字符串替换 FindText 属性中的字符串 2)frReplaceAll: 值为 true, 应用程序将查找到的所有 FindText 属性中的字符串用 ReplaceText 属性中的字符串替换 与 查找 对话框一样, 替换 对话框也有 OnFind 事件 用户输入查找字符串并单击 查找下一个 按钮时, 触发 OnFind 事件 用户选择 替换 或 全部替换 时, 将触发 OnRelpace 事件, 要替换的字符串存入 ReplaceText 属性中, 需编写相应的代码以支持替换功能 TPrintDialog 与 TPrinterSetupDialog 对话框组件 1. TPrintDialog 对话框组件 TPrintDialog 对话框组件用于显示 打印 对话框 用户在 打印 对话框中, 可以选择打印机 打印页数 打印份数 当用户选择对话框中的 属性 按钮, 将出现 打印设置 对话框 使用 Options 属性可设置 打印 对话框的显示形式 PrintRange 属性可定义打印的范围 如果 PrintRange 的值是 prpagenums, 则可以设置 FromPage 和 ToPage 属性来确定打印范围 ; 设置 MinPage MaxPage 属性可限制用户的打印范围 2. TPrinterSetupDialog 对话框组件 TPrinterSetupDialog 对话框组件用于配置打印机, 如纸张大小 打印方向等 例 5-4 对例 5-3 进行扩充, 增加 字体 颜色 和 打印 按钮, 使其能对 TMemo 组件中显示的文件内容进行字体 颜色的设置并能将其在打印机上输出 只要在 frmexam_5_3 的窗体上增加 字体 颜色 打印 按钮, 然后在相应的事件过程中加入以下代码即可 : void fastcall TForm1::btnFontClick(TObject *Sender) if(fontdialog1->execute()) Memo1->Font=FontDialog1->Font;

98 第 5 章文件管理 131 void fastcall TForm1::btnColorClick(TObject *Sender) if(colordialog1->execute()) Memo1->Color=ColorDialog1->Color; void fastcall TForm1::btnPrinterClick(TObject *Sender) if(printdialog1->execute()) TPrinter *Prntr = Printer();// 创建打印机对象, 并使用默认打印机 TRect r = Rect(200,200,Prntr->PageWidth-200, Prntr->PageHeight-200); Prntr->Copies=PrintDialog1->Copies; Prntr->BeginDoc(); // 开始打印 Prntr->Canvas->TextRect(r, 200, 200, Memo1->Lines->Text); Prntr->EndDoc(); // 结束打印 在 btnprinterclick 事件代码中,TPrinter 是系统的打印机对象,BeginDoc 和 EndDoc 是它的两个方法, 文本输出是通过打印机对象的画布 Canvas 属性对象 ( 见第 8 章 ) 的 TextRect 方法实现的, 该方法在一个指定的区域上输出文本内容 程序运行后的结果如图 5-6 所示 图 5-6 对话框应用示例 本章小结 1. 文件管理 为方便程序员编写管理文件的应用程序,C++ Builder 中提供了相应的文件管理组件 : 驱动器组件 (TDriveComboBox) 目录列表框(TDirectoryListBox) 文件列表框

PowerPoint 演示文稿

PowerPoint 演示文稿 按钮对象 (button) 当 JavaScript 读到 标记中的 type 属性值为 button 时, 自动建立一个按钮对象, 并将该对象放到表单对象的 elements 数组当中 按钮对象包括 : 普通按钮 (button) 提交按钮 (submit) 重置按钮 (reset) 1. 使用按钮对象的格式 document.forms[ 索引值 ].elements[ 索引值

More information

FJXBQ

FJXBQ 高等医学院校选用教材 ( 供成人教育中医药专业 中西医结合专业使用 ) 方剂学 闫润红 主编 2 0 0 1 内容简介本书是供成人教育中医药专业 中西医结合专业使用的教材 全书分总论和各论两部分, 总论部分对中医方剂的基本理论, 如治法 君臣佐使 剂型 剂量等及其现代研究进展进行了介绍 各论部分对常用方剂的主治病证 配伍意义 临床应用 加减变化规律及现代研究概况等内容, 按分类进行了系统阐述 在保证方剂学学科知识结构完整性的前提下,

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

VB程序设计教程

VB程序设计教程 高 等 学 校 教 材 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 石 油 大 学 出 版 社 内 容 提 要 本 书 是 按 高 等 学 校 计 算 机 程 序 设 计 课 程 教 学 大 纲 编 写 的 大 学 教 材, 主 要 包 括 VB 基 础 知 识 常 用 程 序 结 构 和 算 法 Windows 用 户 界 面 设 计 基 础 文 件 处

More information

Microsoft Word - CB6CXfm.DOC

Microsoft Word - CB6CXfm.DOC C++ Builder 6 程序设计教程 陆卫忠刘文亮等编著 北京 内容简介 本书系统地介绍了在 Windows 环境下利用 C++ Builder 进行应用程序开发的方法, 主要内容包括 C++ Builder 常用组件的使用 MDI 多文档应用程序设计 文件操作与文件管理 数据库应用程序设计 多线程应用程序设计 Internet 应用程序设计 动态链接库 DLL 以及多媒体与图形应用程序设计 全书内容翔实

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

穨ac3-3.PDF

穨ac3-3.PDF 3-1 Access 3-1-1 Event Click OnClick Click OnClick AfterUpdate BeforeUpdate On After Before > VBA( ) 3-1 3-1 Access Open Load Sub Funtion 3-1-2 Sub Funtion Private Me Me Forms Reports Form Report VisualBasic

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书 做事细节全书 赵彦锋著 企业管理出版社 图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, 2005.11 ISBN 7-80197-338-0 Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B026-49 中国版本图书馆 CIP 数据核字 (2005) 第 136676 号 书 名 : 做事细节全书 作 者 : 赵彦锋 责任编辑 : 吴太刚

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

大漠 伪前端, 就职于淘宝

大漠 伪前端, 就职于淘宝 CSS Grid Layout 2016-12-17 @ 大漠. #CSSConf https://www.flickr.com/photos/19139526@n00/8331063530/ 大漠 伪前端, 就职于淘宝 古老的 table 布局 现代 Web 布局 Float inline-block display: table position (absolute 或 relative)

More information

付宝容器 jsapi 档 册 PDF 版本 本版本为实验版本, 为线下独 查看使, 受制于 成 PDF 程序的限制, 样式问题还没有很好的解决, 例如分 切图 代码 亮 推荐使 在线版本, 便实时查看 jsapi 运 效果 如需搜索, 使 阅读 PDF 软件 带功能即可 更多细节样式调整和 录索引探

付宝容器 jsapi 档 册 PDF 版本 本版本为实验版本, 为线下独 查看使, 受制于 成 PDF 程序的限制, 样式问题还没有很好的解决, 例如分 切图 代码 亮 推荐使 在线版本, 便实时查看 jsapi 运 效果 如需搜索, 使 阅读 PDF 软件 带功能即可 更多细节样式调整和 录索引探 付宝容器 jsapi 档 册 PDF 版本 本版本为实验版本, 为线下独 查看使, 受制于 成 PDF 程序的限制, 样式问题还没有很好的解决, 例如分 切图 代码 亮 推荐使 在线版本, 便实时查看 jsapi 运 效果 如需搜索, 使 阅读 PDF 软件 带功能即可 更多细节样式调整和 录索引探索建设中 成时间 : 2017-07-20 12:13:21 Since 8.6 定义键盘 定义键盘使

More information

四川省普通高等学校

四川省普通高等学校 四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9

More information

untitled

untitled 1 LinkButton LinkButton 連 Button Text Visible Click HyperLink HyperLink 來 立 連 Text ImageUrl ( ) NavigateUrl 連 Target 連 _blank _parent frameset _search _self 連 _top 例 sample2-a1 易 連 private void Page_Load(object

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

心理障碍防治(下).doc

心理障碍防治(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...2...3...4...5...6...7...8...9...10... 11...12...13...15...16...17...19...21 I ...23...24...26...27...28...30...32...34...37...39...40...42...42...44...47...50...52...56...58...60...64...68

More information

untitled

untitled 1 .NET 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Response 類 Write 料 Redirect URL Response.Write("!! ives!!"); Response.Redirect("WebForm2.aspx"); (1) (2) Web Form

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

Microsoft Word - AccessPortal使用手册v3.1.doc

Microsoft Word - AccessPortal使用手册v3.1.doc HighGuard Access Portal 使用手册 地址 : 上海市张江高科技园区松涛路 563 号海外创新园 B 座 301-302 室 电话 : 021-50806229 传真 : 021-50808180 电子邮件 : marketing@highguard.com.cn 第 1 页共 24 页 目录 1. ACCESSPORTAL 概述...4 1.1. AccessPortal 主页面

More information

5. 利用对象监视器可以设置窗体或组件的 ( ) A. 方法 B. 属性 c. 外观 D. 执行代码 6. 编辑框 (Edi t) 中的文本发生改变时引发的事件是 ( ) A. AutoSize C. SetFocus B. OnChange D. SetText 7. 现建立一个简单报表, 要求其

5. 利用对象监视器可以设置窗体或组件的 ( ) A. 方法 B. 属性 c. 外观 D. 执行代码 6. 编辑框 (Edi t) 中的文本发生改变时引发的事件是 ( ) A. AutoSize C. SetFocus B. OnChange D. SetText 7. 现建立一个简单报表, 要求其 试卷代号 : 2 2 3 5 座位号仁口 国家开放大学 ( 中央广播电视大学 ) 2 0 1 4 年春季学期 " 开放专科 " 期末考试 Delphi 程序设计 试题 题号 一! 二 三 四! 五 总分 分数 I I I I I I I l 得分! 评卷人 I I I- 单项选择题 ( 3 0 分, 每题 3 分 ) 2014 年 7 月 1. 下面哪句话对 De l p hi 的描述是正确的 (

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, ( 沈郎文字 ) ISBN Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041

图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, ( 沈郎文字 ) ISBN Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041 图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, 2005.4 ( 沈郎文字 ) ISBN 7-5343-6512-0 Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041843 号 出版者社址网址出版人 南京市马家街 31 号邮编 :210009 http://www.1088.com.cn

More information

User’s Manual

User’s Manual V7 用 户 手 册 亿 图 为 您 专 业 图 表 设 计 提 供 最 佳 解 决 方 案 2004-2014 EdrawSoft. All right reserved. Edraw and Edraw logo are registered trademarks of EdrawSoft. 目 录 亿 图 怎 样 优 越 于 其 他 软 件... 5 亿 图 7 个 新 功 能... 6 为

More information

ebook111-4

ebook111-4 Flash 4 Flash 4 F l a s h 5 Flash 4 Flash Flash 4 Flash 4 Flash 4 4.1 Flash 4 Flash 4 Flash 4 Flash Flash 4 Flash 4 4.2 Flash 4 Flash 4 A Flash 4 S h i f t F i l e P r e f e r e n c e s > > Flash 4 Flash

More information

INTRODUCTION TO COM.DOC

INTRODUCTION TO COM.DOC How About COM & ActiveX Control With Visual C++ 6.0 Author: Curtis CHOU mahler@ms16.hinet.net This document can be freely release and distribute without modify. ACTIVEX CONTROLS... 3 ACTIVEX... 3 MFC ACTIVEX

More information

南華大學數位論文

南華大學數位論文 1 Key word I II III IV V VI 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

PowerPoint Template

PowerPoint Template 窗体 P15 常用控件 菜单设计 多窗体界面设计 P19 P30 P32 属性 方法 事件 属性名 Name( 名称 ) Caption Height Width Left Top BackColor ForeColor Enabled Visible Font Moveable Picture 描述所创建窗体的名称窗体的标题, 即窗体标题栏上显示的内容窗体的高度窗体的宽度窗体的左边界距容器坐标系纵轴的距离窗体上边界距容器坐标系横轴的距离返回或设置窗体中文本和图形的背景色返回或设置窗体中文本和图形的前景色决定窗体是否活动决定窗体在程序运行时是否可见用于设置窗体中文本的外观,

More information

中医疗法(下).doc

中医疗法(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...3...4...13...15...17...17...24...25...26...26...28...28...29...31...31...33...33

More information

Microsoft Word Visual_Basic程序设计上机实践教程正文.doc

Microsoft Word Visual_Basic程序设计上机实践教程正文.doc 实验 3 顺序和分支结构程序设计 实验目的 1. 掌握顺序结构的程序设计思想 2. 掌握命令按钮 (CommandButton) 标签 (Label) 文本框 (TextBox) 编辑框 (EditBox) 等常用控件的使用方法 3. 了解并掌握对话框函数 MessageBox() 的含义与用法 4. 了解和熟悉线条控件 形状控件的画法以及主要属性的用法 实验内容 1. 顺序结构 实训 3-1 编写一应用程序,

More information

图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, ( 图灵程序设计丛书 ) ISBN Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算

图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, ( 图灵程序设计丛书 ) ISBN Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算 图灵程序设计丛书 程序员的数学 3: 线性代数 [ 日 ] 平冈和幸堀玄著 卢晓南译 图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, 2016.3 ( 图灵程序设计丛书 ) ISBN 978-7-115-41774-9 Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算机 数学基础 2

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

眼病防治

眼病防治 ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...2...3...5...5...6...7...9... 11...13...14...15...17...18...19...20...21 I II...21...22...23...24...25...27...27...28...29...30...31...33...33...34...36...38...39...40...41...42...43...45

More information

中国南北特色风味名菜 _八)

中国南北特色风味名菜 _八) ( 20 010010) 7871092 1/32 356.25 4 760 2004 8 1 2004 8 1 11 000 ISBN 7-204-05943-3/Z102 1026.00 ( 18.00 ) ...1...2...2...4...6...7...8...9... 10... 11... 12... 13... 13... 14... 15... 17... 18... 19...

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

中医疗法(上).doc

中医疗法(上).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...1...2...4...5...7...13...15...17...18...19...21...23...24...24...26...26...27 I ...28...29...30...30...31...32...33...34...35...36...37...39...40...41...42...43...43...45...46...47...47...48

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 1 2 3 4 5 6 7 8 9 10 ==== 11 12 13 14 15 16 17 18 19 ==== ==== 20 .. ===== ===== ===== ===== ===== ======.. 21 22 ===== ===== ===== ===== 23 24 25 26 27 28 29 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

吉林大学学报 工学版 244 第 4 卷 复杂 鉴于本文篇幅所限 具体公式可详见参考文 献 7 每帧的动力学方程建立及其解算方法如图 3 所示 图4 滚转角速度与输入量 η 随时间的变化波形 Fig 4 Waveform of roll rate and input η with time changing 图5 Fig 5 滚转角随时间的变化波形 Waveform of roll angle with

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

60 新编计算机应用基础实训指导 (2) 单元格显示格式设置 选中 (A1:I1) 单元格区域, 在 格式 工具栏中选择 加粗 按钮, 将字体设置为 加粗 显示 ; 选择 居中显示 按钮, 将字体设置为居中显示 ; 选择 底纹设置 按钮, 将单元格底纹设置为黄色, 显示结果如图 3 3 所示 图 3

60 新编计算机应用基础实训指导 (2) 单元格显示格式设置 选中 (A1:I1) 单元格区域, 在 格式 工具栏中选择 加粗 按钮, 将字体设置为 加粗 显示 ; 选择 居中显示 按钮, 将字体设置为居中显示 ; 选择 底纹设置 按钮, 将单元格底纹设置为黄色, 显示结果如图 3 3 所示 图 3 模块三电子表格软件 Excel 训练项目 1 教师人事档案管理表的录入与编辑 训练目标 掌握 Excel 2003 工作簿的建立 保存与打开方法 掌握工作表中各种不同类型数据的输入方法 掌握单元格格式的设置方法 掌握表格边框和底纹的设置方法 掌握特殊符号的输入方法 训练内容 制作 教师人事档案管理表, 最终显示效果如图 3 1 所示 图 3 1 教师人事档案管理表 样本 实训步骤 (1) 启动 Excel

More information

图书在版编目渊 CIP 冤数据速成财富课院成就富翁的圆缘条法则 / 石向前著援北京院蓝天出版社袁 2005 援员园 ISBN 愿怨 -1 玉援速... 域援石... 芋援商业经营要通俗读物郁援 F71 缘原源怨中国版本图书馆 CIP 数据核字渊 2005 冤第 0 愿怨猿猿员号

图书在版编目渊 CIP 冤数据速成财富课院成就富翁的圆缘条法则 / 石向前著援北京院蓝天出版社袁 2005 援员园 ISBN 愿怨 -1 玉援速... 域援石... 芋援商业经营要通俗读物郁援 F71 缘原源怨中国版本图书馆 CIP 数据核字渊 2005 冤第 0 愿怨猿猿员号 25 图书在版编目渊 CIP 冤数据速成财富课院成就富翁的圆缘条法则 / 石向前著援北京院蓝天出版社袁 2005 援员园 ISBN 7-80158-6 愿怨 -1 玉援速... 域援石... 芋援商业经营要通俗读物郁援 F71 缘原源怨中国版本图书馆 CIP 数据核字渊 2005 冤第 0 愿怨猿猿员号 蓝天出版社出版发行渊北京复兴路 14 号冤渊邮政编码院 100843 冤电话院 66983715

More information

untitled

untitled 图书在版编目 (CIP) 数据 家居美化中的巧 / 陈赞等编著. 北京 : 中国林业出版社,2003.4 ISBN 7-5038-3399-8 I. 家 II. 陈 III. 住宅 室内装饰 基本知识 IV.TU241 中国版本图书馆 CIP 数据核字 (2003) 第 022376 号 版权所有翻印必究 1 2002.10 1 ...1...1...2...2...3...4...5...6...7...8...8...10...10...11...12...12...13...13...15...15...16...17...18...19...20...20...20...21...22

More information

图书在版编目 (CIP) 数据 文学与现代性批判 / 邵建著. 南京 : 江苏教育出版社, ISBN Ⅰ. 文... Ⅱ. 邵... Ⅲ. 当代文学 - 文学研究 - 中国 Ⅳ.I206.7 中国版本图书馆 CIP 数据核字 ( 2005 ) 第 04185

图书在版编目 (CIP) 数据 文学与现代性批判 / 邵建著. 南京 : 江苏教育出版社, ISBN Ⅰ. 文... Ⅱ. 邵... Ⅲ. 当代文学 - 文学研究 - 中国 Ⅳ.I206.7 中国版本图书馆 CIP 数据核字 ( 2005 ) 第 04185 图书在版编目 (CIP) 数据 文学与现代性批判 / 邵建著. 南京 : 江苏教育出版社, 2005.4 ISBN 7-5343-6528-7 Ⅰ. 文... Ⅱ. 邵... Ⅲ. 当代文学 - 文学研究 - 中国 Ⅳ.I206.7 中国版本图书馆 CIP 数据核字 ( 2005 ) 第 041850 号 出版者社址网址出版人 南京市马家街 31 号邮编 :210009 http://www.1088.com.cn

More information

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1 Chapter 01 Photoshop CS6 的基本操作 本章内容 1.1 Photoshop 的应用领域 1.6 控制面板的显示与隐藏 1.2 位图和矢量图的特性 1.7 新建 打开与保存文件 1.3 像素和分辨率的关系 1.8 图像的缩放 1.4 色彩模式 1.9 屏幕显示模式 1.5 Photoshop CS6 界面 1.10 计算机图形图像常用的色彩模式 Photoshop CS6 艺术设计案例教程

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

图形图像处理 (Photoshop CS6) [ pixel ] % % % % dpi/inch dpi 150dpi 300dpi 002

图形图像处理 (Photoshop CS6) [ pixel ] % % % % dpi/inch dpi 150dpi 300dpi 002 第 1 章 初识 Photoshop CS6 本章学习要点 点阵图像的基本概念 常用图像格式的特性 Photoshop CS6 界面基本操作 图像的分辨率和像素 Photoshop 的应用领域 Photoshop 文件的管理 重点和难点 图像的像素和分辨率 Photoshop CS6 界面的基本操作 达成目标 理解像素和分辨率的关系 了解图像的常用格式及特点 掌握 Photoshop CS6 界面基本操作及对图像进行不同格式的保存管理

More information

你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 图 1.5 图 三原色光的概念 R Red G Green B Blue RGB RGB R B 3 1 RGB RGB 256 0~ RGB

你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 图 1.5 图 三原色光的概念 R Red G Green B Blue RGB RGB R B 3 1 RGB RGB 256 0~ RGB 第 1 章色彩基础知识 Photoshop Photoshop 1.1 RGB 色彩模式 1.1 1.2 图 1.1 图 1.2 Photoshop sample0101.png 1.3 > CTRL O Windows Photoshop Photoshop Photoshop F8 > 1.4 B R 你的第一本 Photoshop 书 图 1.3 图 1.4 RGB 1.5 1.6 图 1.5

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

PowerPoint Presentation

PowerPoint Presentation Visual Basic 2005 學 習 範 本 第 7 章 陣 列 的 活 用 7-1 陣 列 當 我 們 需 要 處 理 資 料 時, 都 使 用 變 數 來 存 放 資 料 因 為 一 個 變 數 只 能 代 表 一 個 資 料, 若 需 要 處 理 100 位 同 學 的 成 績 時, 便 要 使 用 100 個 不 同 的 變 數 名 稱, 這 不 但 會 增 加 變 數 名 稱 命 名

More information

Linux服务器构建与运维管理

Linux服务器构建与运维管理 1 Linux 服务器构建与运维管理 第 2 章 :Linux 基本命令 阮晓龙 13938213680 / rxl@hactcm.edu.cn http://linux.xg.hactcm.edu.cn http://www.51xueweb.cn 河南中医药大学管理科学与工程学科 2018.3 2 提纲 目录与文件的操作 mkdir touch mv cp rm rmdir file tree

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

jsj0.nps

jsj0.nps 第 3 章 Word 基 础 应 用 制 作 求 职 简 历 3 畅 1 求 职 简 历 案 例 分 析 本 章 以 制 作 求 职 简 历 为 例, 介 绍 Word 强 有 力 的 文 字 处 理 功 能, 包 括 Word 的 字 符 格 式 的 设 置 段 落 格 式 的 设 置 表 格 的 制 作 图 片 的 插 入 制 表 位 的 使 用 页 面 边 框 的 设 置 打 印 输 出 等

More information

C#程序设计实验

C#程序设计实验 程序设计基础 实验指导 / 实验一 : 认识 C# 1 程序设计基础 实验指导 实验一 : 认识 C# 一 实验目的 1 掌握 Visual Studio 的基本操作方法, 学会使用该编译工具 2 掌握编辑 编译 运行控制台应用程序的基本过程 3 掌握建立 Windows 窗体应用程序的基本过程 4 通过运行 C# 程序, 初步了解 C# 程序的特点 二 实验学时 2 学时 三 实验类型 验证性实验

More information

肝病养生.doc

肝病养生.doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...3...4...6...7...8...9... 11... 11...14...16...18...19...20...21...22...24...25 I

More information

專題報告.PDF

專題報告.PDF 91 III IV I II III IV 1 2 3 4 5 6 7 8 Yes No Yes Yes No No No No Yes Yes No No Yes Yes Yes No No No Yes Yes Yes No No 9 00 push push BlockSet BlockSet BlockSet [ ][ ][ X Y ] 0 0 0 0 10 11 12 13 14 15 16

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

VC访问VB的ActiveX.dll.doc

VC访问VB的ActiveX.dll.doc 如何从 VisualC++6.0 可执行文件访问 VisualBasicActiveXDLL 本文介绍三种方法可以从 VisualC++6.0 访 VisualBasicActiveXDLL 执行 1. 创建 VisualBasicActiveXDLL 项目 默认情况下创建 Class 1 2. 以下代码添加到 Class 1: Public Function MyVBFunction(x As Integer)

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

509 (ii) (iii) (iv) (v) 200, , , , C 57

509 (ii) (iii) (iv) (v) 200, , , , C 57 59 (ii) (iii) (iv) (v) 500,000 500,000 59I 18 (ii) (iii) (iv) 200,000 56 509 (ii) (iii) (iv) (v) 200,000 200,000 200,000 500,000 57 43C 57 (ii) 60 90 14 5 50,000 43F 43C (ii) 282 24 40(1B) 24 40(1) 58

More information

尿路感染防治.doc

尿路感染防治.doc ...1...1...2...4...6...7...7...10...12...13...15...16...18...19...24...25...26...27...28 I II...29...30...31...32...33...34...36...37...37...38...40...40...41...43...44...46...47...48...48...49...52 III...55...56...56...57...58

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information

性病防治

性病防治 ...1...2...3...4...5...5...6...7...7...7...8...8...9...9...10...10... 11... 11 I ...12...12...12...13...14...14...15...17...20...20...21...22...23...23...25...27...33...34...34...35...35 II ...36...38...39...40...41...44...49...49...53...56...57...57...58...58...59...60...60...63...63...65...66

More information

中国南北特色风味名菜 _一)

中国南北特色风味名菜 _一) ...1...1...2...3...3...4...5...6...7...7...8...9... 10... 11... 13... 13... 14... 16... 17 I ... 18... 19... 20... 21... 22... 23... 24... 25... 27... 28... 29... 30... 32... 33... 34... 35... 36... 37...

More information

全唐诗24

全唐诗24 ... 1... 1... 2... 2... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 9... 9...10...10...10...11...12...12...12...13...13 I II...14...14...14...15...15...15...16...16...16...17...17...18...18...18...19...19...19...20...20...20...21...21...22...22...23...23...23...24

More information

女性减肥健身(四).doc

女性减肥健身(四).doc ...1...2...3...4...6...7...8...10... 11...14...16...17...23...25...26...28...30...30 I ...31 10...33...36...39...40...42...44...47...49...53...53 TOP10...55...58...61...64...65...66...68...69...72...73

More information

14A 0.1%5% 14A 14A.52 1 2 3 30 2

14A 0.1%5% 14A 14A.52 1 2 3 30 2 2389 30 1 14A 0.1%5% 14A 14A.52 1 2 3 30 2 (a) (b) (c) (d) (e) 3 (i) (ii) (iii) (iv) (v) (vi) (vii) 4 (1) (2) (3) (4) (5) 400,000 (a) 400,000300,000 100,000 5 (b) 30% (i)(ii) 200,000 400,000 400,000 30,000,000

More information

(Chi)_.indb

(Chi)_.indb 1,000,000 4,000,000 1,000,000 10,000,000 30,000,000 V-1 1,000,000 2,000,000 20,000,00010,000,0005,000,000 3,000,000 30 20% 35% 20%30% V-2 1) 2)3) 171 10,000,00050% 35% 171 V-3 30 V-4 50,000100,000 1) 2)

More information

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的

榫 卯 是 什 麼? 何 時 開 始 應 用 於 建 築 中? 38 中 國 傳 統 建 築 的 屋 頂 有 哪 幾 種 形 式? 40 大 內 高 手 的 大 內 指 什 麼? 42 街 坊 四 鄰 的 坊 和 街 分 別 指 什 麼? 44 北 京 四 合 院 的 典 型 格 局 是 怎 樣 的 目 錄 中 華 醫 藥 以 醫 術 救 人 為 何 被 稱 為 懸 壺 濟 世? 2 什 麼 樣 的 醫 生 才 能 被 稱 為 華 佗 再 世? 4 中 醫 如 何 從 臉 色 看 人 的 特 質? 6 中 醫 怎 樣 從 五 官 看 病? 8 中 醫 看 舌 頭 能 看 出 些 什 麼 來? 10 中 醫 真 的 能 靠 一 個 枕 頭, 三 根 指 頭 診 病 嗎? 12 切 脈 能 判 斷

More information

穨_2_.PDF

穨_2_.PDF 6 7.... 9.. 11.. 12... 14.. 15.... 3 .. 17 18.. 20... 25... 27... 29 30.. 4 31 32 34-35 36-38 39 40 5 6 : 1. 2. 1. 55 (2) 2. : 2.1 2.2 2.3 3. 4. ( ) 5. 6. ( ) 7. ( ) 8. ( ) 9. ( ) 10. 7 ( ) 1. 2. 3. 4.

More information

Page i

Page i 况 1 1.1.1 1.1.2 1.1.3 2 2.1 2.1.1 2.1.2 2.1.3 2.1.4 Page i 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.3 2.3.1 Page ii 2.3.2 2.3.3 2.3.4 2.4 2.4.1 2.4.2 2.4.3 Page iii 2.5 2.5.1 2.6 2.6.1 2.6.2 3 3.1 3.1.1

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

概述

概述 OPC Version 1.8 build 0925 KOCRDK Knight OPC Client Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOC_Init...5 2.2.2 KOC_Uninit...5 2.3...5

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

12 计算机应用基础实训与习题指导 (Windows 7+Office 2010) 在任务栏对应的 计算机 窗口按钮上右击, 在弹出的快捷菜单中单击 关闭窗口 选项 在窗口标题栏上右击, 在弹出的快捷菜单中单击 关闭 命令 或鼠标双击窗口标题栏最左边的控制图标 在打开的窗口中, 按 Alt+F4 组

12 计算机应用基础实训与习题指导 (Windows 7+Office 2010) 在任务栏对应的 计算机 窗口按钮上右击, 在弹出的快捷菜单中单击 关闭窗口 选项 在窗口标题栏上右击, 在弹出的快捷菜单中单击 关闭 命令 或鼠标双击窗口标题栏最左边的控制图标 在打开的窗口中, 按 Alt+F4 组 第 2 章 Windows 7 操作系统实训 实训二 Windows 7 基本操作 实训目标 (1) 会进行 Windows 7 的窗口操作 (2) 会进行 Windows 7 应用程序的启动和退出 (3) 会进行桌面背景和屏幕保护程序个性化设置 (4) 通过控制面板的使用, 认识其功能和作用 实训内容 1. 窗口操作 (1) 打开和关闭 计算机 窗口 (2) 调整窗口大小和移动窗口 (3) 切换和排列窗口

More information

Microsoft Word - template.doc

Microsoft Word - template.doc HGC efax Service User Guide I. Getting Started Page 1 II. Fax Forward Page 2 4 III. Web Viewing Page 5 7 IV. General Management Page 8 12 V. Help Desk Page 13 VI. Logout Page 13 Page 0 I. Getting Started

More information

Microsoft Word - 97.01.30軟體設計第二部份範例試題_C++_ _1_.doc

Microsoft Word - 97.01.30軟體設計第二部份範例試題_C++_ _1_.doc 電 腦 軟 體 設 計 乙 級 技 術 士 技 能 檢 定 術 科 測 試 範 例 試 題 (C++) 試 題 編 號 :11900-920201-4 審 定 日 期 : 94 年 7 月 1 日 修 訂 日 期 : 96 年 2 月 1 日 97 年 1 月 30 日 ( 第 二 部 份 ) 電 腦 軟 體 設 計 乙 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 壹 試

More information

影視後製全攻略 Premiere Pro After Effects Encore 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS Adobe CS5 Adobe CS4 Premiere Pro After Effect

影視後製全攻略 Premiere Pro After Effects Encore 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS Adobe CS5 Adobe CS4 Premiere Pro After Effect 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS3 2010 Adobe CS5 Adobe CS4 Premiere Pro After Effects Encore 18 ii Tony Cathy 2010/8 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 iii Premiere

More information

彩色地图中道路的识别和提取

彩色地图中道路的识别和提取 9310016, i ii Abstract This thesis is on the researching of recognizing the roads in map image by computer. Based on the theory of Pattern Recognition, there is a method to be discussed, which can recognize

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

5. 工具栏上的一个 SpeedButton 按钮如果要设置为状态按钮, 则正确设置的方法是 ( ) A. 将 SpeedButton 按钮的 Grouplndex 属性设置为 0, 且 Al l owal IUp 属性设置为 True B. 将 SpeedButton 按钮的 Grouplndex

5. 工具栏上的一个 SpeedButton 按钮如果要设置为状态按钮, 则正确设置的方法是 ( ) A. 将 SpeedButton 按钮的 Grouplndex 属性设置为 0, 且 Al l owal IUp 属性设置为 True B. 将 SpeedButton 按钮的 Grouplndex 试卷代号 : 2 2 3 5 座位号 I I I 中央广播电视大学 2 0 1 0-2 0 1 1 学年度第二学期 " 开放专科 " 期末考试 Delphi 程序设计试题 题号 I - I 二 三 四 五 总分 分数 I I I I I I I 2011 年 7 月 得分 评卷人 一 单项选择题 ( 3 0 分, 每题 3 分 ) 1. Delphi 程序设计的基本特点是 ( ) A. 可视化程序设计

More information

!"# $ %&'!"#$

!# $ %&'!#$ !"# $ %&'!"#$ 内容简介本书是在作者已经出版的 XilinxAlProgrammableZynq-7000SoC 设计指南 一书的基础上进行大幅度修订而成的 本书的一大特色就是更加突出 ARMCortex-A9 双核处理器的使用 此外, 在修订本书时采用了 Xilinx 最新的 Vivado2015 4 集成开发环境 通过本书的修订, 能反映最新的 ARM 嵌入式设计技术和实现方法, 同时也能更加凸显采用异构架构的

More information