第6章表单设计_第1页
第6章表单设计_第2页
第6章表单设计_第3页
第6章表单设计_第4页
第6章表单设计_第5页
已阅读5页,还剩221页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章表单设计

6.1创建表单6.2容器和控件6.3数据环境6.4属性窗口6.5添加新的属性和方法6.6单文档界面与多文档界面

6.7表单设计范例6.8类的设计6.9典型的表单设计6.10消息对话框6.1创建表单 6.1.1利用表单向导创建表单 本节以学生成绩管理系统中的学生成绩表xscj为例(见表6.1),介绍采用表单向导快速创建表单的过程。表6.1学生成绩表xscj的结构 1.表单向导 表单向导是一个引导用户用填表和选取选项的方式创建表单的工具。表单向导在其运行过程中,给用户提供了了比较详细的中文提示,用户只要按照提示的说明就可以完成相应的操作。因此,表单向导的使并不困难。利用表单向导创建表单的步骤如下: (1)

在VisualFoxpro主菜单中,选择“文件”菜单中的“新建”命令(即选取“文件”/“新建”),弹出“新建”对话框;在“新建”对话框中选择“表单”单选按钮,并单击“向导”按钮(见图6-1),弹出“向导选取”对话框,见图6-2。图6-1“新建”窗口图6-2“表单向导”窗口 (1)

在“向导选取”框中选取“表单向导”(见图6-2)并单击“确定”按钮。 (2)

按图6-3所示在“表单向导”对话框中指定用于表单的数据源(数据库和表),然后进行表单字段的选取操作,在本例中数据源选取c:\vfplx\xscj.dbf并将该表所有可用字段都选入到“选定字段”框中。接着单击“下一步”按钮。图6-3选取表单的数据源 (4)按图6-4所示在“表单向导”对话框中选择表单样式和表单按钮类型。单击“样式”框中的样式名时,对话框左上方的放大镜中会显示出相应样式的例子;表单按钮类型则利用“按钮类型”单选按钮进行选择,其中“文本按钮”表示只在按钮上显示文字名称,“图片按钮”表示在按钮上显示图标;接着单击“下一步”按钮进入步骤3。图6-4选取表单样式和表单按钮类型 按图6-5所示在“表单向导”对话框中选择记录排序所依据的字段和记录的排序方式。最多可以选取3个字段来决定该表中所有记录的排序,排序方式则有升序或降序两种选择。在本例中选取“xh”学号字段作为记录的排序标识,排序方式则选升序,即按照学号的升序排序来显示记录。接着单击“下一步”按钮。图6-5选择记录排序所依据的字段和记录的排序方式 (6)

按图6-6所示在“表单向导”对话框中选择保存表单的方式,建议选择“保存表单并在表单设计器用进行修改”。在存储之前单击“预览”按钮可以对设计的表单进行预览,最后单击“完成”按钮。图6-6选择保存表单的方式 在通过回答表单向导的问题所生成的表单中,含有一组标准的记录定位按钮,这组按钮可用以在表单中显示不同的记录(第一个、前一个、下一个、最后一个)、编辑记录、添加记录、删除记录和查找记录等,见图6-7。图6-7利用表单向导设计的表单

2.快速生成表单 本小节仍以学生成绩管理系统中的学生成绩表xscj为例(见表6.1),介绍使用快速生成表单方法创建表单的过程。 (1)

选择“文件”菜单中的“新建”菜单项,弹出“新建”对话框。 (2)

在“新建”对话框中,选择“表单”单选按钮并单击“新建表单”按钮,进入表单设计器。 (3)

选择“表单”/“快速表单”菜单项,弹出表单生成器(如图6-8所示)。 (4)

在表单生成器中选取数据源C:\vfplx\xscj.dbf,并选取该表的全部字段;然后,单击“确定”按钮即可生成一个新表单。 新生成表单的界面类似于图6-7中所示的表单。图6-8表单生成器 3.一对多表单向导 本节在根据学生成绩表xscj.dbf和学生表xs.dbf两张表,用一对多表单向导来创建表单。这两张表通过字段“xh”建立关联。 学生表xs.dbf的数据(库结构)如表6.2所示,学生表xs.dbf的记录数据内容如图6-9所示。表6.2学生表xs.dbf的库结构图6-9学生表记录内容 学生成绩表xscj.dbf的表结构见表6.1,数据内容如图6-10所示。图6-10学生成绩表记录内容 使用一对多表单向导的操作步骤如下: (1)

选择“文件”/“新建”,弹出“新建”对话框。 (2)

在“新建”对话框中,选中“表单”单选按钮,单击“向导”按钮,打开“向导选取”对话框,在其中选取“一对多表单向导”(见图6-11)并单击“确定”按钮。 (3)

在“一对多表单向导”中,首先指定一个表作为一对多表单的父表(本例为学生表xs.dbf),然后进行字段选取(见图6-12),接着单击“下一步”按钮。图6-11向导选取图6-12指定父表并选取字段 (4)

在“一对多表单向导”中,指定一个表作为一对多表单中的子表(本例为学生成绩表xscj.dbf),然后选取所需字段并单击“下一步”按钮。 (5)

在图6-13所示的“一对多表单”向导中,建立两个表的关联关系,VisualFoxpro默认设置是以两个表中字段名相同的字段建立关联。在本表单中,学生表和学生成绩表关联字段为“xh”学号。 (6)

在“一对多表单”向导中,选择表单样式和按钮类型。 (7)

在“一对多表单”向导中,选择记录排序所依据的字段和记录的排序方式,最多可选取三个字段。选定以“xh”字段的升序排序。图6-13建立表之间的关联关系 (8)

在“一对多表单向导”中选择保存表单的方式,存储之前单击“预览”按钮进行预览。最后单击“完成”按钮。本例完成的一对多表单如图6-14所示。图6-14一对多表单运行情况 在图6-14所示的表单中,上半部分对学生表记录进行维护,下半部分对学生成绩表记录进行维护,表单中显示的是同一个学生的信息,即以“xh”学号字段为关联字段,学生表和成绩表的内容保持同步。这里要注意,必须以学生表做为父表,成绩表做为子表,两者不能前后颠倒,否则显示的内容不全。 之所以要提出上述要求的原因是在学生表中每个学生单独生成一条记录,而在成绩表中同一个学生在一学期中可能有多门课程,即同一个学生会有多条记录来记载多门课程的成绩情况。学生表中的“xh”学号字段与成绩表中的“xh”学号字段建立关联,但两者的关系是1:N(一对多)的关系。

6.1.2使用表单设计器创建表单 1.建立表单 要新建立一个表单,可以通过以下几种方法来完成: (1)

选择“文件”下拉菜单的“新建”按钮。 (2)

选择主窗口工具栏中的“新建”命令按钮。 (3)

打开“项目管理器”,选择“文档”/“表单”,点击“新建”按钮。 (4)

打开“命令窗口”,输入窗体创建命令CreateForm[<表单名>]。 通常在创建一个表单时,表单设计窗口的界面由四个窗口组成,这四个窗口分别是表单设计器、表单控件、布局和调色板(见图6-15)。图6-15表单设计界面 通过在表单中添加功能强大、丰富多彩的控件,不用或只用少量代码就能够得到赏心悦目的用户界面。设计时,只要在“表单控件”工具栏中选择控件,然后将其拖放至表单设计器中合适的位置就可以把该控件对象添加到表单上。这一过程充分体现了面向对象编程技术的灵活性,也反映了可视化编程技术的强大能力。 2.使用工具栏 设计表单时要使用“表单控件”工具栏所提供的控件,“表单控件”工具栏如图6-16所示。在表6.3中详细介绍“表单控件”工具栏上各控件的具体功能。图6-16“表单控件”工具栏表6.3“表单控件”工具栏上的控件表略 “表单设计器”工具栏如图6-17所示。在表6.4中显示了“表单设计器”工具栏各控件的功能。图6-17“表单设计器”工具栏表6.4“表单设计器”工具栏上的控件6.2容器和控件 VFP把所有的控件分为容器和控件两大类型。容器类控件是能够包含其他控件的控件。如“命令按钮组”(CommandGroup)可以包含“命令按钮”(CommandButton),所以“命令按钮组”是容器类控件。一般的控件不能包含其他控件。VFP中的容器又分为表单容器(含表单集容器)和基容器两种。表6.5显示了表单容器和其包含的不同对象。表6.6显示了基容器和其包含的不同对象。表6.5表单容器及其包含的对象表6.6基容器及其包含的对象 6.2.1容器层次中引用(访问)对象 1.绝对引用 如图6-18所示,FormSet1是一个表单集对象,Form1是包含在FormSet1中的一个表单对象,Text1和Group1则是包含在Form1中的文本框和选项按钮组的对象,Opt1和Opt2又是包含在Group1中的选项按钮对象。其中,FormSet1、Form1和Group1叫做容器对象,而Text1和Opt1、Opt2叫做控件对象。绝对引用表单集对象中的某个控件时,必须逐层指出各容器控件名和所引用控件的名如:

用绝对引用的方式来引用Text1对象:Formset1.Form1.Txt1 用绝对引用的方式来引用Opt2对象:Formset1.Form1.Group1.Opt2图6-18对象在表单容器中的层次关系 2.相对引用 相对引用某个对象时,应该明确目标对象相对于当前对象的位置。表6.7是在容器层次中引用对象时的关键字和引用关系。表6.7关键字和引用关系 若在对象Txt1中要引用对象Group1,则可以使用以下语句: This.Parent.Group1 其中,This代表当前对象Txt1文本框,Thisform和This.Parent指表单对象Form1 同样,若当前对象为选项框Opt1,要引用对象Txt1,则可以使用以下语句: This.Parent.Parent.Txt1 因为,Opt1包含于容器Group1中,而Group1包含于对象Form1中,故相对于Opt1的Form1为This.Parent.Parent。 6.2.2设置属性 在程序设计的编程阶段或运行阶段均可以设置对象的属性。对象的属性可用命令方式设置,设置属性命令的语法格式为:对象.属性=值设置对象时,要根据属性设置的不同位置选择对象的绝对引用或相对引用方式。例如,要设置Opt2选项为不可见,可用以下命令: Thisformset.Form1.Group1.Opt2.Visible=.F. 若要设置同一个对象的多个属性,可采用With……….Endwith结构。如:

WithFormset1.Form1.Txt1 &&对Txt1文本框进行设置 .visible=.T. &&使Txt1文本框可视 .enabled=.T. &&使Txt1文本框可用 .backcolor=RGB(255,0,0) &&背景颜色为红色 .alignment=2 &&文字对齐方式为居中 endwith 6.2.3调用方法 对象一旦建立之后,就可以在应用程序的任何一处调用此对象的方法。调用对象方法的语法是: 对象的绝对位置引用或相对位置引用.方法名称 调用时,应根据属性设置的不同位置选择对象的绝对引用或相对引用。例如:要调用Show方法来显示表单,可用: Formset1.Form1.show 如果在调用方法时,需要传递参数,应该将参数用圆括号括起,并置于方法名称后面。若调用方法后有返回值,那么,即使没有参数传递,在方法名称之后也要加上圆括号。如 This.Move(100,50) &&给方法传递参数 This.Caption=Thisform.Getnewcaption()6.3数据环境 6.3.1设计数据环境 数据环境定义了表单或报表使用的数据源,包括表、视图和关系。数据环境与表单或报表一起保存并可使用数据环境设计器进行修改。 定义表单或报表的数据环境之后,只要打开或运行该文件表单或报表文件,VisualFoxPro就会自动打开它的表或视图,在关闭或释放该文件时也会自动关闭该表或视图。 对于表单或表单控件,VisualFoxPro把“数据环境”中的全部字段列在“属性”窗口中,构成ContronlSource属性列表。 打开“表单设计器”后,可用以下方法打开数据环境设计器: (1)

选取“显示”/“数据环境”; (2)

打开表单后右击,并从弹出的快捷菜单中选择“数据环境”。 这两种方法实质上完成的是同一个FoxPro命令。选择“数据环境”之后,系统将显示图6-19所示的对话框。图6-19数据环境设计器 用鼠标单击“数据环境设计器”窗口可弹出一个菜单。表6.8给出了这个菜单中常用命令的意义。表6.8“数据环境设计器”弹出菜单中常用命令的意义 注意,在该弹出菜单中,“添加”和“移去”命令不会同时出现。 在单击“数据环境设计器”窗口弹出的菜单中,除了表6.8所列的命令之外,还有“属性”和“代码”命令。这两个命令可分别打开用以处理数据环境对象的数据“属性”窗口和“代码”窗口。常用的数据环境属性见表6.9。表6.9“数据环境”常用属性 6.3.2设置关系 关系是表与表之间的一种链接。通过建立表之间的链接,不仅可以访问当前选定表中的数据,而且还可以访问其他表中的数据。这种链接实际上是一种连接条件。这里只介绍为数据环境设置关系的方法。 在数据环境设计器中的表如果具有在数据库中设置的永久关系,这些关系就会自动地添加到数据环境中。如果表中没有永久关系,可以在数据环境设计器中设置这些关系。

在数据环境设计器中设置关系时可采用直观的拖动方式,即将字段从主表拖动到相关表中相匹配的索引标识上;也可以将字段直接从主表拖动到相关表中的字段上。如果相关表中没有与之对应的索引标识,系统将提示是否创建该索引标识。在数据环境设计器中以“xh”学号字段建立了一个关系之后,在表之间将有一条连线指出这个关系,见图6-20。图6-20设置关系 在数据环境中将“学生表”和“学生成绩表”分别选中,直接拖到表单中形成表格,表格的大小可以进行适当的拖放调整,表格中所有的数据源设置均采用系统缺省设置,其运行结果使两表状态信息保持一致。鼠标单击学生表中任意一名学生,在学生成绩表中就会显示该学生的所有单科课成绩内容,见图6-21所示。图6-21利用数据环境生成的表 要编辑关系的属性,应先选择该关系(单击线条即可),然后用鼠标右击弹出快捷菜单,选择“属性”,使“属性”对话框弹出。这时便可以进行属性设置。 关系的属性值对应于SETRELATION和SETSKIP命令中的子句。其中,属性RelationalExpr的默认值被设置为主表中主关键字段的字段名。如果相关表以表达式作为索引,就必须将其RelationalExpr属性设置为这个表达式。如果关系不是一对多关系,则必须将属性OneToMany设置为“假”。这相当于使用SETRELATION命令时不发出SETSKIP命令。

如果关系是一对多关系,必须将关系的OneToMany属性设置为“真”,相当于使用SETRELATION命令时,同时发出SETSKIP命令。浏览父表时,在浏览完表中所有相关记录之前,记录指针一直停留在同一记录上。6.4属性窗口 设计表单时一般要使用“属性”窗口。例如,设计表单的整体布局时可在“属性”窗口设置相关的属性;执行用户指定的操作时可在“属性”窗口里选中对应的事件,然后编写方法代码。总之,在“属性”窗口中可以完成表单设计的绝大部分工作。 要显示“属性”窗口,可以在系统菜单上选择“显示/属性”,或在“表单设计器”或“数据环境设计器”中单击鼠标右键,并在快捷菜单中选择“属性”。图6-22显示了表单的“属性”窗口。 根据所选的对象的不同,“属性”窗口显示的内容也不尽相同。“属性”窗口总是默认显示与当前选定的对象,如表单、数据环境、表、关系或控件有关的属性、事件和方法程序列表。在设计中或运行中都可以对属性进行设置或更改。当选择的对象多于一个时,“属性”窗口显示选定对象共有的属性。 图6-22显示的“属性”窗口顶部有一个对象下拉列表框,里面包含当前表单及在表单上的所有对象的名称。可用这个下拉列表框选择对应的对象。根据所选对象的不同,属性窗口显示的内容就不同。例如图6-22显示的是表单Form1的“属性”窗口。图6-22表单的“属性”窗口 在“属性”窗口对象列表框的下面是一个页框选项卡,其中共有5个选项页,分别是“全部”、“数据”、“方法程序”、“布局”和“其他”,选中不同的选项页窗口显示的内容也不同。各个选项页的具体含义如下: 全部:显示对象所有属性的当前设置以及事件和方法程序的名称; 数据:显示有关对象如何显示或怎样操作数据的属性; 方法程序:显示方法程序和事件; 布局:显示所有的布局属性; 其他:显示其他特殊属性,包括用户自定义属性。 有些属性值是由用户设定的一个值或一行文本,如设置Caption属性时,属性设置框的右侧会出现一个文本框,允许用户在其中输入一个值或一行文本。如果输入的是一个字符串,不必使用双引号把字符串括起来,只需输入字符串内容即可。有些属性如Autocenter的设置值是预定义好的。设置该属性时,属性设置框的右侧出现一个下拉列表框,从中可选择一个属性值。 属性设置框下面是属性列表,里面列出了当前对象所有的属性、事件和方法的当前默认设置值。有些属性值以“斜体”显示,如图6-22的“BaseClass”属性,表示用户不能更改此属性值。有些属性值为黑体,则表示属性值已经设置为新值。 双击某一个属性可更改该属性值。默认情况下,事件或方法都以“[默认过程]”显示,如果以对事件或方法编写了程序代码,显示内容则为“[用户自定义过程]”。双击某一事件或方法时可弹出一个代码编辑框,在编辑框里就可以为事件或方法编写程序代码了。 在属性列表中单击鼠标右键可弹出属性的快捷菜单。使用这个快捷菜单能够恢复属性的初始值和打开当前位置上的属性、事件或方法的帮助信息。在属性设置框里更改属性值以后,新的属性值都将在属性列表里以黑体显示,以区别其他未更改的属性值。同时在表单或表单对象上将反映出属性修改的结果,这一点充分体现了可视化编程的魅力。6.5添加新的属性和方法 每个表单及表单上的每个控件都有许多属性、事件和方法。一般情况下,这些属性、事件和方法已经能够满足设计用户界面的要求。但是,为了满足一些特殊的需要,有时会希望增加一些自己定义的变量或函数。VisualFoxPro允许为控件添加新属性和新方法,添加属性或方法的数量不限,并可以像其他原有属性或方法一样使用。要注意的是不能为控件添加事件,因为事件是控件固有的动作,不能扩充。

要往表单添加新属性或新方法,首先必须打开表单设计器,然后选择系统菜单上的“表单”/“新建属性”或“表单”/“新建方法程序”,屏幕就会出现一个对话框;在这个对话框里就可以为表单添加新属性或新方法。图6-23所示的对话框中就显示了为表单添加的一个新属性Add。图6-23添加新的属性 添加属性时,在图6-23所示对话框的“名称”文本框里输入新属性的名称,在说明框中可输入对该的属性注释,注释内容可有可无。图6-23中加入的是ADD属性,这个属性用于判断表中记录是否有新的添加操作。只要添加过记录以后,表单内所有过程中均可调用表单的新属性ADD,属性ADD将充当表单中全局变量的角色。 选中“Access方法程序”,可以为新属性添加一个Access方法。当要查询该属性值或欲把该属性值赋予一个变量时,系统将自动调用一个Access方法程序。按下“添加”按钮就可以往表单里添加一个新属性。在表单的“属性”窗口的最底部可以看到新添加的属性。

用户自定义的函数可以作为新方法程序添加到表单内。添加方法是,选择系统菜单上的“表单”/“新建方法程序”,在弹出的“新建方法程序”对话框就可以添加新的方法。新添加的方法在属性窗口里以“[默认过程]”显示,双击该方法名可打开一个代码编辑框进行程序设计。6.6单文档界面与多文档界面 VisualFoxPro创建的应用程序可分为多文档界面应用程序与单文档界面应用程序两类。多文档界面(Multiple-documentinterface,MDI)指一个应用程序实例可以同时包含一个或多个文档,它可以同时服务于一个用户和一个或多个嵌入的容器。例如,VisualFoxPro本身基本上就是一个MDI应用程序,带有包含于VisualFoxPro主窗口中的“命令”窗口,除此之外还可以同时打开编辑窗口和设计器窗口等其他类型的窗口。

单文档界面(Single-documentinterface,SDI)指的是应用程序由一个或多个独立的窗口组成,这些窗口均在Windows桌面上单独显示。MicrosoftExchange即是一个SDI应用程序的例子,在该软件中打开的每条消息均显示在自己独立的窗口中。 由单个窗口组成的应用程序通常是一个SDI应用程序,也有一些应用程序综合了SDI和MDI的特性。例如,VisualFoxPro将调试器显示为一个SDI应用程序,而它本身又包含了自己的MDI窗口。为了支持这两种类型的界面,VisualFoxPro允许创建以下3种类型的表单:

(1)

子表单(ChildForm):子表单包含在另一个窗口里,主要用于创建MDI应用程序的表单。子表单不能移动到父表单(主表单)显示范围之外。当子表单最小化时,它将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。 (2)

浮动表单(FloatingForm):属于父表单(主表单)的一部分,但并不是包含在父表单里。浮动表单可用于创建MDI应用程序。与子表单不同的是,浮动表单可以移动到屏幕的任何位置,但不能在父窗口后台移动。若浮动表单最小化,它将显示在桌面的底部。若父表单最小化时,则浮动表单也一同最小化。 (3)

顶层表单(Top-levelForm):顶层表单和其他Windows应用程序同级,可出现在其前台或后台,并且显示在Windows任务栏里。 这3种表单中有关属性的具体设置如表6.10所示。表6.10设置3种类型的表单6.7表单设计范例 表单不仅提供给用户一个用于查看、输入和操作数据的接口,而且还包括了一个能适应用户事件和系统事件的强有力的对象集。 VFP中,通常按以下步骤设计一个新的表单: (1)

设置表单属性; (2)

添加适当的控件; (3)

设置控件的属性; (4)

编写事件的代码。 在前面的章节中我们介绍了建立和操作表单的基本方法和步骤,不过在实际应用中通常会涉及到多个控件的使用和多种功能的操作。要掌握这些控件和功能的使用与操作,必须通过大量的实践。本节将灵活应用前面的介绍的知识并对这知识进行总结。通过多种方法的综合应用,帮助读者掌握一定的面向对象程序设计的技巧,同时也可以了解和体会一个连贯而完整的表单设计思路和设计过程。 在开始一个表单的设计时,首先要进行表单界面的设计。表单界面的设计可以按其使用目的分为两大类:与表内容有关的数据操作界面设计和与表内容无关的对话界面设计。本节主要讨论第一种类型,即,与表内容有关的数据操作界面设计,或称表内容的录入界面设计。 表内容录入界面的外观格式并没有统一的规定,设计者可以根据需要和个人的喜好来确定。无论采用何种外观,表内容输入界面都应完成一些基本的功能操作,包括记录数据录入、记录数据的前后翻动、记录数据的定位等。 表内容输入界面设计时主要应该考虑数据源、显示数据的格式和交互操作的方式等方面的问题。具体来讲,应该考虑: (1)

数据源:考虑涉及到哪几个表、各表之间的关系、是否采用数据环境等问题; (2)

显示数据的格式:选用何种格式布局、选用哪些控件对象等问题; (3)

交互操作的方式:用户如何操作、选用哪些控件对象、事件触发时事件代码程序完成哪些操作、是否需要向表单中添加新的属性和方法等问题。 下面,以一个单张表(学生成绩表)的信息输入界面设计为例,介绍采用不同的设计方法进行设计的过程。 学生成绩表的信息输入界面要求有以下四个功能: (1)

除数据输入外,学生成绩表具有只读浏览功能; (2)

可以随时添加记录; (3)

可以取消当前的操作; (4)

可以随时结束操作退出表单。 6.7.1设计方法一 1.确定界面效果 先进行分析并勾画出要设计的“学生成绩表”的界面,接下来逐步完善直至最终实现它。我们要设计的“学生成绩表”的界面如图6-24所示。图6-24学生成绩输入表单外观 2.创建表单的界面布局 创建表单的界面布局的步骤如下: (1)

选用一种方法,创建一个新表单并进入表单设计器; (2)建立数据环境。这张表单只涉及到一个“学生成绩表”,只需将该表添加到数据环境中即可(见图6-25)。利用数据环境可以省去对表的打开、关闭操作,向表单中添加的需要与数据源绑定的控件时,也可以直接得到控件的数据源缺省设置。对于初学者而言,这样做就可以在少代码或不写代码的情况下完成表单的设计操作; (3)

添加数据显示控件,因为该表单主要用表格来显示信息,因此最简单的方法就是将数据环境中的“学生成绩表”直接拖到表单中形成一个表格,见图6-26所示。表格的位置、大小可以通过对该表格进行适当拖放操作来调整,表格中所有数据源设置均采用系统缺省设置。图6-25添加数据环境图6-26选中学生成绩表拖放到表单中 (4)

添加交互式控件。在表单中有3个命令按钮,使用“表单控件”工具栏向表单中添加3个命令按钮(见图6-27)。3个命令按钮的位置及大小均可以进行适当的拖放调整或利用“布局”工具栏进行对齐。图6-27向表单添加3个命令按钮 (5)

为表单设置新的标题以覆盖原有的缺省标题,打开表单“属性”窗口,置表单的Caption值为“成绩表数据输入”,并且分别将3个命令按钮的“属性”显示框中Caption值设置为“添加”,“取消”,“退出”(见图6-28)。图6-28设置Commond3按钮的标题为“退出” 3.设置或添加表单中与操作有关的属性 本表单要求具有对表中的记录进行添加操作的功能,而且可以取消这一添加操作。要实现这一功能有许多方法和技巧,这里介绍一种新建表单属性的方法。 该表单要随时确定是否有添加操作以及所添加记录的记录号,以便在事件代码中进行判断和相应的处理。由于在每个事件中,变量若没有特殊定义都只具有本地属性(Local),在其他事件中不能调用本事件的变量。于是许多人想到用公用属性(Public)来定义临时变量,但公用属性的变量可以在系统的任何一个模块中使用,一旦使用不当,势必将引起整个系统的混乱。 在此种情况下,我们选择采用向表单添加新属性的方法,即增添一个属性变量,然后用这个属性变量来充当本表单内全局变量的角色。这样既可以在表单的所有事件中引用新添加的属性变量,又不会造成系统混乱。 在“学生成绩表”表单中新增加属性的步骤如下: (1)

选取“表单”/“新建属性”(见图6-29),打开“新建属性”对话框。 在“新建属性”对话框中分别添加两个新属性:判断是否添加新记录的操作变量ADD(逻辑型,缺省的数据值为逻辑假)和新添加记录的记录号R(数值型),见图6-30。图6-29选择添加属性选项图6-30新属性添加 4.编制与操作有关的事件代码1)

编制数据环境的事件过程代码 本例要求实现删除新添加新记录的操作。在VFP中,删除操作分为物理删除和逻辑删除两种。如果只使用逻辑删除命令,可能会在数据表中留下许多废记录,这不利于表的有效管理。因此,在我们设计的系统中最终要物理删除这些废记录,要用命令Pack除去打了删除标记的记录。由于VisualFoxpro是一个多用户环境,而要使用Pack命令必须独占表文件,也就是说在打开表文件时必须采用独占方式。为此,我们在数据环境中打开表文件之前的事件(BeforeOpenTables事件)中设置表的打开方式,见图6-31、图6-32。图6-31数据环境事件图6-32数据环境事件过程代码 2)编制表单的事件过程代码 本例中要求除了添加记录期间外,其他时间都只能以只读方式浏览表内容。实现时,可在添加记录期间将表格的Readonly属性设置为“假”,其他时间设置为“真”。为了有效地控制输入和删除,还要将表格的AllowAddNew属性设置为“假”,以防止用户按下光标键时自行添加记录,将表格中的DeleteMark属性设置为“假”,以防止用户删除记录。所有上述属性的设置都选择在表单的Init事件中进行(见图6-33,图6-34)。在Form1的初始化事件Init()中,我们还对对象Grid1的属性做了初始化,并为新添加的属性Add和R分别赋上初始值。图6-33表单的初始化事件(Init)图6-34表单的初始化(Init)事件代码 3)控件的对应事件编程 用户的主要操作多数集中在控件对象中进行。在本设计中,有3个控件“添加”、“取消”,“退出”,可用于接受用户的触发事件。 当用户单击“添加”按钮时,应实现记录的添加操作,包括: (1)

将表格中Readonly属性设置为“假”; (2)

向表中追加一个空记录:Appendblank; 将表单属性Add和R分别重新设置为“真”和Recno(); (1)

将输入的焦点指向新添加的记录的第一个字段上; (2)

刷新表单的数据(按新值显示)。 对应的事件过程代码见图6-35。图6-35“添加”命令按钮的Click事件过程代码 当用户单击“取消”按钮时,应该实现删除新添加记录的操作,包括: (1)

根据表单属性Add和R判断是否为新添加的记录,如果是则执行删除命令Delete将该记录删除; (2)

将表单属性Add和R重新设置为.F.和0; (3)

判断结束后,将表格中Readonly属性设置为“真”; (4)

刷新表单数据,使按新值显示。 对应的事件过程代码见图6-36所示。 当用户单击“退出”按钮时,应实现物理删除记录并做释放表单的操作: (1)

执行命令Pack; (2)

释放表单。 对应的事件过程代码见图6-37。图6-36“取消”命令按钮的Click事件过程代码图6-37“退出”命令按钮的Click事件过程代码 5.运行及调试 设计结束后,将表单等存盘并开始运行调试。 这个表单可在表单设计器中直接运行(单击常用工具栏中图标),也可以退出表单设计器,在VisualFoxpro的命令窗口中用命令DoForm“文件名”来运行。在表单的运行过程中反复测试每个命令按钮,直至完成该表单的全部功能都能顺利完成。 6.7.2设计方法二 1.确定界面效果 按照题目的要求并依照前面介绍的考虑要点,经过分析我们还可以勾画出图6-38所示的另一个“学生成绩表”信息输入表单。在本小节中,我们将设计实现这个表单。图6-38学生成绩表输入界面 2.创建表单的界面布局 与上一小节中所设计的表单界面不同,本节要设计的表单界面中没有使用表格,而是使用了多种控件来显示信息。因此在本节中,表单界面设计的主要任务按要求加入不同的控件。具体设计步骤如下: (1)

任意选用一种方法,例如在“命令”窗口键入createformxssr4命令,进入表单设计器。 (2)

按设计方法一中的介绍步骤添加数据环境。

(3)

添加数据显示控件:添加这些控件比较简单的方法是直接选数据环境中“学生成绩表”的对应字段并拖放到表单中。如果位置及大小不合要求,可进行适当的拖放调整,见图6-39。所有控件数据源都采用系统缺省设置,以课程名为例,其显示控件自动绑定数据源,见图6-40所示。图6-39数据环境中选定字段直接拖到表单中图6-40课程名绑定控件数据源 (1)

添加交互操作控件。按图6-38所示的位置,使用表单设计器中的“表单控件”工具栏向表单中添加5个命令按钮。 (2)

设置表单或控件标题。为表单、显示信息的控件和命令按钮设置新的标题以覆盖原有的缺省标题。设置标题的操作步骤与设计方法一中的相应步骤相同。只是增加了设置标题的字型属性FontName和字号属性FontSize的操作。 (6)修饰表单。在图6-38中,我们看到5个命令按钮被一个线框围了起来。这个线框起到了一定的装饰作用,同时对用户操作也有一定的指导作用。使用表单设计器“表单控件”工具栏中的形状控件Shape可以在表单中添加方框形状(其属性Curvature的值为0),方框的位置及大小可以进行适当的拖放调整(见图6-41)。设计时有可能发现当将方框套在5个命令按钮上之后,有时就看不到5个命令按钮了,这时,只要选择“格式”菜单中的“置后”选项,将方框置于命令按钮后方,就可以再次看到这5个命令按钮。图6-41向表单中添加方框形状 为了美观起见,在设计时可以为线框添加一些立体效果。线框的不同效果是通过把线框的BorderStyle属性、BorderWidth属性和SpecailEffect设置为不同的值来实现的。其中BorderStyle属性指定线框的样式,如实线、虚线等,BorderWidth属性指定线框的宽度,SpecailEffect属性指定其不同格式,如平面或0~3维。一般情况下,将BorderStyle属性设置为1,BorderWidth属性设置为1,SpecailEffect属性设置为0~3维即可达到线框的立体效果(见图6-42)。图6-42设置线框的立体效果 3.设置或添加与操作有关的属性 (1)

添加属性。与设计方法一中相应步骤相同,我们采用向表单中添加新属性的方法将是否有添加操作的逻辑型属性ADD和添加记录的记录号R(数值型)添加到表单中。新添加属性的缺省值为逻辑型“假”,可以在属性窗口中重新设置或在事件或方法过程代码中重新设置这些属性的值。 (2)

设置属性。与设计方法一中相应步骤相同,其他不变的属性都采用系统的缺省设置值,而在表单运行过程中要发生变化的属性将在事件或方法过程代码中设置。 4.编制与操作有关的事件过程代码 1)编制数据环境的事件过程代码 与设计方法一中的相应步骤相同,选用数据环境中的BeforeOpenTables事件实现独占方式打开表(见图6-43)。图6-43编制数据环境的事件代码 2)编制表单的事件过程代码 由于题目要求除了在添加记录期间外都以只读方式浏览表内容,因此在实现时,可以在添加记录期间把表单中用于显示数据控件的ReadOnly属性设置为“假”,而其他时候设置为“真”。同时,我们还要为新添加的表单属性设置初值。这些设置都在表单的Init事件中实现(见图6-44)。图6-44编制表单初始化的Init事件 3)编制控件的事件过程代码 用户的主要操作大多集中在控件对象上。在本表单中共设计了5个命令按钮,用于接受用户的触发事件。当用户单击“添加”按钮时,应该实现记录的添加操作: (1)

将表单中用于显示数据的文本框的ReadOnly属性设置为“假”,并将“后翻”按钮的Enable属性为“假”,因为这时记录指针已经在最后一个记录上了,应禁止向后翻页操作; (2)

向表中追加一个空记录:APPENDBLANK; (3)

将表单属性ADD和R重新设置为“真”和RECNO()。 (4)

将输入焦点指向新添加的记录的第一个字段上。 (5)

刷新表单的显示内容,使其按新值显示。 对应的事件过程代码见图6-45。图6-45“添加”命令按钮的Click事件代码 当用户单击“取消”按钮时,应该实现删除添加记录的操作。对应的事件过程代码见图6-46。图6-46“取消”命令按钮的Click事件代码 当用户单击“退出”按钮时,应该实现记录的物理删除操作并释放表单: (1)

退出前判断一下当前记录的首字段是否无值,如果是,将其删除,以确保表中信息的有效性; (2)

执行PACK命令; (3)

释放表单。 对应的事件过程代码见图6-47。图6-47“退出”命令按钮的Click事件代码 当用户单击“前翻”按钮时,应该实现记录的向前翻页操作: (1)

将表单中用于显示数据的文本框的ReadOnly属性设置为“真”,并将“后翻”按钮的Enabled属性设置为“真”,因为这时记录指针已经离开最后一个记录,因此,允许向后翻页操作; (2)

将表单属性ADD和R重新设置为“假”和0; (3)

判断记录指针是否指到了表头,如果不是,记录指针向前跳一个记录,否则,将当前按钮(“前翻”按钮)的Enabled属性设置为“假”; (4)

刷新表单的显示内容,使其按新值显示。 对应的事件过程代码见图6-48。图6-48“前翻”命令按钮Click事件代码 当用户单击“后翻”按钮时,应该实现记录的向后翻页操作: (1)

将表单中用于显示数据的文本框的ReadOnly属性设置为“真”,并将“前翻”按钮的Enable属性设置为“真”,因为这时记录指针已经离开首记录,因此,允许向前翻页操作; (2)

将表单属性ADD和R重新设置为“假”和0; (3)

判断记录指针是否指到了表底,如果不是,记录指针向后跳一个记录,否则,将当前按钮(“后翻”按钮)的Enable属性设置为“假”; (4)

刷新表单的显示内容,使其按新值显示。 对应的事件过程代码见图6-49。图6-49“后翻”命令按钮的Click事件代码 5.运行及调试 设计结束,将设计的表单存盘,然后分别进行运行、测试和调试等操作。运行后表单可以逐项进行测试,如前翻、后翻、添加、取消和退出。如果出现问题应该进行相应的修改并继续调试直到运行成功。 6.7.3设计方法三 1.确定界面效果 按照题目的要求并依照前面介绍的考虑要点,经过分析设计可以勾画出如图6-50所示的第三种“学生成绩表”信息输入表单。图6-50学生成绩表输入界面 2.创建表单的界面布局 按和设计方法二类似的方法创建一个新的表单,然后再添加数据环境和相应的控件。在本设计中,表单的命令按钮用命令按钮组来实现。选中命令按钮组后,单击鼠标右键选中“生成器”,在弹出的“命令字组生成器”窗口中即可设置按钮类型和布局(见图6-51,图6-52)。图6-51设置命令按钮组图6-52“命令组生成器” 很多用户在应用程序的操作过程中感到利用鼠标来选取按钮的方式不太方便。为此,可以为每个按钮设置一个快捷键。所谓快捷键就是为每个按钮指定一个字母,操作时使用键盘中Alt键再加上按钮对应的字母键就可以选中该按钮。 设置快捷键的方法是在为控件设置标题时,在标题的尾部加上“\<”符号,再输入一个字母即可。例如图6-52中,“添加”命令按钮的标题内容为“添加\<A”,则用户按下Alt+A组合键和用鼠标单击“添加”命令按钮两者执行相同的操作。另外,为了让用户知道如何使用快捷键,可在表单最后一行添加一个标签,用于快捷键操作提示。表单界面的设计效果如图6-53所示。图6-53完成设计后表单内的控件 3.设置与操作有关的属性 不变的属性都采用系统的缺省设置值,而在表单运行中要发生变化的属性,将在事件或方法过程代码中设置。 4.编制与操作有关的事件过程代码 1)编制数据环境中的事件代码 操作与前面介绍的相应步骤相同,代码见图6-55。图6-54数据环境中事件代码 2)

编制表单的事件过程代码 表单的Init事件用于处理最初在表单中显示的数据,由于最初表单显示的内容是表中首记录数据。故应该使命令按钮“首记录”和“前翻”按钮不可选。表单Init事件的代码见图6-55。图6-55表单的Init事件代码

3)编制控件的事件过程 由于采用了中一个带7个按钮的命令按钮组,因此,编制命令按钮操作代码时,可选用命令按钮组(Commandgroup1)的单击Click事件,不必逐个编制每个命令按钮的单击事件代码。命令按钮组的单击事件过程代码如下: Docase Casethis.value=1 &&用户单击第一个命令按钮(“添加”) Appendblank This.cmdfirst.enabled=.T. &&将组中“首记录” 和“后翻”命令设置为可操作

This.cmdnext.enabled=.T. Thisform.txtxh.Setfocus &&学号字段获得焦点,即光标位于该字段 Casethis.value=2 &&用户单击“删除”命令按钮 Delete If!eof() Skip Else &&记录指针到文件尾,“尾记录”和“后翻”命令不能操作 Thisform.cmdprevious.enabled=.F. Thisform.cmdlast.enabled=.F. Endif Casethis.value=3 &&用户单击“退出”命令按钮 Ifempty(Thisform.txtxh.value) &&退出前发现学号字段为空,做逻辑删除 Delete Endif Pack &&物理删除已经被逻辑删除的全部记录 Thisform.release() Casethis.value=4 &&用户单击“首记录”命令按钮 Gotop &&记录指针指向首记录 This.cmdfirst.enabled=.F. &&“首记录”、“前翻”命令按钮不可操作 This.cmdprevious.enabled=.F. This.cmdlast.enabled=.T. &&“尾记录”、“后翻”命令可操作 This.cmdnext.enabled=.T. Casethis.value=5 &&用户单击“尾记录”命令按钮 Gobottom &&记录指针指向尾记录 This.cmdlast.enabled=.F. &&“尾记录”、“后翻”命令不可操作 This.cmdnext.enabled=.F. This.cmdprevious.enabled=.T. &&“首记录”、“前翻”命令按钮可操作 This.cmdfirst.enabled=.T. Casethis.value=6and!bof() &&单击“前翻”而且记录指针没有到文件头 Skip–1 Ifbof()&&记录指针到文件头,“首记录”、“前翻”命令按钮不可操作 This.cmdprevious.enabled=.F. This.cmdfirst.enabled=.F. Endif This.cmdnext.enabled=.T. This.cmdlast.enabled=.T. CaseThis.value=7and!eof() &&单击“后翻”而且记录指针没有到文件尾 Skip Ifeof() &&记录指针到文件尾,“尾记录”、“后翻”命令按钮不可操作 This.cmdlast.enabled=.F. This.cmdnext.enabled=.F. Endif This.cmdprevious.enabled=.T. This.cmdfirst.enabled=.T. Endcase Thisform.refresh 考虑到实际记录指针移动操作中命令按钮之间存在一定的制约关系,故在上述代码中每次记录指针移动操作都详细考虑了命令按钮组中7个按钮的可选或不可选性,充分体现了面向对象程序设计逻辑思维严谨的风格。 5.运行及调试 设计结束后将设计的表单存盘,然后分别进行运行、测试和调试等操作。表单的运行情况见图6-56,图6-57所示。测试时,可逐项进行测试,如首记录、尾记录、前翻、后翻、添加、删除和退出等。图6-56单击“首记录”按钮或按下Alt+F

组合键时的运行情况图6-57单击“添加”按钮或按下Alt+F

组合键时的运行情况6.8类的设计 6.8.1类的创建 在VisualFoxpro中,创建类的具体步骤如下: (1)

打开项目管理器,选择项目管理器中的“类”选项页。 (2)

单击项目管理器的“新建”按钮,开始创建新的类。 (3)

在弹出“新建类”对话框中(见图6-58),设置要创建的子类的名称以及其父类来源,并设置存放该类的可视类库文件名称。我们在设计一个新类时,要以一个已存在的类作为基础,这个已存在的类就是父类,而我们自己创建的类就称为子类。注意,子类可以继承父类的所有功能并做新的扩充。图6-58“新建类”窗口

在图6-58所示“新建类”对话框的“派生于”框中指定父类为CommandGroup(命令按钮组),在“类名”框中指定新建类为“记录移动”,这个新建类保存在C:\vfplx\记录移动.vcx文件中。 我们新建的这个“记录移动”类中要实现的功能为向前、向后移动记录指针或将记录指针移动到首记录、尾记录。在具体程序设计中,可以直接引入创建的新类,使得移动记录操作的设计变的方便、快捷。 (4)单击“确定”按钮,弹出类设计器。在类设计器中,选中新建的“记录移动”类并用鼠标右键单击,弹出快捷菜单(如图6-59所示)。在快捷菜单选中“属性”命令,然后,在“属性”窗口中,把“记录移动”类的Buttoncount属性值修改为4(见图6-60)。图6-59类设计器窗口及快捷菜单图6-60“记录移动”类的“属性”窗口 (5)

修改类设计器中4个命令控件的控件名、标题名,并按图6-61所示调整它们的显示布局。图6-61调整控件布局 (1)

编写控件的事件代码。 “首记录”按钮的Click事件中完成的操作包括: §

将记录指针移到第一条记录; §

使“前翻”按钮变灰失去作用,这是因为记录指针跳到第一条记录后,在其前方已经没有前一条记录; §

将“后一条记录”按钮设置有效,以解决以下操作问题:若在此之前先前按下“尾记录”按钮后并使“后翻”按钮变灰,那么在按下“首记录”按钮后,应该使“后一条记录”按钮恢复为有效状态(Cmdnext.enabled=.T.)。

§

对整个表单对象或子对象进行更新操作。 “首记录”按钮的Click事件代码如下: gototop this.parent.cmdprevious.enable=.F. this.parent.cmdnext.enable=.T. thisform.refresh 在“前翻”按钮的Click事件中应完成以下操作: §

向前移动一条记录; §

判断当前记录指针是否到了文件头,若是,弹出一个对话框提示用户原先记录已经是第一条记录,而且使“前翻”按钮变灰;若不是,使“前翻”按钮有效,允许用户继续查看上一条记录;

§

设置“后翻”按钮有效; §

对整个表单对象或子对象进行更新操作。 在“前翻”按钮的Click事件代码如下: skip–1 ifbof() =messagebox("已经是第一个记录!",48,"操作提示") this.enabled=.F. else this.enabled=.T. endif this.parent.cmdnext.enabled=.T. thisform.refresh “后翻”按钮的Click事件代码为: skip ifeof() =messagebox("已经是最后一条记录了",48,"操作提示") skip–1 this.enabled=.F. else this.enabled=.T. endif this.parent.cmdnext.enabled=.T. thisform.refresh “尾记录”的按钮的Click事件的代码为: gobottom this.parent.cmdnext.enabled=.F. this.parent.cmdprevious.enabled=.T. thisform.refresh 这样就创建了一个新类“记录移动”,下面介绍在表单设计中如何调用这个类。 6.8.2类的调用 新建表单,打开表单设计器并添加数据环境,把数据环境中表的相应字段拖到表单中。打开“表单控件”工具栏,单击图标后添加新建的记录移动类库。当第二次打开表单控件工具栏后,新建的类库“记录移动”就显示在屏幕上(见图6-62)。单击“记录移动”控件的图标并拖到表单中,就生成一个现成的单表记录定位的表单(见图6-63)。图6-62添加新建的“记录移动”类图6-63利用新建类创建的表单6.9典型的表单设计 6.9.1随机抽奖程序 在电视中我们常看到计算机随机抽奖活动,主持人在电脑键盘上按下一个键,屏幕中出现一串滚动的随机数字,再按下一个键屏幕中就出现了一组激动人心的幸运数字。接下来就产生一个新的幸运星……。下面我们以随机抽奖程序为例介绍典型表单的设计。 随机抽奖程序最终要完成设计的操作界面如图6-64所示。图6-64计算机随机抽奖程序 随机抽奖程序抽出的中奖号码为5位(0~9)阿拉伯数字。在程序执行时的初始界面中按下“开始”按钮后,5个文本框中随机滚动0~9共十个阿拉伯数字,按下键盘中的空格键产生第一位幸运数字,后4个文本框中仍然随机滚动数字,再按下键盘中的空格键就可以产生第二位幸运数字,后3个文本框仍然随机滚动数字,依次操作下去……,直到产生最后一个幸运数字,并在屏幕中醒目显示该组幸运数字。

1.表单的设计 在我们要设计的表单中使用以下控件对象:使用5个文本框text1、text2、……text5来显示数字;使用2个标签lable1和lable2来提示操作方法;使用2个命令按钮command1和command2和1个计时器对象timer1。 2.对象的属性、方法和事件设置 在设计或运行时,将表单的标题属性caption设置为“祝您中奖”并且将表单的最大化属性maxbutton和最小化属性minbutton设为“假”,2个命令按钮的标题属性设置为“开始”和“退出”,将text1和text5等5个文本框的显示字体颜色为红色,这样使得演示的数字格外醒目。 在表单中新键5个属性,属性名称分别为score1,score2,score3,score4,score5作为Public变量存储产生的5个数字,它的作用域贯穿于本应用程序的所有事件或过程。 在表单中新建5个ROLL过程并分别命名为ROLL1(),ROLL2(),ROLL3(),ROLL4(),ROLL5()。ROLL()过程通过随机函数rand使文本框中的数字随机动态滚动,等待用户键入“空格键”后产生一个幸运数字并且将该数字赋值给新建的属性score。 随机函数rand的使用格式为:rand(<数值表达式>)。该函数返回一个0~1.0之间的随机数。如果<数值表达式>是个负数,由系统时钟产生一个随机“种子”。为了获得真正的随机序列,可以在使用该函数之前,先执行语句:=rand(-1)作为种子随机数产生器。另外,在ROLL()过程中使用text(i).value=int(10*rand()),在文本框中显示数字0~9。当用户键入“空格键”(空格键的ASCII码值为32),则产生一个幸运数字,退出当前的过程。 ROLL1()过程的代码如图6-65所示,ROLL2()~ROLL4()过程的代码与之类似。图6-65表单中的ROLL1()过程代码 最后一个幸运数字由ROLL5()过程产生。在ROLL5()过程中还要把计时器的Interval间隔时间设置为0,将Score1~Score5的数值转化成字符并组成一个字符串作为一组幸运数字,然后通过Messagebox消息框将这组数字显示给用户并向他(她)表示祝贺!ROLL5()过程的代码如图6-66所示。图6-66表单中的ROLL5()过程代码 为了使表单执行过程中文本框内数字能够快速显示而不产生视觉上的停顿感,我们将计时器的Interval属性设置为40(0.04秒),即每间隔0.04秒系统就会自动执行Timer()事件,在Timer()事件中顺序执行Roll1~Roll5五个过程,见图6-67。图6-67计时器的Timer事件 “开始”命令按钮Comand1和“结束”命令按钮Command2分别用于开始和结束抽奖,对应的鼠标单击事件如下: “开始”命令按钮的单击事件代码: erval=40&&设置计时器的时间间隔为0.04秒 “退出”命令按钮的单击事件代码: ifmessagebox(“你是否退出幸运大派送!”,4+32,“信息窗口”)=6 thisform.release else return endif &&在退出之前询问用户是否真正退出,若不是,则继续运行,否则退出系统 抽奖结束后,用幸运号码窗口显示抽出的数字,见图6-68。图6-68产生幸运号码窗口 6.9.2单张表的查询 1.表单的设计 本例中设计一个对学生成绩表c:\vfplx\xscj.dbf的记录进行查询的操作,查询窗口界面的设计如图6-69所示。在表单设计中共使用了4个标签、2个文本框、1个列表框、1个表格等对象。 运行时,在查询窗口左上角的文本框中输入学生成绩表的表名(c:\vfplx\xscj.dbf),应用程序在左下角的列表框中自动显示全部字段;输入查询表达式后(例如,输入“cj>80”查询成绩表中单课成绩大于80分的学生成绩),在右下角的Grid表格中显示满足查询条件的所有记录,见图6-70所示。图6-69表查询窗口界面图6-70查询窗口实际运行效果 2.事件过程代码 表单的Init事件过程代码主要用于控制程序执行后表单的初始化界面。在初始化界面中,先显示列表框、列表框的标题,表格、表格的标题则不显示,如图6-71所示。Init事件的过程代码如图6-72所示。图6-71运行时表查询窗口的初始化界面图6-72表单的Init事件代码 文本框text1的Valid(验证)事件用于对用户输入的表名进行自动判断,若该表存在则自动显示该表的所有字段名,否则不允许退出操作直到输入正确的表名称为止。 Valid事件代码为: tablename=alltrim(this.value)&&取Text1的文本内容赋值给全局变量tablename iffile("&tablename")&&判断该文件是否存在 use(tablename) withthisform .label3.visible=.t. &&设置 Label3,label4,list1,grid1,label4,text2为可见 .list1.visible=.t. .grid1.visible=.t. .label4.visible=.t. .grid1.recordsource="" &&设置表格的数据源为空 .text2.text="" endwith fori=1tofcount() &&将表的所有字段名称填入List1列表框 thisform.list1.additem(field(i)) endfor use return.t. else&&若表不存在给出一个消息提示框

messagebox("你输入的表文件实际并不存在!",64,"操作提示") return.f.&&不允许退出Text1框,直至填入实际表才退出。 endif thisform.refresh 文本框text2的Valid事件控制用户输入查询条件表达式后自动显示表中经过滤后的记录等操作,过程代码见图6-73所示。查询功能操作主要利用SQL语句来实现,其格式为: select*from源表where查询条件intocursor临时表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论