860 likes | 1.01k Views
第八章 表单设计. 8.1 设计表单. 8.1.1 设置数据环境. 8.1.2 创建单文档和多文档界面. 8.1.3 用表单集扩充表单. 返回. 退出. 8.1 设计表单. 表单又称为界面或窗体,是 VFP 提供的一种功能强大的界面。各种对话框和窗口都是表单的不同表现形式。它可以使用户在简单明了的界面中查看数据或将数据记录输入到表中。在表单设计器中可以处理下列内容: ■表单中不同类型的对象 ■与表单相关联的数据 ■顶层表单或子表单 ■能一起操作的多个表单 ■基于自定义模板的表单
E N D
8.1 设计表单 8.1.1 设置数据环境 8.1.2 创建单文档和多文档界面 8.1.3用表单集扩充表单 返回 退出
8.1 设计表单 表单又称为界面或窗体,是VFP提供的一种功能强大的界面。各种对话框和窗口都是表单的不同表现形式。它可以使用户在简单明了的界面中查看数据或将数据记录输入到表中。在表单设计器中可以处理下列内容: ■表单中不同类型的对象 ■与表单相关联的数据 ■顶层表单或子表单 ■能一起操作的多个表单 ■基于自定义模板的表单 表单和表单集是拥有自己的属性、事件和方法程序的对象,在表单设计器中可以设置这些属性、事件和方法程序。表单集包含了一个或多个表单,可以将它们作为一个整体来操作。例如,如果一个表单集中有四个表单,可以在运行时用一个命令来显示或隐藏它们。 可以通过表单向导、表单设计器和快速表单来创建表单。可以
用如下的三种方法之一新建一个表单: ■在“项目管理器”中选定“表单”,并选择【新建】按钮。 ■在【文件】菜单中选择【新建】命令,再选定“表单”,再选择【新建文件】按钮。 ■使用CREATE FORM命令。 通过项目管理器创建表单示例 “表单设计器”窗口 3、单击【新建】 1、选择“文档”选项卡 在新表单(Form1)上可以可视化地添加控件并进行属性、方法程序设计。 新表单 2、选择“表单” 4、进入新建表单程序,弹出“新建表单”对话框 单击
8.1.1 设置数据环境 每一个表单或表单集都包括一个数据环境(Data Environment)。数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。 在表单运行时,数据环境可以自动打开、关闭表或视图。而且,通过设置“属性”窗口中ControlSource(指定与对象对立联系的数据源)属性设置框,在这个属性框中列出了数据环境中的所有字段,数据环境将帮助设置控件用的ControlSource属性。 1、常用数据环境属性
2、向数据环境设计器中添加表或视图 向数据环境设计器中添加表或视图时,可以看到属于表或视图的字段或索引。若要向数据环境中添加表或视图,可以按如下步骤来进行: (1)打开“数据环境设计器”,从“数据环境”菜单中选择“添加” 1、在表单上右击,弹出表单的快捷菜单 单击打开图片 2、在快捷菜单中单击“数据环境”菜单项,打开“数据环境设计器” 4、在此框中选择Student后单击【添加】 3、添加表或视图的方法与建立查询时添加表或视图相同
在关闭了“添加表或视图”对话框后,若还想向“数据环境”中添加表或视图,可采用以下方法之一:在关闭了“添加表或视图”对话框后,若还想向“数据环境”中添加表或视图,可采用以下方法之一: ■在“数据环境设计器”中右击,打开数据环境的快捷菜单,从中选择“添加”菜单项,将“添加表或视图”对话框再次打开,添加方法与上述相同。 ■ 在“数据不境设计器”处于激活状态时,系统菜单上会有【数据环境】菜单,可以单击【数据环境】|【添加】将“添加表或视图”对话框再次打开。 ■将要添加的表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。 若已将“数据环境设计器”关闭了,要添加表或视图时,除了用前文所介绍的在表单上右击打开表单的快捷菜单,用快捷菜单操作以外,也可以在系统菜单上单击【显示】|【数据环境】,将“数据环境设计器”打开,打开了“数据环境设计器”后的添加方法与上相同。 当“数据环境设计器”处于活动状态时,“属性”窗口会显示与数
单击 对象选择框 据环境相关的对象及属性。在“属性”窗口的“对象”框中,数据环境的每个表或视图,表之间的每个关系,以及数据环境本身均是各自独立的对象。 要打开“属性”窗口,可以在表单或“数据环境设计器”中右击,在快捷菜单上选择【属性】菜单项 选项卡 属性或方法程序列表 属性值或方法程序 单击打开动画 在“数据环境设计器”中右击,打开快捷菜单。 属性及方法程序功能说明 单击【属性】菜单项打开“属性”窗口。
3、从数据环境设计器中移去表 当将表从数据环境中移去时,与这个表有关的所有的关系也随之移去。若要将表和视图从数据环境设计器中移去,可以: (1)在“数据环境设计器”中选择要移去的表或视图。 (2)在“数据环境”快捷菜单中选择【移去】命令。 在“数据环境设计器”中选择要移去的表或视图。 在选定表或视图上右击,打开快捷菜单。 单击【移去】
4、在数据环境设计器中设置关系 如果添加进数据环境设计器的表具有在数据库中设置的永久关系,这些关系将自动地加到数据环境中。如果表中没有永久的关系,可以在数据环境设计器中设置这些关系。 要在数据环境设计器中设置这些关系,可以将字段从主表拖到相关表中的相匹配的索引标识上。也可以将字段从主表拖到相关表中的字段上。如果和主表中的字段对应的相关表中没有索引标识,系统将提示是否创建索引标识。 1、先向表单的“数据环境设计器”添加两个表,如图 按“学号”字段设置Student表与Grade表的一对多关系: 在“数据环境设计器”中的Student表中选择“学号”字段 并将其拖到Grade表的“学号”字段上。 右击表间的关系连接线打开快捷菜单
表达式生成器按钮 取消按钮 确定按钮 属性选择框 在快捷菜单中单击“属性”,打开属性窗口: 在属性选择列表中选择OneToMany 单击“属性选择框”弹出属性值 选择.T.-真 如果在建立关系前Grade表没有按关联字段(学号)建立索引,则在将“学号”从Student表中拖到Grade表时将弹出对话框: 将两表设置为一对多关系 单击【确定】时系统将先按“学号”为Grade表建立索引,然后才建立两表间的关系。 父表别名
5、在数据环境设计器中编辑关系 在数据环境设计器中设置了一个关系后,在表之间将有一条连线指出这个关系。 若要编辑关系的属性,可在“属性”窗口中从属性列表框选择要编辑的关系。 关系的属性对应于SET RELATION和SET SKIP命令中的子句和关键字。 RelationalExpr(指定基于父表中的字段而又与子表中的索引相关的表达式)属性的默认设置为主表中主关键字字段的名称。如果相关表是以表达式作为索引的,就必须将RelationalExpr属性设置为这个表达式。例如,如果相关表以UPPER(cust_id)作为索引,就必须将RelationalExpr属性设置为UPPER(cust_id)。 如果关系不是一对多关系,必须将OneTOMany属性(指定是否只有在子表中遍历了所有相关记录之后才移动父表记录的记录指针)设置为“假”(.F.)。这对应于使用SET RELATION命令时不发出SET SKIP命令。 将关系的OneToMany属性设置为“真”(.T.),相当于发出SET SKIP命令。当浏览父表时,在记录指针浏览完子表中所有的相关记录之前,记录指针一直停留在同一父记录上。 注意:如果在表单或表单集中想设置一对多关系,必须将OneToMany属性设置为“真”(.T.),甚至在数据库中已经建立了永久一对多关系时也必须如此。 返回
8.1.2 创建单文档和多文档界面 VFP允许创建两种类型的应用程序: ■多文档界面(MDI)各个应用程序由单一的主窗口组成,且应用程序的窗口包含在主 窗口中或浮动在主窗口顶端。VFP基本上是一个MDI应用程序,带有包含于VFP主窗口中的命令窗口、编辑窗口和设计器窗口。 ■单文档界面(SDI)应用程序由一个或多个独立窗口组成,这些窗口均在Windows桌面上单独显示。Microsoft Exchange即是一个SDI应用程序的例子,在该软件中打开的每条消息均显示在自己独立的窗口中。 由单个窗口组成的应用程序通常是一个SDI应用程序,但也有一些应用程序综合了SDI和MDI的特性。例如,VFP将调试器显示为一个SDI应用程序,而它本身又包含了自己的MDI窗口。 为了支持这两种类型的界面,VFP允许创建以下几种类型的表单: ■子表单:包含在另一个窗口中,用于创建MDI应用程序的表
表单。子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。表单。子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。 ■浮动表单:属于父表单(主表单)的一部分,但并不是包含在父表单中。而且,浮动表单可以被移至屏幕的任何位置,但不能在父窗口后台移动。若将浮动表单最小化时,它将显示在桌面的底部。若父表单最小化,则浮动表单也一同最小化。浮动表单也可用于创建MDI应用程序。 ■顶层表单:没有父表单的独立表单,用于创建一个SDI应用程序,或用作MDI应用程序中其他子表单的父表单。顶层表单与其他Windows应用程序同级,可出现在其前台或后台,并且显示在Windows任务栏中。 1、指定表单类型 创建各种类型表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且还需指定是否是MDI类的子表单,
即指出表单最大化时是如何工作的。如果子表单是MDI类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单以及工具栏。非MDI类的子表单最大化时将占据父表单的全部用户区域,但仍保留它本身的标题和标题栏。 若要建立一个子表单,可以: ■用“表单设计器”创建或编辑表单。 ■可将表单的ShowWindow属性设置为下列值之一: ● 0-在屏幕中:子表单的父表单将为VFP的主窗口。 ● 1-在顶层表单中。当子窗口显示时,子表单的父表单是活动的顶层表单。如果希望子窗口出现在顶层表单窗口内,而不是出现在VFP主窗口内时。可选用该项设置。
■如果希望子表单最大化时与父表单组合成一体,可设置表单的MDIForm属性(指定表单是否为MDI窗口)为“真”(.T.);如果希望子表单最大化时仍保留为一独立的窗口,可设置表单的MDIForm属性为“假” (.F.)。 浮动表单是由子表单变化而来。若要指定为浮动表单,可以: ■用“表单设计器”创建或编辑表单。 ■可将表单的ShowWindow属性设置为以下值之一: ●0-在屏幕中。浮动表单的父表单将出现在VFP主窗口。 ●1-在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表 单。 ■将表单的DeskTop属性(指定表单是否包含在VFP主窗口中)设置为“真” (.T.)。 若要指定顶层表单,可以: ■用“表单设计器”创建或编辑表单。 ■将表单的ShowWindow属性设置为“2-作为顶层表单”。
2、显示位于顶层表单中的子表单 如果所创建的子表单中的ShowWindow属性设置为“1-在顶层表单中”,则不需直接指定一顶层表单作为子表单的父表单。而是在子窗口出现时,VFP指派成为该子表单的父表单。 若要显示位于顶层表单中的子表单,可以: ■创建顶层表单。 ■在顶层表单的事件代码中包含DO FORM命令,指定要显示的子表单的名称。例如,在顶层表单中建立一个按钮,然后在按钮的Click事件代码中包含如下的命令,如图所示: 注意:在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的Init事件来显示子表单,因为此时顶层表单还未激活。 ■激活顶层表单,如有必要,触发用以显示表单的事件。
3、隐藏VFP主窗口 在运行顶层表单时,可能不希望VFP主窗口是可视的。使用应用程序对象的Visible属性(指定对象是可见还是隐藏)按要求隐藏或显示VFP主窗口。 若要隐藏VFP主窗口,可以: ■在表单的Init事件中,包含下列代码行: Appliction.Visible=.F. ■在表单的Destroy事件中,包含下列代码行: Appliction.Visible=.T. 在某些方法程序或事件中,可使用THISFORM.Release命令关闭表单。 注意:也可以在配置文件中包含以下行,用以隐藏VFP主窗口: SCREEN=OFF 4、在顶层表单中添加菜单 若要在顶层表单中添加菜单,可以: ■创建顶层表单的菜单。 返回
■将表单的ShowWindow属性设置为“2-作为顶层表单”。■将表单的ShowWindow属性设置为“2-作为顶层表单”。 ■在表单的Init事件中,运行菜单程序并传递两个参数: Do menuname.mpr WITH oForm,LAutoRename 其中,oForm是表单的对象引用。在表单的Init事件中,THIS作为第一个参数进行传递。 LAutoRename指定了是否为菜单取一个新的唯一的名字。如果计划运行表单的多个实例,则将.T.传递给LAutoRename。 例如,可以使用下列代码调用名为mySDImenu的菜单: DO mySDImenu.mpr WITH THIS,.T. 8.1.3用表单集扩充表单 可以将多个表单包含在一个表单集中,作为一组处理。表单集有以下优点: ■可同时显示或隐藏表单集中的全部表单。 ■可以可视的调整多个表单以控制它们的相对位置。 ■因为表单集中所有表单都是在单个.SCX文件中用单独的数据
环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录指针则被更新和显示。环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录指针则被更新和显示。 注意:运行表单集时,将加载表单集所有表单和表单的所有对象。加载带着很多控件的多个表单会花几秒钟的时间。 1、创建表单集 表单集是一个包含有一个或多个表单的父层次的容器。可在“表单设计器”中创建表单集,若要创建表单集,可从“表单”菜单中,选择“创建表单集”选项。 如果不需要将多个表单处理为表单组,则不必创建表单集。创建表单集以后,则可向其中添加表单。 2、添加和删除表单 创建了表单集以后,可添加新表单或删除表单。若要向表单集中添加附加的表单,可从“表单”菜单中选择“添加新表单”。 若要从表单集中删除表单,可以: ■在“表单设计器”“属性”窗口的对象列表框中,选择要删除的
表单。 ■从“表单”菜单中选择“移除表单”。 如果表单集中只有一个表单,可删除表单集而只剩下表单。若要删除表单集,可从“表单”菜单中选择“移除表单集”。 表单以表的格式存储在.SCX后缀的文件中。创建表单时,.SCX表包含了一个表单的记录,一个数据环境的记录,和两个内部使用记录。为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集及每个新表单添加一个附加的记录。每个表单的父容器为表单集,每个控件的父容器为其所在的表单。 注意:当运行表单时,若不想在表单集中的所有表单的初始时就设置为可视的,可以在表单集运行时,将不准备显示的表单的Visible属性设置为“假”(.F.)。要显示的表单的Visib1e属性设置为“真”(.T.)。 返回
8.2 向表单中添加对象 8.1.1 设置数据环境 8.2.2 向表单中添加VFP控件 8.2.3 向表单中添加数据绑定型控件 8.2.4 向表单中添加用户自定义对象 8.2.5 确定表单中的控件数目 8.2.6在表单中添加属性和方法程序 8.2.7 包含预定义常量 返回 退出
基本容器控件 选定对象 复选框 编辑框 命令锁 容 器 表 格 ActiveX控件 查看类 命令按钮 组合框 图象 ActiveX绑定控件 分隔符 标签 命令按钮组 列表框 计时器 线条 超级连接 文本框 选项按钮组 微调控件 页框 形状 生成器锁定 8.2.1 向表单中添加VFP容器 除表单集和表单外,VFP还提供了四个基本容器类:命令按钮组、选项按钮组、表格和页框。 若要在表单中添加容器对象,可从“表单控件”工具栏上选择所需的容器对象的按钮(表格、页框或按钮组),并在表单中拖动,调整到所需要的大小。
在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。在表单中添加页框时,页框默认包含两个页面,将ButtonCount属性(指定一个命令按钮组或选项按钮组中按钮的数目)或PageCount属性(指定页框对象中所含有的页数)设置为需要的数目,可以包含更多的按钮或页面。在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。在表单中添加页框时,页框默认包含两个页面,将ButtonCount属性(指定一个命令按钮组或选项按钮组中按钮的数目)或PageCount属性(指定页框对象中所含有的页数)设置为需要的数目,可以包含更多的按钮或页面。 向表单中添加表格时,ColumnCount属性(指定表格、组合框或列表框中列对象的数目)的默认值为-1,表示处于AutoFill状态。这样,在运行时表格将显示与RecordSource属性(指定与表格控件建立联系的数据源)中指定的表具有同样字段数量的列。如果不想处于“AutoFill”状态,可以设置表格的ColumnCou-nt属性为指定列的数目。 VFP中的所有容器对象都有与它们相关联的记数属性和收集属性。收集属性是引用其每个被包含对象的数组,记数属性是指示其包含的对象数的数值属性。 每个容器的收集和记数属性根据包含在容器中的对象类型来命名,下表列出了容器及其相应的收集和记数属性。
【例8-1】建立一个只含一个表格(列数由提供数据的表的字段数确定)和一个命令按钮的表单,运行表单时,表格中显示的内容底色红绿交替。【例8-1】建立一个只含一个表格(列数由提供数据的表的字段数确定)和一个命令按钮的表单,运行表单时,表格中显示的内容底色红绿交替。
对象框中选择Form1选择“方法程序” 在属性值框中选择Student表 单击【关闭】 关闭“数据环境设计器” 双击Activate Event 在属性区域选择RecordSource属性, 要实现此功能,可采取如下步骤: 第1步、选择【文件】|【新建】菜单,然后选择“表单”,再选择【新建文件】或在项目管理器中选择“表单”,再单击【新建】,再在对话框中选择【新建文件】; 第2步、单击表单控件工具栏上的(表格)按钮; 在表单上单击右键,选择【数据环境】 第2步、单击表单控件工具栏上的(表格)按钮; 第3步、在表单上按住鼠标左键拖出一个矩形框,释放鼠标。 在系统菜单上单击【显示】|【表单控件工具栏】 第1步、在项目管理器中选择“表单”,再单击【新建】 第5步、选择表单上的表格对象,在“属性”对话框中选择“数据”选项卡, 第4步、在表单上单击右键,选择【数据环境】,在弹出的“数据环境设计器”中单击右键,选择【添加】,再在弹出的“添加表或视图”对话框中选择“Student”再按【添加】按钮,再按【关闭】按钮,然后关闭“数据环境设计器”。 o=THISFORM.Grid1 FOR I=1 TO o.ColumnCount IF I%2=0 o.Columns(i).BackColor=RGB(0,255,0) ELSE o.Columns(i).BackColor=RGB(255,0,0) ENDIF ENDFOR 第3步、在表单上按住鼠标左键拖出一个矩形框,释放鼠标。 选择Student表后单击【添加】 单击【新建表单】 第5步、选择表单上的表格对象,在“属性”对话框中选择“数据”选项卡,在属性区域找到RecordSource属性,在属性值输入文本框中选择“Student”表。 第6步、选择表单,再选择“属性”上的“方法程序”选项卡,双击“Activate Event”属性,在方法程序编辑框中输入代码。
关闭表单控件工具栏 在此处更改并输入 关闭“属性”窗口和事件代码编辑窗口并单击常用工具栏上的运行按钮。 单击 将Caption属性值设置为“退出” 注意:二处的值被修改! 第7步、采用相似的方法建立一个命令按钮,将Caption属性(指定对象文本标题)值设置为“退出” 。 表单运行结果: 单击“命令按钮”按钮 THISFORM.RELEASE 输入事件代码 双击“退出”按钮 在表单上单击,添加“命令”按钮 单击表单上的【退出】按钮可以将表单关闭。 返回
8.2.2 向表单中添加VFP控件 控件工具栏能使用户很方便地在表单中添加任何一种标准的VFP控件,常用的VFP控件如下所示: 复选框 图像 OLE绑定型控件 文本框 组合框 标签 OLE容器控件 计时器 命令按钮 线条 形状 编辑框 列表框 微调 若要在表单中添加控件,可在“表单控件”工具栏中选择所需的控件按钮(单击),在表单中单击或拖动按钮,把它调整到想要的大小。 如在上例中向表单添加了一个“表格”控件和一个“命令按钮”控件。 返回
8.2.3 向表单中添加数据绑定型控件 通过给控件的ControlSource属性设置字段或给表格的RecordSource属性设置表或视图,可使控件与表、视图、表的字段、或视图的字段中的数据相联系。但也可通过直接将表和视图从下列位置拖到表单中,以创建数据绑定型控件: ■“项目管理器” ■“数据库设计器” ■“数据环境设计器” “表设计器”中“属性”选项卡的“FieldMapping”设置或“选项”对话框的“FieldMapping”选项卡的设置,是这种方法创建控件类的基础。 上例中将表格的RecordSource属性设置为Student,即是将表格的数据源与表Student建立联系。 返回
8.2.4 向表单中添加用户自定义对象 VFP最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。如果创建了类,就能将它们添加到表单中。 若要基于自定义类上添加对象,可在“项目管理器”中,将类拖动到容器中,当给工具栏添加类时,也可直接从“表单控件”工具栏中添加。 1、在控件工具栏上添加类库 类库必须在注册后才能在“表单控件”工具栏中显示出来。若要注册类库,可以: ①从“工具”菜单中选择“选项”打开“选项”对话框。 ②在“选项”对话框中选择“控件”选项卡。 ③选择“添加”按钮。 ④在“打开”对话框中,选择一个要加到“选定”列表中的类库,并选择“打开”按钮。 ⑤重复步骤③和④。 “选定”列表中列出了类库中的类,在“表单设计器”中可以和
VFP基类一样方便地使用这些类。 注意:如果要在每次运行VFP时“表单控件”工具栏中的类库都有效,可在“选项”对话框中,选择“设置为默认值”。 此外,也可以在“表单设计器”中直接注册类库。若要在表单设计器中注册一个类库,可以: ①在“表单控件”工具栏中选择“查看类”按钮。 ②从子菜单中选择“添加”。 ③在“打开”对话框中选择要添加到“表单控件”工具栏上的类库,然后选择“打开”按钮。 2、从类库中添加对象到表单 如果从“选项”对话框的“类”选项卡或从“查看类”子菜单添加类库,就能在“表单设计器”中访问它们。 若要从“表单控件”工具栏添加自定义对象,可以: ①在“表单控件”工具栏中,选择“查看类”按钮。 ②从已注册类库的列表中选择一个类库,它包含了要加到表单中的控件。 返回
③单击所需要的控件,并在表单中拖动到合适大小。 注意:如果想从“查看类”工具栏中移去一个可视类库,可以在“选项”对话框的“控件”选项卡中,选择“选定”列表中列出的一个可视的类库,然后选择“移去”按钮。 当向不是基于VFP基类的表单添加对象时,类库的相对路径(.vcx文件)存储在表单的.scx文件中。如果要将表单或类库移到另一个位置,在运行表单时VFP显示一个对话框,可以人工寻找类库。 8.2.5 确定表单中的控件数目 返回 使用ControlCount属性可以确定表单中究竟有多少个控件,而Controls[n]属性允许引用表单上的任何一个控件。下面的程序用于打印出当前活动表单上所有控件的Name属性: ACTIVATE SCREEN &&将输出打印到VFP主窗口 FOR nCnt=1 TO Application.ActiveForm.ControlCount ? Application .ActiveForm.Controls[nCnt].Name ENDFOR 上述程序中的Application也可以用_Screen替换。
8.2.6在表单中添加属性和方法程序 可以添加许多个新的属性和方法程序到一个表单。属性拥有一个值,方法程序具有调用它时被运行的过程代码。新建的属性和方法程序与其它属性与方法程序的引用一样。 1、建立一个新属性 如果有一个表单集,则在“表单设计器”中添加的属性和方法程序就属于此表单集。如果没有建立表单集,则属性和方法程序属于表单。 若要向表单或表单集中添加新属性,可以: ①从“表单”菜单中选择“新建属性”(New Property)命令。 ②在“新建属性”对话框中,键入属性名。还可以加入关于这个属性的说明,它将显示在“属性”窗口的底部的属性描述中。 2、建立一个数组属性 一个数组属性可以像其他属性一样都属于表单或表单集,但不同的是数组属性可用VFP的数组命令和函数处理它。若要创建一个数组属性,可以:
①添加新属性到表单。 ②在“新建属性”对话框的“属性名”框中键入数组属性称,并包括数组的大小和维数。 例如,可在“新建属性”对话框的“名称”框中输入myarray(10,5),去创建一个10行5列的二维数组,若要同时对该属性加以说明,则还可以在下部的“说明”框中输入需要对该属性进行说明的内容,如“自定义数组”等。当添加数组属性到表单时,属性作为只读显示在属性窗口中。可以在运行时管理数组,重新设置数组的维数,也可对数组属性的元素赋值。 3、创建新方法程序 也可向表单中添加方法程序,并且可以用调用表单类方法程序的方式调用它。若要在表单或表单集中创建一个新方法程序,可以: ①从“表单”菜单中选择“新方法程序”。 ②在“新方法程序”对话框中,输入方法程序的名称。还可以包含有关这个方法程序的
说明,这是可选的。调用用户自定义方法程序和调用基类方法程序一样,都使用下面的语法:说明,这是可选的。调用用户自定义方法程序和调用基类方法程序一样,都使用下面的语法: ObjectName.MethodName 建立的方法程序同样可以接受参数并返回值,这种情况下,可以使用赋值语句来调用方法程序: cVariable=ObjectName.MethodName(cParameter, nParameter) 返回 8.2.7 包含预定义常量 为了在方法程序中使用预定义常量,可在表单或表单集中用#INCLUDE命令包含一个头文件。头文件一般包含由#DEFINE预处理器伪指令定义的编译时的常数。 若要在表单中包含文件,可以: ①从“表单”菜单中选择“包含文件”。 ②在“包含文件”对话框的“包含文件”文本框中指定文件,或者选择对话框按钮以打开“包含”对话框并选定文件。 ③选择“确定”。
8.3 处理对象 8.3.1 在设计时设置属性 8.3.2 定义表单行为 8.3.3 编辑事件代码和方法程序代码 8.3.4 将表单和控件保存为类 8.3.5 运行表单 8.3.6 在运行时设置属性 返回 退出
8.3.1 在设计时设置属性 打开属性窗口会显示选定对象的属性或事件。如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。 若要设置属性,可首先在“属性”窗口中,从“属性和事件”列表中选择一个属性。然后在“属性设置”框中,为选中的属性键入或选择需要的设置。 注意:那些在设计时为只读的属性,例如对象的Class属性,在属性窗口的“属性和事件”列表框中以斜体显示。 如果属性要求输入字符值,不必用引号将这个值括起来。例如,要将一个表单的标题设为Student,只需在“属性设置”框中键入Student;若想让表单的标题是“Student”,即想让引号也出现在窗口的标题上,在“属性设置”框中键入“Student”。 通过属性窗口可以将属性设置为表达式或函数的结果。若要用表达式设置属性,可以:
■在“属性”窗口中,选择“函数”按钮来打开“表达式生成器”。■在“属性”窗口中,选择“函数”按钮来打开“表达式生成器”。 ■在“属性设置”框中键入“=”号,并在后面键入表达式。 例如,如果想设置表单的Caption属性,使它在运行表单时能够指示当前的活动表,可在“属性设置”框中键入:=Alias()。 在属性窗口中设置一个属性表达式,并在运行时刻或设计时刻初始化对象时,才对这个属性表达式进行求值。 如果将属性设置为用户自定义函数的结果,那么当设置或修改这个属性,以及运行表单时,对这个函数进行求值。如果用户自定义函数出现错误,有可能打不开这个表单。此外,也可以在对象的Init事件中将属性设置为用户自定义函数,如下例所示。 This.Caption=myfunction() 其中myfunction()为自定义函数名 如果用户自定义函数出现错误,就不能运行表单,但可以修改它。 如果要指定表单的图标,将表单的Icon属性设置为一个.ico文件的文件名。 返回
8.3.2 定义表单行为 当在“表单设计器”中设计表单时,表单是“可视”的。除非Visible(指定对象是可见还是隐藏)属性设置为“假”(.F.),对表单的外观和行为的修改将立刻在表单上反映出来。 如果将WindowState(指定表单窗口在运行时是最大化、最小化还是采用普通大小)属性设置为0(普通)、1(最小化)或2(最大化),表单设计器中的表单会立即体现这一设置。 如果将Movable属性(指定在运行时刻用户能否移动对象)设置为“假”(.F.),那么不但用户在运行时不能移动表单,即使在设计时也不能移动它。 因此应该在设置那些决定表单行为的属性之前,先完成表单的功能设计,并添加所有需要的控件。 表8-3列出了在设计时常用的表单属性,它们定义了表单的外观和行为。
8.3.3 编辑事件代码和方法程序代码 事件是用户的行为,如单击鼠标或鼠标的移动,也可以是系统行为,如系统时钟的进程。方法程序是和对象相联系的过程,只能通过程序以特定的方式激活。当触发事件或激活方法程序时,可以指定要执行的代码。若要编辑事件或方法程序代码,可以: ①从“显示”菜单中选择“代码”命令。 ②在“过程”框中选择事件或方法程序。 ③在编辑窗口中键入代码,在触发事件或激活方法程序时将执行这些代码。 例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的Click事件中可包括这样一行代码: THISFORM.Release 注意:若要在编辑窗口中查看不同过程,请按【PageDown】或【PageUp】键。 当用户单击这个命令按钮时,表单被从屏幕和内存中删除。如果不想从内存中删除表单,可以在Click事件代码中以下一行代码来代替上一行代码: THISFORM.hide &&将表单隐藏起来 注意:如果表单集、表单或表单集中任何表单上任何对象的Init事件代码返回“假”(.F.),就不能创建这个表单或表单集。 返回
8.3.4 将表单和控件保存为类 也可以将表单或表单上的控件子集保存为类定义。如果您打算创建基于表单的子类,或在其他表单中重新使用这些控件,可将表单作为类定义来保存。若要将表单或选定的控件保存为类定义,可以: ①从“文件”菜单中选择“另存为类”。 ②在“另存为类”对话框中选择“当前表单”或“选定控件”。 ③在“类名”框中输入类的名称。 ④在“文件”框中输入保存类的文件名。 ⑤选择“确定”按钮。 如果没有给出文件扩展名,保存文件时会加上默认的.vcx扩展名,如果将表单保存为类定义,就可以用MODIFY CLASS命令对它进行修改。 返回
8.3.5 运行表单 可以从界面直接运行表单,或在程序代码中运行表单。 1、交互地运行表单 有几种方法运行设计好的表单。如果在“表单设计器”中工作,可通过单击“表单设计器”工具栏中的“运行”按钮测试表单。如果想在“表单设计器”重新打开表单,可在工具栏中选择【修改表单】按钮。也可以从项目中运行表单,或者以编程方式运行它。若要以交互方式运行表单,可在“项目管理器”中,选择要运行的表单,再选择“运行”按钮。或者在“命令”窗口中,使用DO FORM命令运行表单。也可以从【程序】菜单中选择【运行】来运行菜单,在“文件类型”框中选择“表单”,选定一个表单再选定【运行】按钮。 2、从程序中运行表单 若想在程序中运行表单,需要在与事件相关联的代码、方法程序代码或在程序或过程中包含DO FORM命令。
3、命名表单对象 默认情况下,当使用DO FORM命令时,表单对象的名称与.scx文件名称一样。例如,下面的一行代码运行Student.scx表单。VFP自动为这个表单创建一个名为Student的对象变量: DO FORM Student 若要命名表单对象,请使用DO FORM命令的NAME子句。例如,下面的命令运行一个表单,同时创建两个表单对象变量名: DO FORM Student NAME mystud1 DO FORM Student NAME mystud2 4、处理表单对象 如果在“命令”窗口发出DO FORM命令,表单对象就和一个公共变量相关联,可以通过这个变量名来访问表单对象。例如,在“命令”窗口发出下面的命令,打开一个名为Student的表单并改变它的标题。 DO FORM Student Student.Caption=”学生情况登记”
如果在“命令”窗口发出下面的命令,在活动的输出窗口中将显示O,表明Student是一个对象:如果在“命令”窗口发出下面的命令,在活动的输出窗口中将显示O,表明Student是一个对象: ? TYPE(“Student”) 如果在程序中发出DO FORM命令,表单对象作用范围限于这个程序,如果程序或过程运行结束,会移去对象,但表单仍然可见。例如可以运行下面这个程序: *formtest.prg DO FORM Student 在运行完程序后,表单仍然可见,表单上的所有控件仍然处于活动状态,但TYPE(“Student”)返回U表明Student是没有定义的变量,因此在“命令”窗口中发出下面的命令将产生错误: Student.Caption=”学生情况登记” 但还可以使用应用程序对象的ActiveForm、Forms和FormCount属性访问表单。 5、将表单链接到表单对象变量 DO FORM命令中的LINKED关键字允许将表单和表单对象变量
链接起来,如果包含了LINKED关键字,当与表单对象相关联的变量超出范围时,表单将被释放。例如,下面命令创建一个链接到对象变量mystud2的表单:链接起来,如果包含了LINKED关键字,当与表单对象相关联的变量超出范围时,表单将被释放。例如,下面命令创建一个链接到对象变量mystud2的表单: DO FORM Student NAME mystud2 LINKED 当释放mystud2时,表单也关闭。 6、关闭活动的表单 若想允许用户通过双击控件框,或选择表单“控件”菜单中的“关闭”来关闭活动的表单,则需要设置表单的Closable属性。若要允许用户关闭活动表单,可以: ①在“属性”窗口中,将Closable属性设置为“真”(.T.)。 ②使用RELEASE命令。 例如,可以通过在“命令”窗口或程序中发出下面的命令来关闭和释放表单Student: RELEASE Student 也可以在一个控件,如标题为“退出”的命令按钮的Click事件代码中包含下面的命令,它允许用户关闭和释放表单:
THISFORM.Release 可以在与表单的对象相关联的代码中使用RELEASE命令,但在RELEASE方法程序中却不会执行包含的任何代码。 注意:当释放表单时,同时也从内存中释放了为这个表单创建的对象变量。每一个表单集有一个单独的变量,因此不释放表单集就不能释放表单集中的表单。如果想要释放表单集,可使用RELEASE.THISFORMSET命令。如果想将一个表单从屏幕移去,不再让用户看见或使用它,可以使用THISFORM.Hide命令。 返回
8.3.6 在运行时设置属性 表单由控件等对象组成。每个对象都有自己的属性,对象的属性是独立存在的,可以分别定义每个对象的属性。打开属性窗口会显示选定对象的属性或事件。如果选择了多个对象,这些对象共有的属性会显示在“属性”窗口中。要编辑另一个对象的属性或事件。可以在“对象”框中选择这个对象,或者直接从表单中选择这个控件。VFP中对象的属性除了能在设计时确定以外,还能在运行时对属性进行充分的控制。 1、在对象层次上引用对象 若想操作一个对象,需要确定它和容器层次的关系。在容器层次的最高级(表单集或表单)需要引用对象变量。除非使用DO FORM命令中的NAME子句,否则对象变量和.scx文件有相同的名称。通过引用由点号(.)分隔的对象变量、控件和属性可以处理属性,如下所示: Objectvariable .[form.]control.property=setting
. = . 逗点分隔符 逗点分隔符 等号赋值操作 对象属性设置的一般格式说明: 需要设置值的属于指定控件的一个属性。 所赋的值 对象变量,包含包含对象的容器及对象等。容器和对象间也要用逗点分隔。 控件。其中包含有包含控件的容器,容器和控件也要用逗点分隔。 在【例8-1】中使用表单的Activate Event事件中使用了下列代码: o= THISFORM.Grid1 o .Columns(i).BackColor=RGB(0,255,0) 这两条命令相当于一条命令: THISFORM.Grid1.Columns(i).BackColor=RGB(0,255,0) 对象变量 控件 属性 值
可在表单或表单集中使用THIS、THISFORM和THISFORMSET引用对象。例如,要想在单击命令按钮时改变它的标题,可在命令按钮的Click事件代码中包含下面的命令:可在表单或表单集中使用THIS、THISFORM和THISFORMSET引用对象。例如,要想在单击命令按钮时改变它的标题,可在命令按钮的Click事件代码中包含下面的命令: THIS.Caption=“保存”