1.57k likes | 1.73k Views
第 6 章 利用表单设计应用程序界面. 设计表单 在表单中添加对象 处理对象 管理表单 控件使用要点 控件使用技巧 小结. 6.1 设计表单. 设置数据环境 创建单文档和多文档界面 用表单集扩充表单. 表单设计器. VFP 提供了一个功能强大的“表单设计器”,使得设计表单的工作变得又快又容易。 在“表单设计器”中可以处理下列内容: 表单中不同类型的对象。 与表单相关联的数据。 顶层表单或子表单。 能一起操作的多个表单。 基于自定义模板的表单。. 表单和表单集.
E N D
第6章 利用表单设计应用程序界面 • 设计表单 • 在表单中添加对象 • 处理对象 • 管理表单 • 控件使用要点 • 控件使用技巧 • 小结
6.1 设计表单 • 设置数据环境 • 创建单文档和多文档界面 • 用表单集扩充表单
表单设计器 • VFP提供了一个功能强大的“表单设计器”,使得设计表单的工作变得又快又容易。 • 在“表单设计器”中可以处理下列内容: • 表单中不同类型的对象。 • 与表单相关联的数据。 • 顶层表单或子表单。 • 能一起操作的多个表单。 • 基于自定义模板的表单。
表单和表单集 • 表单和表单集是拥有自己的属性、事件和方法程序的对象,在“表单设计器”中可以设置这些属性、事件和方法程序。 • 表单集包括了一个或多个表单,可以将它们作为一个整体来操作。例如,如果在表单集中有4个表单,可以在运行时用一个命令显示或隐藏它们。 • 可使用如下3种方法之一新建一个表单: • 在项目管理器中先选定“表单”,然后单击“新建”按钮。 • 选择“文件”菜单中的“新建”命令,选定“表单”,并单击“新建文件”按钮。 • 使用CREATE FORM命令。
表单设计器(续) • 如图6-1所示,“表单设计器”包含下列工具栏:“表单设计器”、“表单控件”、“布局”和“调色板”。 图6-1 “表单设计器”及其工具栏
6.1.1 设置数据环境 • 每一表单或表单集都包括一个数据环境。 • 数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。 • 可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。 • 在表单运行时,数据环境可自动打开、关闭表和视图。并且,通过设置“属性”窗口中的ControlSource属性设置框,“数据环境”将帮助设置控件的ControlSource属性,在这个属性框中列出了数据环境中的所有字段。
6.1.1 设置数据环境 • 若要打开“数据环境设计器”,可按如下步骤操作: (1)从“显示”菜单或快捷菜单中选择“数据环境”命令,出现如图6-2所示的窗口。 (2)从快捷菜单中选择“添加”命令。 (3)在“添加表或视图”对话框中选择一表或视图添加到数据环境中去。 图6-2 数据环境设计器
1. 常用数据环境属性 • 表6-1列出了属性窗口中经常设置的数据环境属性。 表6-1 常用数据环境属性
2. 向“数据环境设计器”中添加表或视图 • 向“数据环境设计器”添加表或视图时,可以看到属于表或视图的字段和索引。 • 若要向数据环境中添加表或视图时,可按如下步骤进行: (1)在“数据环境设计器”中,从“数据环境”菜单中选择“添加”命令。 (2)在“添加表或视图”对话框中,从列表中选择一个表或视图。如果没有打开的数据库或项目,通过选择“其他”来选择表。 • 也可以将表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。 • 当“数据环境设计器”处于活动状态时,“属性”窗口会显示与数据环境相关联的对象及属性。在“属性”窗口的“对象”框中,数据环境的每个表格或视图,表格之间的每个关系,以及数据环境本身均是各自独立的对象。
3. 从“数据环境设计器”中移去表 • 当从“数据环境设计器”中移去表时,与这个表有关的所有关系也随之移去。 • 若要将表或视图从“数据环境设计器”中移去,可以: • 在“数据环境设计器”中选择要移去的表或视图。 • 从“数据环境”菜单中选择“移去”命令。
4. 在“数据环境设计器”中设置关系 • 如果添加进“数据环境设计器”的表具有在数据库中设置的永久关系,这些关系将自动地添加到数据环境中。 • 如果表中没有永久的关系,可以在“数据环境设计器”中设置。 • 要在“数据环境设计器”中设置关系,可将字段从主表拖动到相关表中的字段上。 • 如果和主表中的字段相关的表中没有索引标识,系统将提示用户是否创建索引标识。
5. 在“数据环境设计器”中编辑关系 • 在“数据环境设计器”中设置了一个关系后,在表之间将有一条连线指出这个关系。 • 若要编辑关系的属性,可在属性窗口中从名称列表框选择要编辑的关系。 • 关系的属性对应于SET RELATION和SET SKIP命令中的子句和关键字。 • RelationalExpr属性的默认设置为主表中关键字字段的名称。 • 如果相关表是以表达式作为索引的,就必须将RelationalExpr属性设置为这个表达式。 • 例如,如果相关表以ALLTRIM(xh)作为索引,就必须将RelationalExpr属性设置为ALLTRIM(xh)。
5. 在“数据环境设计器”中编辑关系(续) • 如果关系不是一对多关系,必须将OneToMany属性设置为“假”,这对应于使用SET RELATION命令时不发出SET SKIP命令。 • 将关系的OneToMany属性设置为“真”,相当于发出SET SKIP命令。 • 当浏览父表时,在记录指针浏览完子表中所有的相关记录之前,记录指针一直停留在同一父记录上。 • 注意:如果在表单或表单集中想设置一对多关系,必须将OneToMany属性设置为“真”,甚至在数据库中已经建立了永久一对多关系时,也必须如此。
6.1.2 创建单文档和多文档界面 • VFP允许创建两种类型的应用程序: • 多文档界面(MDI):各个应用程序由单一的主窗口组成,且应用程序的窗口包含在主窗口中或浮动在主窗口顶端。 • 单文档界面(SDI):应用程序由一个或多个独立窗口组成,这些窗口均在Windows桌面上单独显示。 • 由单个窗口组成的应用程序通常是一个SDI应用程序,但也有一些应用程序综合了SDI和MDI的特性。 • 例如,Visual FoxPro 将调试器显示为一SDI应用程序,而它本身又包含了自己的MDI窗口。
6.1.2 创建单文档和多文档界面(续) • 为了支持这两种类型的界面,VFP允许创建以下几种类型的表单,如图6-3所示。 图6-3 子表单、浮动表单和顶层表单
6.1.2 创建单文档和多文档界面(续) • 子表单:包含在另一个窗口中,用于创建MDI应用程序的表单。 • 子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。 • 浮动表单:属于父表单(主表单)的一部分,但并不包含在父表单中,可以被移至屏幕的任何位置,但不能在父窗口后台移动。浮动表单也可用于创建MDI应用程序。 • 若将浮动表单最小化时,它将显示在桌面的底部。 • 如父表单最小化,则浮动表单也一同最小化。 • 顶层表单:没有父表单的独立表单,用于创建一个SDI应用程序,或用作MDI应用程序中其他子表单的父表单。
1. 指定表单类型 • 创建各种类型的表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。 • 如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且需要指定是否是MDI类的子表单,即指出表单的最大化是如何工作的。 • 如果子表单是MDI类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单及工具栏。 • 非MDI类的子表单,最大化时将占据父表单的全部用户区域,但仍保留它本身的标题和标题栏。
1. 指定表单类型(续) • 若要建立一个子表单,可以: (1)用“表单设计器”创建或编辑表单。 (2)可将表单ShowWindows属性设置为下列值之一: 1)0:In Screen。子表单的父表单将为VFP主窗口。 2)1:In Top-Level Form。当子窗口显示时,子表单的父表单是活动的顶层表单。如果希望子窗口出现在顶层表单窗口内,而不是出现在VFP主窗口内时,可选用该项设置。 (3)如果希望子表单最大化时与父表单组合成一体,可设置表单的MDIForm属性为“真”(.T.);如果希望子表单最大化时仍保留为一独立的窗口,可设置表单的MDIForm属性为“假”(.F.)。
1. 指定表单类型(续) • 浮动表单是由子表单变化而来的。若要指定为浮动表单,可以: (1)用“表单设计器”创建或编辑表单。 (2)可将表单的ShowWindow属性设置为以下值之一: 1)0:在屏幕中。浮动表单的父表单将出现在VFP主窗口。 2)1:在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表单。 (3)将表单的Desktop属性设置为“真”。 • 若要指定顶层表单,可以: (1)用“表单设计器”创建或编辑表单。 (2)将表单ShowWindow属性设置为“2-作为顶层表单”。
2. 显示位于顶层表单中的子表单 • 如果所创建的子表单中的ShowWindow属性设置为“1-在顶层表单中”,则不需直接指定一顶层表单作为子表单的父表单。而是在子窗口出现时,指定子表单成为父表单。 • 若要显示位于顶层表单中的子表单,可以: (1)创建顶层表单。 (2)在顶层表单的事件代码中包含DO FORM命令,指定要显示的子表单的名称。例如,在顶层表单中建立一个按钮,然后在按钮的Click事件代码中包含如下命令: DO FORM Subform • 注意:在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的Init事件来显示子表单,因为此时顶层表单还未激活。 (3)激活顶层表单,如有必要,触发用以显示子表单的事件。
3. 隐藏Visual FoxPro主窗口 • 在运行顶层表单时,可能不希望Visual FoxPro主窗口是可视的。使用应用程序对象的Visible属性,按要求隐藏或显示Visual FoxPro主窗口。 • 若要隐藏Visual FoxPro主窗口,可以: (1)在表单的Init事件中,包含下列代码: Application.Visible=.F. (2)在表单的Destroy事件中,包含下列代码: Application.Visible=.T. • 在某些方法程序或事件中,可使用THISFORM.Release命令关闭表单。 • 注意:也可以在配置文件中包含下列代码,用以隐藏Visual FoxPro主窗口: SCREEN=OFF
4. 在顶层表单中添加菜单 • 若要在顶层表单中添加菜单,可以: (1)创建顶层表单的菜单。 (2)将表单的shoewindow属性设置为“2-作为顶层表单”。 (3)在表单的init事件中,运行菜单程序并传递两个参数: DO menuname.mpr WITH oForm, IAutoRename • 其中,oForm是表单的对象引用。 • 在表单的Init事件中,THIS作为第一个参数进行传递。 • IAutoRename指定了是否为菜单取一个新的名字。 • 如果计划运行表单的多个实例,则将.T.传递给IAutoRename。 • 例如,可以使用下列代码调用名为mySDImenu的菜单: DO mySDImenu.mpr WITH THIS, .T.
6.1.3 用表单集扩充表单 • 可以将多个表单包含在一个表单集中,作为一组处理。表单集有以下优点: • 可同时显示或隐藏表单集中的全部表单。 • 可以可视地调整多个表单,以控制它们的相对位置。 • 因为表单集中所有表单都是在单个.SCX文件中用单独的数据环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录则被更新和显示。 • 注意:运行表单集时,将加载表单集所有表单和表单的所有对象。加载带很多控件的多个表单会花几秒钟时间。
1. 创建表单集 • 表单集是一个包含有一个或多个表单的父层次的容器。 • 可在“表单设计器”中创建表单集。 • 若要创建表单集,可从“表单”菜单中,选择“创建表单集”选项。 • 如果不需要将多个表单处理为表单组,则不必创建表单集。 • 创建表单集以后,就可向其中添加表单。
2. 添加和删除表单 • 创建了表单集以后,可添加新表单或删除表单。 • 若要向表单集中添加附加的表单,可从“表单”菜单中选择“添加新表单”。 • 若要从表单集中删除表单,可以: • 在“表单设计器”的“属性”窗口的对象列表框中,选择要删除的表单。 • 从“表单”菜单中选择“移除表单”。 • 如果表单集中只有一个表单,可删除表单集而只剩下表单。若要删除表单集,可从“表单”菜单中选择“移除表单集”。
2. 添加和删除表单(续) • 表单以表的格式存储在.SCX后缀的文件中。 • 创建表单时,.SCX表包含了一个表单的记录、一个数据环境的记录和两个内部使用记录。 • VFP为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集和每个新表单添加一个附加的记录。 • 每个表单的父容器为表单集,每个控件的父容器为其所在的表单。 • 注意:当运行表单时,若不想在表单集中所有表单的初始化时就设置为可视的,可以在表单集运行时: • 将不显示的表单的Visible属性设置为“假”(.F.); • 要显示表单,Visible属性设置为“真”(.T.)。
6.2 在表单中添加对象 • 深入了解容器和控件对象 • 添加Visual FoxPro容器 • 向表单中添加Visual FoxPro控件 • 在表单中添加数据绑定型控件 • 在表单中添加用户自定义的对象 • 确定表单中的控件数目 • 在表单中添加属性和方法程序 • 包含预定义常量
6.2.1 深入了解容器和控件对象 • VFP中的对象根据它们所基于的类的性质可分为两类: (1)容器可以作为其他对象的父对象。 • 例如,一个表单作为一个容器,是放在它上面的复选框的父对象。 (2)控件可以包含在容器中,但不能作为其他对象的父对象。 • 例如,复选框就不能包含任何其他的对象。 • 在“表单设计器”中即可以设计容器,也可设计控件。
6.2.2 添加Visual FoxPro容器 • 除表单集和表单外,VFP还提供了4个基本容器类:命令按钮组、选项按钮组、表格和页框。 • 在表单中添加容器对象: • 从“表单控件”菜单栏上选择所需要容器对象的按钮(表格、页框或按钮),并在表单中拖动,调整到所需要的大小。 • 在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。 • 在表单中添加页框时,页框默认包含两个页面。 • 将BottonCount属性或PageCount属性设置为需要的数目,可以包含更多的按钮或页面。
6.2.2 添加Visual FoxPro容器(续) • 向表单中添加表格时,ColumnCount属性的默认值为-1,表示处于AutoFill状态。 • 在运行时表格将显示与RowSource表中的字段同样数量的列。 • 如果不想处于AutoFile状态,可以设置表格的ColumnCount属性为指定列的数目。 • VFP中的所有容器对象都有与它们相关联的记数属性和收集属性。 • 收集属性是引用其每个被包含对象的数组; • 记数属性是指示其包含对象数的数值属性。
6.2.2 添加Visual FoxPro容器(续) • 每个容器的收集和记数属性根据包含在容器中的对象类型来命名,表6-2列出了容器及其相应的收集和记数属性。 • 这些属性以编程方式循环地处理所包含的所有或指定的对象。
6.2.2 添加Visual FoxPro容器(续) • 以下几行代码设置在表格中列的backcolor属性,以实现红色与绿色交替出现的功能: o=THISFORM.grd1 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
6.2.3 向表单中添加Visual FoxPro控件 • 控件工具栏使用户很方便地在表单中添加任何一种标准的VFP控件。 • 常用的VFP控件有: • 复选框、组合框、命令按钮、编辑框、文本框和列表框; • 图像、标签、线条、形状和微调控件; • 超级链接、ActiveX 绑定控件、ActiveX 控件和计时器。 • 若要在表单中添加控件,可在“表单控件”工具栏中选择所需的控件按钮,在表单中单击或拖动按钮,把它调整到想要的大小。
6.2.4 在表单中添加数据绑定型控件 • 通过给控件的ControlSource属性设置了字段或给表格的RecordSource设置表或视图,可使控件与表、视图、表的字段,或视图的字段中的数据相联系。 • 也可通过直接将表和视图从项目管理器或“数据库设计器”或“数据环境设计器”拖到表单中,以创建数据绑定型控件。 • 在“表设计器”中,“属性”选项卡的FieldMapping属性设置或“选项”对话框的FieldMapping选项卡的设置,是这种方法创建控件类的基础。
6.2.5 在表单中添加用户自定义的对象 • VFP最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。 • 若创建了类,就可以将它们添加到表单中。 • 若要基于自定义类上添加对象,可在项目管理器中,将类拖动到容器中。当给工具栏添加类时,也可直接在“表单控件”工具栏中添加
1. 在控件工具栏上添加类库 • 类库必须在注册后才能在“表单控件”工具栏中显示出来。 • 若要注册类库,可以如下操作: (1)从“工具”菜单中选择“选项”,打开“选项”对话框。 (2)在“选项”对话框中,选择“控件”选项卡。 (3)选择“添加”按钮。 (4)如图6-4,在打开的对话框中,选择一个要加到“选定”列表中的类库,并选择“打开”按钮。 (5)重复步骤(3)和(4)。
1. 在控件工具栏上添加类库(续) 图6-4 “选项”对话框的“控件”选项卡
1. 在控件工具栏上添加类库(续) • 可以在“表单设计器”中直接注册类库。 • 若要在表单设计器中注册一个类库,可以如下操作: (1)在“表单控件”工具栏中选择“查看类”按钮。 (2)如图6-5所示,从子菜单中选择“添加”。 (3)在“打开”对话框中选择要添加到“表单控件”工具栏上的类库,然后选择“打开”按钮。 图6-5 表单控件
2. 从类库中添加对象到表单 • 从“选项”对话框的“控件”选项卡或从“查看类”子菜单添加类库,能在“表单设计器”中访问它们。 • 从“表单控件”工具栏添加自定义对象,操作如下: (1)在“表单控件”工具栏中,选择“查看类”按钮。 (2)如图6-6所示,从已注册类库的列表中选择一个类库,它包含了要加到表单中的控件。工具栏与选定库中的控件放在一起。 (3)单击所需要的控件,并在表单中拖动到合适大小。 图6-6 查看类按钮
6.2.6 确定表单中的控件数目 • 使用ControlCount属性可以确定表单中究竟有多少个控件,而Controls[n]属性允许引用表单上的任何一个控件。 • 下面的程序用于打印出当前活动表上所有控件的NAME属性: ACTIVATE SCREEN FOR nCnt=1 TO Application.ActiveForm.ControlCount ? Application.ActiveForm.Controls[nCnt].Name ENDFOR
6.2.7 在表单中添加属性和方法程序 • 可以向表单中添加任意多个新的属性和方法程序。 • 属性拥有一个值,而方法程序拥有一个过程代码,当调用方法程序时,即运行这一过程代码。 • 新建的属性和方法程序属于表单,可以像引用其他属性和方法程序那样引用它们。
1. 创建新属性 • 如果已经有一个表单集,那么在“表单设计器”中加入的属性和方法程序就属于表单集。 • 若没有建立表单集,则属性和方法程序属于表单。 • 在表单或表单集中添加新属性,操作如下: (1)从“表单”菜单中选择“新建属性”命令。 (2)在“新建属性”对话框中,键入属性的名称。还可以加入关于这个属性的说明,它将显示在“属性”窗口的底部,如图6-7所示。
1. 创建新属性(续) 图6-7 在“表单”中添加“属性”
2. 创建数组属 • 数组属性和其他属性一样都属于表单或表单集,不同的是可用VFP的数组命令和函数处理它。 • 若要创建一个数组属性,可以如下操作: (1)在表单中添加新属性。 (2)在“新建属性”对话框的“属性名”框中键入数组属性的名称,包括数组的大小和维数。 • 例如,要创建一个10行的二维数组,应在“新建属性”对话框的“属性名”框中输入arrayprop[10, 2]。
3. 创建新方法程序 • 可在表单中添加方法程序,并可用调用表单类方法程序的方式调用它。 • 若要在表单或表单集中创建一个新方法程序,可如下操作: (1)从“表单”菜单中选择“新方法程序”。 (2)在“新方法程序”对话框中,键入方法程序的名称,还可以包含有关这个方法程序的说明,这是可选的。 • 调用用户自定义方法程序和调用基类方法程序一样,使用下面的语法: ObjectName.MethodName • 用户建立的方法程序同样可以接受参数并返回值,这种情况下,可以使用赋值语句来调用方法程序: cVariable = ObjectName.MethodName(cParameter.nParameter)
6.2.8 包含预定义常量 • 为了在方法程序中使用预定义常量,可在表单或表单集中用#INCLUDE命令包含一个头文件。 • 头文件一般包含有#DEFINE预处理器伪指令定义的编译时的常数。 • 若要在表单中包含文件,可以如下操作: (1)从“表单”菜单中选择“包含文件”。 (2)在“包含文件”对话框的“包含文件”文本框中指定文件,或者选择对话框按钮以打开“包含”对话框并选定文件。 (3)单击“确定”按钮。
6.3 处理对象 • 在设计时设置属性 • 定义表单行为 • 指定表单的图标 • 编辑事件代码和方法程序代码 • 保存表单 • 将表单和控件保存为类 • 运行表单 • 在运行时刻设置属性 • 在运行时调用方法程序 • 对事件作出响应
6.3 处理对象 • 在设计时有几种方法处理对象: • 在“表单设计器”窗口中通过拖动来设置对象的大小和位置。 • 选择“布局”工具栏上的对齐工具,或者选择“格式”菜单中的选项可以对齐控件。 • 在“调色板”工具栏中选择前景和背景颜色来设置颜色。 • 在“属性”窗口中设置属性。表单或表单集中对象的属性主要是在属性窗口中设置。
6.3.1 在设计时设置属性 • 打开“属性”窗口,如图6-8所示,显示选定对象的属性或事件。 • 如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。 • 要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。 • 若要设置属性,可首先在“属性”窗口中,从“属性和事件”列表中选择一个属性。然后在属性设置框中,为选中的属性键入或选择需要的设置。 • 注意:那些在设计时为只读的属性,例如,对象的Class属性,在“属性”窗口的“属性和事件”列表框中以斜体显示。
6.3.1 在设计时设置属性(续) • 如果属性要求输入字符值,不必用引号将这个值括起来。 • 例如,要将一个表单的标题设为xs,只需在“属性设置”框中输入xs;若想让表单的标题是xs,即想让引号也出现在窗口的标题上,在“属性设置”框中输入xs。 图6-8 “属性”窗口