470 likes | 583 Views
第 8 章 表单高级设计 8.1 多表单应用程序. 应用程序界面 单文档界面与多文档界面 顶层表单与子表单 非浮动表单和浮动表单 调用子表单: DO FORM 命令. [ 例 8-1 ] 为例 7-10 设计的表单增加一个查页命令按钮 , 要求单击它能打开一个供用户输入记录号的窗口 , 如图 8.1 所示。当指定记录号并单击确定按钮后,新打开的窗口随即关闭,原表单也立即更新记录显示。 (1) 从例 7-10 的表单文件 SBXG.SCX 复制出 SBBD1.SCX, 并将后者打开。
E N D
第8章 表单高级设计8.1 多表单应用程序 • 应用程序界面 • 单文档界面与多文档界面 • 顶层表单与子表单 • 非浮动表单和浮动表单 • 调用子表单:DO FORM命令
[例8-1] 为例7-10设计的表单增加一个查页命令按钮,要求单击它能打开一个供用户输入记录号的窗口, 如图8.1所示。当指定记录号并单击确定按钮后,新打开的窗口随即关闭,原表单也立即更新记录显示。 (1) 从例7-10的表单文件SBXG.SCX复制出SBBD1.SCX,并将后者打开。 (2) 在SBBD1.SCX的表单窗口Form1中增加命令按钮Command1。 (3) 创建表单文件SBBD2.SCX,并在其表单窗口Form1中创建标签、文本框各1个。 (4) 属性设置:见表8.1。
(5) 在Form1(SBBD1.SCX)的Init事件代码中增加公共变量jlh: PUBLIC yh,mc(10,1),jlh && 公共变量jlh用来表示记录号 COPY TO ARRAY mc FIELDS sb.名称 && 保持原样 GO 1 && 保持原样 (6) Form1(SBBD1.SCX)中Command1的Click事件代码编写如下: DO FORM sbbd2 && 调用子表单 GO jlh && 记录指针指向在子表单中指定的记录 THISFORM.Refresh && 父表单更新 (7) Form1(SBBD2.SCX)中Command1的Click事件代码编写如下: jlh=THISFORM.Text1.Value && 文本框值赋给公共变量(可事先在文本框中键入一个数) THISFORM.Release && 释放Form1(SBBD2.SCX) (8) Form1(SBBD1.SCX)的Unload事件代码编写如下: RELEASE jlh && 清除公共变量jlh,程序运行结束公共变量不会自动清除 表8.1 “查页”属性设置
表单集 • 使用表单集的优点 • 表单集的创建与删除 • 表单集的编辑 [例8-3] 用表单集来实现查看设备大修情况。 (1) 从例7-13产生的表单文件BG.SCX复制出BDJ.SCX,并使后者打开,表单设计器窗口中将会显示“SB表编辑”表单窗口。 (2) 为表单文件BDJ.SCX创建表单集:选定表单菜单的创建表单集命令。 (3) 向表单集添加表单:选定表单菜单的添加新表单命令,表单设计器窗口中就会出现Form2表单窗口。 (4) 在数据环境中添加DX表, 并将SB表与DX表按编号关联起来。 (5) 将数据环境中DX窗口的标题栏拖放到Form2表单窗口,该表单中就会产生一个关于大修的表格。 (6) 将Form2表单的Caption属性值改为“大修情况”。
8.2 用户定义属性与方法程序 • 用户定义属性 • 变量属性 • 创建:打开表单设计器后,选定表单菜单的新建属性 • 作用域:对表单集中的所有表单都有效 • 引用格式:THISFORMSET.变量属性名 • 数组属性 • 多表单应用程序的有效参数 • 用PUBLIC设置的公共变量 • 用户在表单集中自定义的属性 • 父表单与子表单间的参数传递:DO FORM … WITH …TO命令 • 用户定义方法程序 • 创建:表单菜单中选定“新建方法程序”命令 • 过程代码的编辑 • 调用基本格式为:THISFORMSET.方法程序名
8.3 类 • 类的概念 • 类(class)与对象(object) • 基类(base class) • 子类(subclass) • 用户定义类(user-defined class) • 容器类(container classes)和控件类(control classes) • 类库(class library) • 类的特征 • 封装特征 • 子类特征 • 继承性特征 • 用户定义类 • 类的创建 • 将类添加到工具栏 • 类的编辑
[例8-7] 创建一个带有确认功能的“退出按钮”类。 (1) 从CommandButton基类新建子类:选定文件菜单的新建命令在新建对话框中选定“类”选项按钮,然后选定新建文件按钮在如图8.7所示新建类对话框的类名文本框中键入类名:退出按钮;在“派生于”下拉列表框中选定基类CommandButton;在“存储于”文本框中键入类库的名字:用户控件选定确定按钮关闭对话框。 (2) 在类设计器中为“退出按钮”类设置属性与事件: 新建类对话框关闭后,随即会弹出一个类设计器窗口(参阅图8.8)。类设计器窗口内显示一个“退出按钮” 窗口,这就是“退出按钮”类;“退出按钮” 窗口中有一个“Command1”按钮(在图8.8中Command1已改作退出两个字),这是类的实例的模样。 在属性窗口中将“退出按钮” 类的Caption 属性由Command1改为“退出”,这将使按钮上显示“退出”两个字(见图8.8)。 双击“退出按钮”窗口内部来打开代码窗口,然后为Click事件键入如下代码: IF MESSAGEBOX("一定要退出吗?",4+48,"请确认")=6 && 信息框包含“是”和“否”按钮,图标显示惊叹号,按“是”按钮返回数值6 THISFORM.Release CLEAR EVENTS && 停止处理事件(参阅10.1节第三点) ENDIF (3) 关闭类设计器窗口。
[例8-8] 试将例8-7创建的“退出按钮”类添加到表单控件工具栏中。 打开任一表单(参阅图8.10)——选定表单控件工具栏的查看类按钮——在弹出菜单中选定添加命令——在如图8.9所示的打开对话框列表中选定可视类库文件:用户控件.VCX——选定确定按钮关闭对话框,表单控件工具栏中就会包含一个“退出按钮”。
第9章 报表设计9.1 打印基础 • TO PRINTER 打印命令 • LIST|DISPLAY STRUCTURE TO PRINTER && 打印当前表的结构 • LIST|DISPLAY TO PRINTER && 打印当前表的内容 • LIST|DISPLAY MEMORY TO PRINTER && 打印当前的变量和数组内容 • LIST|DISPLAY STATUS TO PRINTER && 打印VFP环境状态 • DIR TO PRINTER && 打印当前目录中表的名字 • TYPE <文件名.扩展名> TO PRINTER && 打印ASCII字符文件的内容 • 定向输出命令 • SET PRINTER ON | OFF • SET PRINTER TO [<文件名.扩展名> [ADDITIVE] | <打印端口>]
9.2 报表设计器的基本操作 • 打开报表设计器窗口 MODIFY REPORT <报表文件名> • 快速制表 报表菜单中的快速报表命令 [例9-3] 利用快速制表功能为SB.DBF设计一张包括编号、名称和价格3栏的报表。 (1) 打开报表设计器窗口:往命令窗口键入命令MODIFY REPORT SBJGB,使屏幕上出现报表设计器窗口(参阅图9.12)。 (2) 设置数据源:在报表设计器窗口击右键,在快捷菜单中选定数据环境命令,在数据环境设计器窗口中添加SB表。 (3) 启动快速制表:选定报表设计器窗口,然后在报表菜单中选定快速报表命令,使出现如图9.11所示的快速报表对话框。 (4) 设置快速报表属性:选定快速报表对话框的字段按钮,在字段选择器对话框(图略)中依次选出编号、名称和价格等3个字段,选定确定按钮返回快速报表对话框。选定确定按钮返回报表设计器窗口。 (5) 保存报表定义:选定文件菜单的保存选项,将产生报表文件SBJGB.FRX及其备注文件SBJGB.FRT。
命令方式打印报表 REPORT FORM <报表文件名> [ENVIRONMENT] [<范围>] [FOR <逻辑表达式>] [HEADING <字符表达式>] [NOCONSOLE] [PLAIN] [RANGE 开始页 [,结束页]] [PREVIEW [[IN] WINDOW <窗口名> | IN SCREEN] [NOWAIT]] [TO PRINTER [PROMPT] | TO FILE <文件名> [ASCII]] [SUMMARY] • 菜单方式打印报表 “报表”菜单的“运行报表”命令
9.3 报表设计器的高级操作 1. 页面设置
表9.1 报表带区的建立及作用 2. 设计报表带区
基本带区 • [例9-4] 在例9-3所制报表的基础上,设计如图9.11所示具有表格线的设备价格表。
标题与总结带区 • 数据分组与组标头/组注脚带区 • 报表菜单的数据分组命令
由报表向导产生一个经过数据分组的报表 工具菜单中向导选项的报表命令 [例9-5] 打印如图9.15所示带费用总计的设备大修分类表。
创建报表控件 [例9-6] 打印如图9.24所示设备大修费用表,要求相同的设备编号仅输出第一个。 (1) 定义快速报表: 键入命令MODIFY REPORT DXFY来打开报表设计器窗口——在数据环境中添加DX表→单击报表设计器窗口,然后选定报表菜单的快速报表命令——选定快速报表对话框的确定按钮,使报表设计器窗口中出现编号、年月、费用等标签及字段控件。 (2) 增加总结带区: 选定报表菜单的标题/总结命令→在标题/总结对话框中选定总结 带区复选框。 (3) 调整带区高度及控件位置:将各带区调整至如图9.25所示的高度。
(4) 在总结带区建立费用控件: 选定报表控件工具栏的域控件按钮——单击总结带区中间,在报表表达式对话框(参阅图9.21)的表达式文本框内键入表达式费用——选定计算按钮,在计算字段对话框中选定总和选项按钮(见图9.22)——选定确定按钮返回报表表达式对话框→选定确定按钮返回报表设计器窗口,费用控件就出现在总结带区之中。 (5) 修改编号字段区: 双击编号字段,在报表表达式对话框中选定打印条件按钮——在打印条件对话框中选定“否”按钮(参阅图9.23),使编号字段不打印重复的值——选定确定按钮返回报表表达式对话框——选定确定按钮返回报表设计器窗口。 (6) 如图9.25所示画出表格线。
报表变量 [例9-7] 打印如图9.26所示的主要设备的设备役龄表,要求包括记录序号和设备役龄,部门在打印时使用汉字部门名。 (1) 打开报表设计器窗口:键入命令MODIFY REPORT SBYL。 (2) 设置数据环境:在数据环境中添加SB表和BMDM表,并使SB.部门与BMDM.代码关联(从SB.部门字段拖到BMDM.代码索引)。 (3) 定义快速报表:选定报表设计器窗口,然后选定报表菜单的快速报表命令→在快速报表对话框中选定字段按钮→在字段选择器对话框的SB表中挑选编号、名称、部门3个字段→选定确定按钮返回快速报表对话框→选定确定按钮,使报表设计器窗口中出现编号、名称、部门等标签及字段控件。
(4) 设置在SB表部门字段控件的位置上输出汉字部门名:双击部门字段控件→将报表表达式对话框的表达式文本框中的SB.部门改为BMDM.名称→选定确定按钮返回报表设计器窗口,在该控件的位置上即能输出汉字部门名。 (5) 创建报表变量XH(用作序号): 选定报表菜单的变量命令→在如图9.28所示报表变量对话框的变量列表中键入变量名XH→在“要存储值”文本框中键入表达式XH+1→选定确定按钮关闭报表变量对话框。 (6) 创建XH变量控件: 选定报表控件工具栏的域控件按钮→单击细节带区左部→在报表表达式对话框中选定表达式文本框右侧的对话按钮→在如图9.29所示表达式生成器对话框的变量列表中双击报表变量XH→选定确定按钮返回报表表达式对话框→选定确定按钮返回报表设计器窗口,XH变量控件便已产生。
(7) 建立计算役龄的表达式控件: 选定报表控件工具栏的域控件按钮→单击细节带区右部→在报表表达式对话框的表达式文本框内键入(DATE()-SB.启用日期)/365→在格式文本框内键入输入掩码99→选定确定按钮返回报表设计器窗口。 (8) 处理日期和页号:将页注脚带区的Date()控件、_PAGENO控件、“页”标签控件移到页标头带区,然后创建一个“第”标签控件。 (9) 画表格线和创建表名、序号、役龄等标签控件(步骤从略)。 (10) 打印:在命令窗口发命令REPORT FORM sbyl.frx FOR 主要设备,打印结果如图9.26所示。
下篇——系统开发 10.系统开发实例 (系统开发小结) 11.关系数据库基本原理
“系统开发”篇包括第10、11两章,依次讲述“系统开发实例”和“关系数据库基本原理”。“系统开发”篇包括第10、11两章,依次讲述“系统开发实例”和“关系数据库基本原理”。 • 第10章结合“汽车修理管理系统”这一实例,阐明了一个VFP 6.0应用系统的整个开发与发布过程,可供读者仿效与借鉴。 • 第11章是“简明版”新增加的,目的是通过简介关系数据库的初步原理,提高读者开发DBAS的能力。
第10章 系统开发实例10.1 开发VFP数据库应用系统的一般步骤 • 需求分析 • 充分调研 • 写出需求规范说明书 • 数据库设计 • 逻辑设计 • 物理设计 • VFP创建数据库的优点 • 应用程序设计 • 应用程序的基本功能 • 用户界面设计 • 两类VFP应用程序及其运行环境 • VFP应用系统的主文件 • 运行环境初始化 • 控制事件循环 • 恢复先前的环境 • 软件测试 • 应用程序发布
10.2 一个实例:“汽车修理管理系统”的开发 • 需求分析 • 开发目的: (1) 能对汽车修理有关的各类数据进行输入、修改与查询。 (2) 编制季度零件订货计划。 (3) 打印汽车修理发票和工资月报表。 • 数据需求 • 输入单据包括修车登记单、汽车修理单、零件入库单和零件出库单等4种 • 输出单据包括季度零件订货计划、汽车修理发票和工资月报表等3种。 • 功能需求 1. 数据登记 登记功能用于把各种手填单据中的数据及时登记到系统将要定义的表中,还要求能进行修改。这些单据包括修车登记单、汽车修理单、零件入库单和零件出库单。 2. 查询 能查询登记单、修理单、汽车、车主、修理工、零件库存的有关数据。 3. 编制并显示季度零件订货计划 编制零件订货计划需要找出要订货的零件,订货条件为:零件库存量<最低库存量。 订货量可由用户输入或修改。 4. 打印发票 发票中除包含顾客、汽车及修理项目等数据外,还要计算出修车费,修车费包括修理费和零件费,按下列各式计算: 零件费=(零件价格×耗用数量) 修理费=小时工资×修理工时×3 总计=零件费+修理费 5. 打印修理工工资月报表 某修理工的月工资=修理小时×小时工资。
数据库设计 • 逻辑设计 (1) 修理单: XLD(编号,牌号,工号,修理项目,修理小时,送修日期,完工日期) (2) 汽车: QC(牌号,型号,生产厂,车主名) (3) 车主: CZ(车主名,地址,电话) (4) 修理工: XLG(工号,姓名,地址,电话,出生日期,进厂日期,小时工资) (5) 零件用量: LJYL(编号,零件号,数量) (6) 零件库存: LJKC(零件号,零件名,成本,价格,库存量,最低库存,订货量) 图10.9 表间关联的设计
物理设计 1. 修理单(C:\QCXL\XLD.DBF) xld(编号 c(4), 牌号 c(8), 修理项目 c(12), 送修日期 d, 完工日期 d, 工号 c(4) 普通索引, 修理小时 n(4.1)) 2.汽车(C:\QCXL\QC.DBF) qc(牌号 c(8) 普通索引, 型号 c(6), 生产厂 c(20), 车主名 c(8)) 3.车主(C:\QCXL\CZ.DBF) cz(车主名 c(8) 普通索引, 地址 c(16), 电话 c(7)) 4. 修理工(C:\QCXL\XLG.DBF) xlg (工号 c(4) 普通索引, 姓名 c(8), 地址 c(16), 电话 c(7), 出生日期 d, 进厂日期 d, 小时工资 n(5.2)) 5. 零件用量(C:\QCXL\LJYL.DBF) ljyl(编号 c(4) 普通索引, 零件号 c(6), 数量 n(2)) 6. 零件库存(C:\QCXL\LJKC.DBF) ljkc(零件号 c(6) 普通索引, 零件名 c(10), 成本 n(8.2), 价格 n(8.2), 库存量 n(3), 最低库存 n(3), 订货量 n(3)) 7. 零件入库表为LJRK.DBF,其结构与LJKC.DBF相同 8. 零件出库表(C:\QCXL\LJCK.DBF) ljck(零件号 c(6), 数量 n(2))
应用程序设计 • 总体设计 • 初始用户界面设计 • 模块设计与编码 1.主文件(QCXL.PRG) SET TALK OFF SET DEFA TO c:\qcxl && 设置文件默认路径,本例所有文件都应装在该目录中 CLEA ALL SET VIEW TO sjhj.vue && 统一设置数据环境,自动关闭所有的工作区后打开视图文件 PUBLIC xldh,zljf && xldh用于存储输入的修理单号;zljf存储总零件费,打印发票时用 xldh=SPACE(4) DO FORM fm && 显示封面(参阅例7-1,并事先将fm表单复制到C:\qcxl) KEYB '{CTRL+F4}' && 关闭Command窗口 MODI WIND SCREEN TITL '汽 车 修 理 管 理 系 统' && 打开VFP主窗口并设置窗口标题 CLEA * 以上为初始化环境代码 DO qcxlcd.mpr && 菜单文件名定为QCXLCD(汽车修理菜单) READ EVENT && 建立事件循环 QUIT && 退出VFP
2. 菜单程序(QCXLCD.MPR) 往命令窗口键入命令MODI MENU QCXLCD,就会出现菜单设计窗口,此时可按图10.11建立菜单。 (1) “退出”菜单项的命令 CLEAR EVENTS && 停止事件循环,转去执行READ EVENT后的命令 (2) 按图10.11设置调用各表单的命令,例如对“修车登记”菜单项可键入命令DO FORM xcdj。 (3) 从菜单文件QCXLCD.MNX生成菜单程序QCXLCD.MPR。
3. “修车登记”表单(XCDJ.SCX) 4.“输入修理单号”表单 (SRXLDH.SCX)
5.“汽车修理”表单(QCXL.SCX) 6. “零件订货计划”表单(LJDH.SCX)
7. “打印发票”表单(DYFP.SCX) 8. “发票”报表(FP.FRX)
运行设计 • 装载数据 • 设置应用系统程序项 (1) 进入Windows 98(或Windows 95); (2) 选定“开始”菜单中“设置”选项的“任务栏”命令——选定任务栏属性对话框的开始菜单程序选项卡——选定添加按钮——在创建快捷方式对话框中的命令行文本框中键入:c:\vfp\vfp6.exe c:\qcxl\qcxl –t——选定下一步按钮——认同缺省文件夹programs,选定下一步按钮——在为程序选定标题对话框中键入:汽车修理管理系统——选定完成按钮返回任务栏属性对话框——选定确定按钮,“汽车修理管理系统”程序项已建立在“开始”菜单的“程序”子菜单中。
10.3 应用程序的管理与发布 • 应用程序管理 • 项目的建立 在命令窗口键入命令MODIFY PROJECT QCXLGL • 项目管理器中的主文件 • 连编 • 文件的包含与排除
应用程序发布 • 发布准备 • 在项目管理器中生成一个.exe可执行程序 • 创建发布树(目录) • 创建发布磁盘 • 磁盘映象由安装向导生成在硬盘的磁盘映象目录中,选定工具菜单的向导选项的安装命令。
系统开发小结 开发应用系统的一般步骤 • 通常要经历下述 5 步,即 需求分析→数据库设计→应用程序设计→ 软件测试→应用程序发布 • 在VFP应用系统开发中,用户应 ⑴ 尽可能在项目管理器的管理下开发; ⑵ 充分利用VFP提供的各种设计器与生成器; ⑶ 在开发完成后建立安装磁盘或安装程序,实现应用程序的商品化。
数据库设计 在应用系统的开发中,数据库设计通常是一项独立的开发活动,而且总是安排在应用程序设计之前完成。 • 数据库中的数据主要来源于手工操作时的输入数据。但并非简单地把一张输入单据换成一个表; • 数据模式的设计应该遵循 “关系规范化”的理论; • VFP将表区分为数据表与自由表。在实际应用系统中的表一般应定义为数据表,以便充分利用数据词典的作用。
应用程序设计 VFP的应用程序设计要同时用到面向对象程序设计与结构化程序设计两种方法,体现了两类程序设计方法的结合 • 应用程序的总体设计可以使用结构化程序设计中由顶向下按功能分类的方法 • 应用程序的模块设计可充分利用VFP提供的可视化设计工具 ,通常以表单设计作为重点。
第11章 关系数据库基本原理11.1 关系模型的基本概念 • 关系的数学定义 • 域(domain) NAME ={张三,李四,王二} SEX ={男,女} AGE ={17,18,19}笛卡尔乘积(Cartesian product) • 笛卡尔乘积(Cartesian product) D1×D2×…×Dn={(d1,d2,…,dn) | di∈Di,i=1,2,…,n} • 关系(relation) 在域D1,D2,…Dn上的关系是D1×D2×…×Dn的一个子集,可记为R(D1,D2,…Dn)。其中R为关系名,n称为关系的度(degree)。 • 表文件与关系的对应 关系表现为表文件,元组相当于记录,属性相当于字段。
关系的性质(1)在同一个关系中,任意两个元组(两行)不能完全相同。 (2)在关系中,元组(行)的次序是不重要的,可以任意交换。 (3)在关系中,属性(列)的次序也是不重要的,可以任意交换。 (4)在关系中,同一列中的分量必须来自同一个域,是同类型的数据。 (5)在关系中,属性必须有不同的名称,但不同的属性可以出自相同的域,即它们的分量可以取值于同一个域。 (6)在关系中,每一分量必须是原子的(atomic),即不可再分的数据项。 • 关系数据库的描述 • 域的描述 在大多数情况下,域名和关系的属性名是一致的。但是在有些关系中,多个属性可能取值于相同的域。 • 关系的描述 关系由“关系框架”(对应于表文件的结构)和若干元组(对应于数据记录)组成。所谓关系的描述,其实就是对关系框架的描述。 【例11-1】 定义SB关系。可以描述为: RELATION SB(编号,名称,启用日期,价格,部门,主要设备,备注,商标) KEY=编号
R S R S R S 11.2 关系数据操作 • 关系代数运算 • 传统的集合运算 (a)并运算 b)交运算 (c)差运算 图11.1 用文氏图表示集合运算 • 专门的关系运算 选择 用于在关系的水平方向,选择符合给定条件的元组。 SELECT * FROM SB WHERE价格>10000.00 投影 用于在关系的垂直方向找出含有给定属性全部值的子集。 PROJECT DX ON 年月,费用 连接 用于按给定的条件将两个关系中的所有元组用一切可能的组合方式拼接为一个新的关系。 JOIN <关系1> AND <关系2> WHERE <条件>
关系完备性 (1)如果某一关系数据语言相对于关系代数语言所要求的各种运算都有等价的成分,则可以认为该语言是关系上完备的; (2)直接支持选择、投影和连接3种运算,是对任何关系数据语言的最低要求。 • 等价成分或直接支持,是指只需使用—条命令或函数,就可方便地实现一种运算的功能 • Visual FoxPro支持选择、投影、连接运算 ,对并、交、差等传统集合运算不完全支持 ,缺乏直接支持除法运算的命令 。