1.26k likes | 1.46k Views
Chongqing University of Arts & Sciences. Visual Foxpro 程序设计. 第七章 表单与控件设计. VFP 的可视化开发环境将 Windows 编程的复杂性隐蔽起来,使得开发者可以将主要精力放在实现应用功能上,从而大大提高了应用软件的开发效率。 VFP 应用软件界面主要包括表单、工具栏和菜单。 VFP 表单实际是软件的窗口界面。 在 VFP 可视化开发环境下建立应用软件的一般步骤如下:①建立一个表单或者表单集,设置它们的外观尺寸,以形成 Windows 软件界面。
E N D
Chongqing University of Arts & Sciences Visual Foxpro 程序设计
VFP的可视化开发环境将 Windows 编程的复杂性隐蔽起来,使得开发者可以将主要精力放在实现应用功能上,从而大大提高了应用软件的开发效率。 VFP应用软件界面主要包括表单、工具栏和菜单。VFP表单实际是软件的窗口界面。 在VFP可视化开发环境下建立应用软件的一般步骤如下:①建立一个表单或者表单集,设置它们的外观尺寸,以形成Windows软件界面。 ②为表单(集)设置数据环境,数据环境规定表单与数据表的相关性。 7.1 表单设计方法与步骤
③根据软件功能要求,在表单中分配一些控件对象。原则是美观、清晰、符合操作习惯。 ④设置每一个控件的关键属性值,如外观特征、数据控制源、标题、是否可见等。 ⑤设置表单中各个控件的默认操作顺序。 ⑥设计对象的事件驱动程序,也就是这些事件一旦发生,将完成什么功能。 ⑦将其他的菜单、工具栏与表单或表单集联系在一起,用一个主程序驱动,构成一个完整的Windows应用程序。
表单的创建可以采用2种方法:表单向导和表单设计器。表单向导可以建立2种固定格式的表单:为单个表创建操作数据的表单和为2个相关表创建操作数据的表单。表单向导可以帮助初学者直观认识表单的形成,但没有实用价值。本节主要介绍利用表单设计器创建表单,主要操作步骤为:表单的创建可以采用2种方法:表单向导和表单设计器。表单向导可以建立2种固定格式的表单:为单个表创建操作数据的表单和为2个相关表创建操作数据的表单。表单向导可以帮助初学者直观认识表单的形成,但没有实用价值。本节主要介绍利用表单设计器创建表单,主要操作步骤为: 1)启动表单设计器新建表单 在项目管理器中选择【文档】选项卡中的【表单】选项,再单击【新建】按钮,在弹出的【新建表单】对话框中单击【新建表单】按钮。 选择【文件】菜单中的【新建】命令,则弹出【新建】对话框,在该对话框中选择【表单】,再单击【新建文件】按钮。 在【命令】窗口输入:create form。 7.1.1 用表单设计器创建表单的主要步骤
以上3种方法都可以打开表单设计器,同时打开一个默认表单文件,初始表单名称是“Form1”,如下图所示。以上3种方法都可以打开表单设计器,同时打开一个默认表单文件,初始表单名称是“Form1”,如下图所示。
打开表单设计器后,VFP主菜单和工具栏中自动产生【表单】菜单和表单工具栏,如下图所示为表单工具栏。打开表单设计器后,VFP主菜单和工具栏中自动产生【表单】菜单和表单工具栏,如下图所示为表单工具栏。
2)设置数据环境 通过把与表单相关的表或视图放进表单的数据环境中,可以自动建立控件与表或视图中的字段关联,方便表单设计和运行期间的数据管理。 在选择【显示】菜单中的【数据环境】命令,打开数据环境设计器窗口。第一次打开数据环境设计器窗口时,要求打开一个数据表。可以向数据环境设计器窗口添加、移去数据表或者视图。 完成数据环境的设置后,数据设计器窗口通过常用控件的控制源属性(ControlSource)显示可用的表和字段,如文本框控件的ControlSource。
3)快速生成控件 表单是一个容器对象,需要向其中添加控件。在表单中快速生成控件的方法如下: 选择【表单】菜单中的【快速表单】命令。 在表单设计器工具栏中选择【表单生成器】按钮。 以上2种方法均可打开【表单生成器】对话框,如下图所示。
从【字段选取】选项卡中选定需要在表单中显示和编辑的字段;在【样式】选项卡中选择控件样式,如下图所示。然后单击【确定】按钮即可在表单中生成控件。从【字段选取】选项卡中选定需要在表单中显示和编辑的字段;在【样式】选项卡中选择控件样式,如下图所示。然后单击【确定】按钮即可在表单中生成控件。 另外,也可以在【数据环境设计器】中,将一个表或者一个字段,或者若干字段,直接拖动到表单上,快速生成控件。
4)手工添加控件 如下图所示,在表单控件工具栏中单击一个控件按钮,然后在表单中,单击鼠标左键,该控件就被添加到表单中。通常需要对这种控件设置属性或者编写事件驱动程序。
可以同时添加多个相同控件,具体操作是:单击【按钮锁定】按钮,单击一个需要添加的控件,如文本框,然后在表单区域的不同位置,单击鼠标,产生多个文本框控件。要关闭按钮锁定,可再次单击【按钮锁定】按钮。可以同时添加多个相同控件,具体操作是:单击【按钮锁定】按钮,单击一个需要添加的控件,如文本框,然后在表单区域的不同位置,单击鼠标,产生多个文本框控件。要关闭按钮锁定,可再次单击【按钮锁定】按钮。
5)保存和运行表单 • 选择【文件】菜单中的【保存】命令,或者按常用工具栏中的【保存】按钮,均可保存表单文件。在【另存为】对话框中输入表单文件的名称,默认为“表单1”。 • 表单设计好后,可以运行以测试它的功能。运行表单的方法有2种: • 通过选择【表单】菜单中的【执行表单】命令; • 在【命令】窗口执行命令: • DO Form <表单文件名>
【例 7.1】 快速建立一个显示和修改“学生档案表”部分信息的窗口程序。 • 操作步骤如下: • ①打开表单设计器,新建一个表单。 • ②打开数据环境设计器,添加数据表“dab.dbf”。 • ③选择表中的字段:学号、姓名、性别、专业班级(具体方法是按住Ctrl键,再用鼠标单击对应的字段名称)。 • ④拖动它们到表单中(靠左上位置),自动形成一个“表格”。 • •
⑤在【表单控件】窗口添加一个“命令按钮”到“表格”正下方,双击“命令按钮”打开代码窗口,输入代码:⑤在【表单控件】窗口添加一个“命令按钮”到“表格”正下方,双击“命令按钮”打开代码窗口,输入代码: • thisform.release • 然后保存并关闭代码窗口。 • ⑥保存这个表单,表单文件名为:formExample1.scx。 • ⑦运行这个表单。命令方式是:DO Form formExample1。
(a) (b) formExample1表单设计的界面如图(a)所示,运行结果如图(b)所示。运行此表单后,可以浏览和修改学生档案数据,单击“Command1”按钮将关闭窗口。
在设计表单的过程中,需要频繁编辑其中的控件,先用以下3种方法打开一个表单文件及表单设计器。在设计表单的过程中,需要频繁编辑其中的控件,先用以下3种方法打开一个表单文件及表单设计器。 在项目管理器中选择【文档】选择卡中的【表单】,选中一个表单名,单击【修改】按钮。 选择【文件】菜单中的【打开】命令、弹出【打开】对话框,在【打开】对话框中选择【文件类型】为“表单(*.scx)”,在文件列表中选择一个表单文件,单击【确定】按钮。 在【命令】窗口中输入命令:modify form <表单文件名>。 利用表单工具栏和控件工具栏,能容易地修改表单的状态,移动和调整控件的大小,复制或删除控件、对齐控件等。 7.1.2 编辑表单中的控件
(1)选择控件 将鼠标指针指向控件上的任意位置并单击。控件被选中后其周围出现8个尺寸控点。 (2)同时选择多个控件 在所选控件的周围拖动鼠标指针,画一个框,或者按住Ctrl键,再单击选择若干控件。 (3)移动控件 直接用鼠标拖动控件到新的位置。 (4)改变控件的大小 选定控件,拖动尺寸控点,以增加或减少该控件的长度、宽度或整体尺寸。
(5)复制控件 选定控件,选择【编辑】菜单中的【复制】命令,再选择【粘贴】命令。允许多次粘贴同一个控件。 粘贴后生成的控件需要移动到合适的位置上。 (6)删除控件 选定控件,按Delete键,或者选择【编辑】菜单中的【剪切】命令。
(7)对齐一组控件 利用布局工具栏上的按钮,很容易精确排列表单上的控件。例如,要使一组控件水平对齐或垂直对齐,或使一组相关控件具有相同的宽度或高度。要对齐控件,可先选定一组控件,然后在布局工具栏上选择一个布局按钮。布局工具栏如图所示。
VFP中的事件包括用户事件和系统事件。用户事件是由用户的特定操作引发的,如鼠标单击、按下一个键等;系统事件是由系统自动产生的,如异常错误事件、初始化事件等。每个控件对象都可以对各种事件进行识别和响应。可视化程序设计的主要任务之一就是编写对某个事件的响应代码,又称为事件驱动程序设计。 在表单设计器中规划控件,称为表单的设计期。运行表单时,用户操作表单及其控件的过程,称为运行期。在设计期必须要考虑到表单及控件在运行期的事件驱动状态,要注意有一部分的“事件”是由表单及控件运行期间顺序自动产生的,即系统事件。是否需要对这些事件进行程序编码,以响应特别的功能,是事件驱动程序设计的难点。 7.1.3 表单与控件的事件驱动模型
一个表单在运行期自动产生的主要“系统事件”触发顺序,即表单与控件的事件驱动模型。一个表单在运行期自动产生的主要“系统事件”触发顺序,即表单与控件的事件驱动模型。 当表单运行时,首先初始化每个控件,然后初始化表单。表单首先被打开,第一个控件开始接收输入焦点。以后的事件主要由用户的操作来触发。结束表单运行时,将反方向释放控件和表单。书上表7.1列出了VFP主要事件的触发顺序。 通过事件驱动模型,可以理解表单及控件在运行期间各种“事件”的触发顺序,为程序设计的逻辑提供一个参考。
容器与控件的事件驱动原则: • 容器不处理与所包含的控件相关联的事件。 • 若没有与某控件相关联的事件代码,则 VFP在该控件所在类的层次结构中逐层向上检查是否有与此事件相关联的代码。 • 当用户以任意一种方式(使用 Tab 键将焦点移到控件、单击鼠标或将鼠标指针移至控件上等)与对象交互时,对象事件被触发。每个对象只接收自己的事件。
【例7.2】 利用表单的标题、宽度、高度、左边距设计一个标题和尺寸逐步变化的窗口。运行该程序后,显示一个表单,标题是“Form1”。在窗口内单击鼠标,窗口往左移,标题改为“中国必胜” ;在窗口内双击鼠标,窗口标题改为“还没有进球”,同时尺寸改变。在键盘上任意按一键,程序结束。 操作步骤如下: ①创建一个表单。 ②在表单的【属性】窗口,改变Caption、Top、left 3个属性的值,并观察它们的初值。
③在名称栏找到【Click Event】,双击它,打开代码窗口,输入以下代码: if thisform.left<400 thisform.left=thisform.left+60 else thisform.left=0 endif thisform.caption=′!!!!!中国必胜 !!!!!′ 单击事件的代码含义是:如果左边距小于400,对其增加60,否则值为0,标题值设置为“中国必胜”。其作用是单击鼠标一次,使窗口往右边移动60像素点。
⑤在名称栏找到【Dblclick Event】,双击它,打开代码窗口,输入以下代码: thisform.caption=′??? 还没有进球 ???′ if thisform.width<800 thisform.width=thisform.width+50 else thisform.width=150 endif if thisform.height<600 thisform.height=thisform.height+30 else thisform.height=150 endif
双击事件的代码含义是:置标题为“还没有进球?”。如果窗口宽度低于800,宽度增加50,否则宽度变为150;如果窗口高度低于600,高度增加30,否则高度变为150。其作用是改变窗口的大小。双击事件的代码含义是:置标题为“还没有进球?”。如果窗口宽度低于800,宽度增加50,否则宽度变为150;如果窗口高度低于600,高度增加30,否则高度变为150。其作用是改变窗口的大小。 ⑥在名称栏找到【KeyPress Event】,双击它,打开代码窗口,输入以下代码: thisform.release 单击事件的代码含义是释放表单,结束程序运行。 ⑦保存表单,文件名为:formExample2.scx。 ⑧运行这个表单。
(1)子表单 子表单是VFP的默认表单类型,一般不需要另外设置。但对于较高级的应用,需要附带说明子表单的容器和VFP应用程序种类。VFP将应用程序分为: 多文档界面(MDI):各个应用程序由单一的主窗口组成,且应用程序的窗口包含在主窗口中或浮动在主窗口顶端。 单文档界面 (SDI):应用程序由一个或多个独立窗口组成,这些窗口均在 Windows 桌面上单独显示。 子表单的默认容器(父窗口)是VFP屏幕(Screen)。如果希望子表单的容器是顶层表单,可以将表单的 ShowWindow 属性设置为1(在顶层表单中)。 如果选择多文档界面 (MDI),可设置表单的 MDIForm 属性为“真”(.T.)。默认是“假”。 7.1.4 设置表单类型
(2)动表单 将表单的 Desktop属性设置为“真”(.T.)。默认是“假”(.F.) (3)顶层表单 将表单的 ShowWindow 属性设置为2(作为顶层表单)。 在顶层表单中显示子表单的具体方法是:首先创建顶层表单;在顶层表单的事件代码中包含 DO Form命令,指定要显示的子表单的名称。例如,在顶层表单中建立一个按钮,然后编写按钮的 Click 事件代码: DO Form MyChild 在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的 Init 事件来显示子表单,因为此时顶层表单还未激活。
常用控件是VFP为开发者提供的基类,它是设计各种子类的基础,也是在表单中设计各种对象的基础。常用控件是VFP为开发者提供的基类,它是设计各种子类的基础,也是在表单中设计各种对象的基础。 在表单中可以有2类控件:与表中数据绑定的控件和不与数据绑定的控件。当使用绑定型控件时,所输入或选择的值将保存在数据源中(数据源可以是表的字段、临时表的字段或变量)。要想把控件和数据绑定在一起,可以设置控制的ControlSource属性,若绑定表格和数据,则需要设置表格的RecordSource属性。 7.2 常用控件设计
7.2.1 标 签(label) 标签用于在表单中显示某些固定不变的文本信息。如要改变它的一些属性,可以通过相关对象的事件代码来实现。一个标签最多可容纳256字符。
【例 7.3】设计如下图所示程序界面。要求用鼠标单击窗口的非字符部位,当单击偶数次时,表单中显示“学生档案管理”,单击奇数次时,表单中显示“学生选课系统”。双击窗口的非字符部位,关闭窗口。
操作步骤: ①新建表单form1,其属性值如书上表7.3所示; ②在表单的合适位置添加3个标签控件label1、 label2 、label3,其属性值如书上表7.3所示; ③在表单form1的load事件的代码窗口输入代码: public xnum xnum=0
④在表单form1的click事件的代码窗口输入代码:④在表单form1的click事件的代码窗口输入代码: if xnum%2=0 ThisForm.Label1.caption='学生档案管理' else ThisForm.Label1.caption='学生选课系统' endif xnum=xnum+1 ⑤ 在表单form1的dbclick事件的代码窗口输入代码:thisform.release ⑥ 保存表单,文件名为:labelexample.scx
说明:本例通过设置表单的titlebar属性值为0,关闭标题栏的显示;通过设置表单的autocenter属性值为.T.,使得窗口运行时自动居中。说明:本例通过设置表单的titlebar属性值为0,关闭标题栏的显示;通过设置表单的autocenter属性值为.T.,使得窗口运行时自动居中。 本例的事件驱动设计是利用一个全局变量xnum来表示鼠标点击表单的次数,当鼠标点击表单的次数为偶数时, label1的标题显示为“学生档案管理”,而当鼠标点击表单的次数为奇数时,则将label1的标题变为“学生选课系统”。主要对象的属性设置如书上表7.3所示。
7.2.2 文本框(text) 文本框(Text)是最常用的基本控件,它允许用户显示和编辑一个变量或者一个字段的值,是表单上最灵活、最重要的数据交互操作控件。 文本框的值默认存储在Value属性中。可以通过ControlSource 属性指定与文本框建立联系的数据源,该数据源可以是一个变量或者数据环境中表的字段(一般是除备注型和通用型以外的各种字段)。文本框默认为字符类型,但是它可以随着ControlSource连结的变量、字段的数据类型而改变。用右键单击文本框,出现一快捷菜单,选择【生成器】命令,可以打开【文本框生成器】对话框,在该对话框中可以设置文本框采用的数据类型和格式、文本框的样式,还可以设置与文本框相关联的字段。
说明: ①InputMask 属性决定了输入到文本框中字符的特性。下表是对InputMask 属性的设置。
②若要检验文本框中的值是否有效,可在 Valid 事件代码窗口中写进相应代码。如果值无效,则返回“假”(.F.) 或 0。此时VFP自动显示一条“无效输入”信息,焦点不能离开这个文本框,直到Valid事件代码返回真为止。如果要显示自己的信息,请在 Valid 事件代码中包含 WAIT WINDOW 命令或者 MESSAGEBOX( ) 函数并且返回0值。
【例7.4】设计一个计算3门功课成绩的平均值和总分的窗口程序,如下图所示。【例7.4】设计一个计算3门功课成绩的平均值和总分的窗口程序,如下图所示。
操作步骤如下: ①新建表单form1。 ②在表单的合适位置添加5个标签控件,5个文本框text1、text2、text3、text4、text5,部分属性值见书上表7.6所示。 ③在表单form1的load事件的代码窗口输入代码: public x1,x2,x3 x1=0 x2=0 x3=0 ④在文本框text4的gotfocus事件的代码窗口输入代码: thisform.text4.value=(x1+x2+x3)/3
⑤在文本框text5的gotfocus事件的代码窗口输入代码: ⑤在文本框text5的gotfocus事件的代码窗口输入代码: thisform.text5.value=x1+x2+x3 ⑥在表单form1的click事件的代码窗口输入代码: thisform.release ⑦保存表单,文件名为:textexample.scx。 说明:本例中5个文本框均通过文本框生成器设置为可以接收数值型数据,字体颜色等可以根据需要自己设定;光标移动到Text4、Text5时,会触发文本框的gotfocus事件,自动完成计算;在表单空白处单击鼠标左键,表单会自动关闭。主要对象的属性设置见书上表7.6所示。
7.2.3 命令按钮/命令按钮组 1)命令按钮 命令按钮(Command Button)主要起到控制作用,完成特定的操作。比如打开或者关闭一个表单、打印一份报表等等。一般在命令按钮的click事件中编写过程代码,鼠标点击命令按钮,执行该过程代码,完成指定的功能。
常用命令按钮属性如下表所示 说明:命令按钮的ToolTipText属性设置后,必须要设置表单的ShowTips属性为.T.才起作用。
2)命令按钮组 命令按钮组(Command Group)将若干个相关联的命令按钮组织起来,可以一次性设置共同的属性,只对特殊部分单独操作。在命令按钮组的生成器对话框中可以设置该控件的命令按钮数目及命令按钮的布局。常用命令按钮组属性如下表所示。
通常为共同主题的若干命令按钮设置一个命令按钮组,再对其中的每个命令按钮的Click事件编写程序代码。允许让组中所有命令按钮响应一个 Click 事件(命令按钮组),各按钮的Click 事件代码集中在一个按钮组的Click Event代码窗口中。命令按钮组的 Value 属性指明单击了哪个按钮。
【例7.5】设计一个学生基本情况浏览窗口程序,如下图所示。学生基本情况包括:学号、姓名、性别、出生日期。设计一个包含4个按钮的命令按钮组,1个独立的命令按钮,分别代表对记录指针的操作,以改变显示内容,从左至右分别表示:“第一条”、“上一条”、“下一条”、“最后一条”和“关闭”。
操作步骤: ① 新建表单form1,设置其ShowTips属性为.T.; ② 打开表单的【数据环境设计器】窗口,将学生档案表dab.dbf添加到表单中; ③ 在【数据环境设计器】窗口,将学生档案表dab.dbf中的字段学号、姓名、性别、出生日期分别拖到表单中的合适位置,即分别添加了如上图所示的标签控件和对应的文本框控件; ④ 在表单的合适位置添加一个命令按钮组Commandgroup1,其中分别包含4个按钮Commandgroup1.command1、Commandgroup1.command2、Commandgroup1.command3、Commandgroup1.command4和一个命令按钮command1,其属性值的设置见书上表7.9所示;
⑤ 在命令按钮组Commandgroup1的click事件的代码窗口输入代码: do case case This.Value = 1 &&表示第一个按钮“第一条” go top case This.Value = 2 &&表示第二个按钮“上一条” if bof() go bottom else skip -1 endif