利用表单,可以让用户在熟悉的界面下查看数据或将数据输入数据库。但表单提供的远不止一个界面:它还提供丰富的对象集,这些对象能响应用户(或系统)事件,这样就能使用户尽可能方便和直观地完成信息管理工作。
本章内容要点:
Visual FoxPro 提供了一个功能强大的表单设计器,使得设计表单的工作变得又快又容易。在表单设计器中可以处理下列内容:
表单和表单集是拥有自己的属性、事件和方法程序的对象,在表单设计器中可以设置这些属性、事件和方法程序。表单集包括了一个或多个表单,可以将它们作为一个整体来操作。例如,如果在表单集中有四个表单,可以在运行时用一个命令显示或隐藏它们。
在“表单设计器”中可以新建表单,而且在设计时刻就能看见其中各对象显示在用户面前的外观。
若要新建一个表单
- 或者 -
- 或者 -
表单设计器带下列工具栏的:表单设计器、表单控件、布局和调色板
有关“表单设计器”的详细内容,请参阅《用户指南》中的第八章“用表单管理数据”。有关工具栏的详细内容,请在“帮助”中查找“工具栏”,并选择与所需信息有关的工具栏。
每一表单或表单集都包括一个数据环境。数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。
在表单运行时数据环境可自动打开、关闭表和视图。而且,通过设置“属性”窗口中 ControlSource 属性设置框,在这个属性框中列出数据环境的所有字段,数据环境将帮助您设置控件的 ControlSource 属性。
若要打开数据环境设计器
数据环境设计器
下面是在属性窗口中经常设置的数据环境属性:
属性 | 说明 | 默认设置 |
AutoCloseTables | 控制当释放表或表单集时,是否关闭表或视图。 | “真”(.T.) |
AutoOpenTables | 控制当运行表单时,是否打开数据环境中的表或视图。 | “真”(.T.) |
InitialSelectedAlias | 当运行表单时选定的表或视图。 | 设计时刻为 ”” 。如果没有指定,在运行时首先加到“数据环境”中的临时表最先被选定。 |
向数据环境设计器中添加表或视图时,可以看到属于表或视图的字段和索引。
若要向数据环境中添加表或视图
也可以将表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。
当“数据环境设计器”处于活动状态时,“属性”窗口会显示与数据环境相关联的对象及属性。在“属性”窗口的对象框中,数据环境的每个表格或视图、表格之间的每个关系,以及数据环境本身均是各自独立的对象。
当您将表从数据环境中移去时,与这个表有关的所有关系也随之移去。
若要将表或视图从数据环境设计器中移去
如果添加进数据环境设计器的表具有在数据库中设置的永久关系,这些关系将自动地加到数据环境中。如果表中没有永久的关系,您可以在数据环境设计器中设置这些关系。
若要在数据环境设计器中设置关系
您也可以将字段从主表拖动到相关表中的字段上。如果和主表中的字段对应的相关表中没有索引标识,系统将提示您是否创建索引标识。
在数据环境设计器中设置了一个关系后,在表之间将有一条连线指出这个关系。
若要编辑关系的属性
关系的属性对应于 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.),甚至在数据库中已经建立了永久一对多关系时也必须如此。
Visual Foxpro 允许创建两种类型的应用程序:
由单个窗口组成的应用程序通常是一个 SDI 应用程序,但也有一些应用程序综合了 SDI 和 MDI 的特性。例如,Visual FoxPro 将调试器显示为一 SDI 应用程序,而它本身又包含了自己的 MDI 窗口。
为了支持这两种类型的界面,Visual FoxPro 允许创建以下几种类型的表单:
子表单、浮动表单和顶层表单
创建各种类型表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。
如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且还需指定是否是 MDI 类的子表单,即指出表单最大化时是如何工作的。如果子表单是 MDI 类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单以及工具栏。非 MDI 类的子表单最大化时将占据父表单的全部用户区域,但仍保留它本身的标题和标题栏。
若要建立一个子表单
浮动表单是由子表单变化而来。
若要指定为浮动表单
若要指定顶层表单
如果所创建的子表单中的 ShowWindow 属性设置为“1 - 在顶层表单中”,则不需直接指定一顶层表单作为子表单的父表单。而是在子窗口出现时,Visual FoxPro 指派成为该子表单的父表单。
若要显示位于顶层表单中的子表单
例如,在顶层表单中建立一个按钮,然后在按钮的 Click 事件代码,包含如下的命令:
DO FORM MyChild
注释 在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的 Init 事件来显示子表单,因为此时顶层表单还未激活。
在运行顶层表单时,可能不希望 Visual FoxPro 主窗口是可视的。使用应用程序对象的 Visible 属性按要求隐藏或显示 Visual FoxPro 主窗口。
若要隐藏 Visual FoxPro 主窗口
Application.Visible = .F.
Application.Visible = .T.
在某些方法程序或事件中,可使用 THISFORM.Release
命令关闭表单。
注释 也可以在配置文件中包含以下行,用以隐藏 Visual FoxPro 主窗口。
SCREEN = OFF
有关设置 Visual FoxPro 的详细内容,请参阅《安装指南》中的第三章“配置 Visual FoxPro”。
若要在顶层表单中添加菜单
DO menuname.mpr WITH oForm, lAutoRename
oForm 是对表单的对象引用。在表单的 Init 事件中,THIS 作为第一个参数进行传递。
IAutoRename 指定了是否为菜单取一个新的唯一的名字。如果计划运行表单的多个实例,则将 .T. 传递给 IAutoRename。
例如,可以使用下列代码调用一个名为 mySDImenu
的菜单:
DO mySDImenu.mpr WITH THIS, .T.
可以将多个表单包含在一个表单集中,作为一组处理。表单集有以下优点:
注释 运行表单集时,将加载表单集所有表单和表单的所有对象。加载带有多个控件的多个表单会花几秒钟的时间。
表单集是一个包含有一个或多个表单的父层次的容器。可在“表单设计器”中创建表单集。
若要创建表单集
如果不需要将多个表单处理为表单组,则不必创建表单集。创建表单集以后,则可向其中添加表单。
创建了表单集以后,可添加新表单或删除表单。
若要向表单集中添加新表单
若要从表单集中删除表单
如果表单集中只有一个表单,可删除表单集而只剩下表单。
若要删除表单集
表单以表的格式存储在 .scx 后缀的文件中。创建表单时, .scx 表包含了一个表单的记录,一个数据环境的记录,和两个内部使用记录。为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集及每个新表单各添加了一个记录。每个表单的父容器为表单集,每个控件的父容器为其所在的表单。
提示 当运行表单集时,若不想在最初让表单集里的所有表单可视的。可以在表单集运行时,将不希望显示的表单的 Visible 属性设置为“假”(.F.)。将希望显示的表单,其 Visible 属性设置为“真”(.T.)。
为了在表单中设计所需的功能,您需要添加合适的控件,设置表单和控件属性并编写代码。
可以将下列类型的对象添加到表单中:
Visual FoxPro 中的对象根据它们所基于的类的性质可分为两类:
在“表单设计器”中既可以设计容器,也可以设计控件。
容器 | 可以包含 |
列 | 标头,除了表单、表单集、工具栏、计时器和其他列对象控件之外的任何对象 |
命令按钮组 | 命令按钮 |
表单集 | 表单、工具栏 |
表单 | 页框、表格、任何控件 |
表格 | 列 |
选项按钮组 | 选项按钮 |
页框 | 页面 |
页面 | 表格、任何控件 |
除表单集和表单外,Visual FoxPro 还提供四个基本容器类。
Visual FoxPro 容器类 | |
命令按钮组 | 选项按钮组 |
表格 | 页框 |
若要在表单中添加容器对象
在表单中添加命令按钮组或选项按钮组时,默认情况下,按钮组包含两个按钮。在表单中添加页框时,页框默认包含两个页面。将 ButtonCount 属性或 PageCount 属性设置为需要的数目,可以包含更多的按钮或页面。
向表单中添加表格时,ColumnCount 属性的默认值为 -1,表示处于 AutoFill 状态。这样,在运行时表格将显示与 RowSource 表中的字段同样数量的列。如果不想处于“AutoFill”状态,可以设置表格的 ColumnCount 属性为指定列的数目。
有关这些容器对象的详细内容,请参阅第十章“使用控件”。
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
控件工具栏能使您很方便地在表单中添加任何一种标准的 Visual FoxPro 控件。
标准 Visual FoxPro 控件
复选框
超级链接
列表框
微调控件
组合框
图象
ActiveX 绑定控件
文本框
命令按钮
标签
ActiveX 控件
计时器
编辑框
线条
形状
若要在表单中添加控件
有关选择控件的详细内容,请参阅第十章“使用控件”。
通过设置控件的 ControlSource 属性为字段或表格的 RecordSource 属性为表或视图,可使控件与表、视图、表的字段或视图字段中的数据相联系。但也可通过直接将表和视图从下列位置拖到表单中,以创建数据绑定型控件:
“表设计器”中“字段”选项卡的“匹配字段类型到类”设置或“选项”对话框的“字段映象”选项卡的设置,是这种方法创建控件类的基础。
有关设置默认控件类的详细内容,请参阅“表设计器”或“选项”对话框中的“字段映象”选项卡。
Visual FoxPro 最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。如果创建了类,您就能将它们添加到表单中。
若要基于自定义类上添加对象
当给工具栏添加类时,也可直接从“表单控件”工具栏中添加。
若要注册类库
“选定”列表中列出了类库中的类,在“表单设计器”中可以和 Visual FoxPro 基类一样方便地使用这些类。
“选项”对话框的“控件”选项卡
提示 如果要在每次运行 Visual FoxPro 时“表单控件”工具栏中的类库都有效,可在“选项”对话框中,选择“设置为默认值”。
也可以在“表单设计器”中直接注册类库。
若要在表单设计器中注册一个类库
“查看类”按钮的子菜单。
如果您从“选项”对话框的“控件”选项卡或从“查看类”子菜单添加类库,您就能在“表单设计器”中访问它们。
若要从“表单控件”工具栏添加自定义对象
工具栏与选定库中的控件放在一起。
已添加到“查看类”子菜单中的用户自定义类库
注释 如果想从“查看类”工具栏中移去一个可视类库,可以在“选项”对话框的“控件”选项卡中,选择“选定”列表中列出的一个可视的类库,然后选择“移去”按钮。
如果向不是基于 Visual FoxPro 基类的表单添加对象,类库的相对路径(.vcx 文件)存储在表单的 .scx 文件中。如果要将表单或类库移到另一个位置,在运行表单时 Visual FoxPro 将显示一个对话框,用于人工寻找类库。
使用 ControlCount 属性可以确定表单中究竞有多少个控件,而 Controls[n] 属性允许引用表单上的任何一个控件。下面的程序用于打印出当前活动表单上所有控件的 Name 属性:
ACTIVATE SCREEN &&
将输出打印到Visual FoxPro
主窗口FOR nCnt = 1 TO Application.ActiveForm.ControlCount
? Application.ActiveForm.Controls[nCnt].Name
ENDFOR
可以向表单中添加任意多个新的属性和方法程序。属性拥有一个值,而方法程序拥有一个过程代码,当调用方法程序时,即运行这一过程代码。新建的属性和方法程序属于表单,您可以象引用其他属性或方法程序那样引用它们。
如果已有一个表单集,那么在“表单设计器”中加入的属性和方法程序就属于表单集。如果没有建立表单集,则属性和方法程序属于表单。
若要在表单或表单集中添加新属性
数组属性和其他属性一样都属于表单或表单集,不同的是可用 Visual FoxPro 的数组命令和函数处理它。
若要创建一个数组属性
例如,要创建一个 10 行的二维数组,应在“新建属性”对话框的“属性名”框中键入 arrayprop[10,2]。
在表单中添加完数组属性后,属性在属性窗口中以只读方式显示。您可以在运行时刻管理数组,重新设置数组的维数,也可对数组属性的元素赋值。有关使用数组属性的示例,请参阅本章稍后的“管理表单的多个实例”。
您可在表单中添加方法程序,并且可以用调用表单类方法程序的方式调用它。
若要在表单或表单集中创建一个新方法程序
调用用户自定义方法程序和调用基类方法程序一样,都使用下面的语法:
ObjectName.MethodName
您建立的方法程序同样可以接受参数并返回值,这种情况下,您可以使用赋值语句来调用方法程序:
cVariable = ObjectName.MethodName(cParameter, nParameter)
为了在方法程序中使用预定义常量,可在表单或表单集中用 #INCLUDE 命令包含一个头文件。头文件一般包含由 #DEFINE 预处理器伪指令定义的编译时的常数。
若要在表单中包含文件
- 或者 -
选择对话框按钮,打开“包含”对话框并选定文件。
打开“属性”窗口会显示选定对象的属性或事件。如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。
“属性”窗口
若要设置属性
注释 那些在设计时刻为只读的属性,例如对象的 Class 属性,在属性窗口的属性和事件列表框中以斜体显示。
如果属性要求输入字符值,不必用引号将这个值括起来。例如,要将一个表单的标题设为 CUSTOMER,只需在属性设置框中键入 CUSTOMER;若想让表单的标题是“CUSTOMER”,即想让引号也出现在窗口的标题上,在属性设置框中键入“CUSTOMER”。
若要用表达式设置属性
- 或者 -
例如,如果您想设置表单的 Caption 属性,使它在运行表单时能够指示当前的活动表,可在属性设置框中键入 =ALIAS( )。
在属性窗口中设置一个属性表达式,以及在运行时刻或设计时刻初始化对象时,才对这个属性表达式进行求值。如果建立了对象,除非您或用户明确地改变它,属性设置都不会改变。
疑难解答 如果将属性设置为用户自定义函数的结果,那么当设置或修改这个属性,以及运行表单时,将对这个函数进行求值。如果用户自定义函数出现错误,有可能打不开这个表单。
也可以在对象的 Init 事件中将属性设置为用户自定义函数,如下例所示:
THIS.Caption = myfunction( )
如果用户自定义函数出现错误,就不能运行表单,但可以修改它。
当您在“表单设计器”中设计表单时,表单是“活”的:除非 Visiable 属性设置为“假”(.F.),您对表单的外观和行为的修改将立刻在表单上反映出来。如果将 WindowState 属性设置为 1 — 最小化或 2 — 最大化,表单设计器中的表单会立即体现这一设置。如果将 Movable 属性设置为“假”(.F.),那么不但用户在运行时刻不能移动表单,即使在设计时刻也不能移动它。因此您应该在设置那些决定表单行为的属性之前,先完成表单的功能设计,并添加所有需要的控件。
下表列出了在设计时刻常用的表单属性,它们定义了表单的外观和行为:
属性 | 说明 | 默认值 |
AlwaysOnTop | 控制表单是否总是处在其他打开窗口之上。 | “假”(.F.) |
AutoCenter | 控制表单初始化时是否让表单自动地在 Visual FoxPro 主窗口中居中。 | “假”(.F.) |
BackColor | 决定表单窗口的颜色。 | 255,255,255 |
BorderStyle | 决定表单是否没有边框,还是具有单线边框、双线边框或系统边框。如果 BorderStyle 为 3 — 可调边框,用户就能重新改变表单大小。 | 3 |
Caption | 决定表单标题栏显示的文本。 | Form1 |
Closable | 控制用户是否能通过双击“关闭”框来关闭表单。 | “真”(.T.) |
DataSession | 控制表单或表单集里的表是否能在可全局访问的工作区中打开,或仅能在表单或表单集所属的私有工作区内打开。 | 1 |
MaxButton | 控制表单是否具有最大化按钮。 | 真 (.T.) |
MinButton | 控制表单是否具有最小化按钮。 | 真 (.T.) |
Movable | 控制表单是否能移动到屏幕的新位置。 | 真 (.T.) |
ScaleMode | 控制对象的尺寸和位置属性的度量单位是 foxels 还是像素。由“选项”对话框中的设置决定。 | 由“选项”对话框中的设置决定。 |
Scrollbars | 控制表单所具有的滚动条类型。 | 0 - 无 |
TitleBar | 控制标题栏是否显示在表单的顶部。 | 1 - 打开 |
ShowWindow | 控制表单是否在屏幕中、悬浮在顶层表单中或作为顶层表单出现。 | 0 - 在屏幕中 |
WindowState | 控制表单是否最小化、最大化还是正常状态。 | 0 - 普通 |
WindowType | 控制表单是否非模式表单(默认)还是模式表单。如果表单是模式表单,用户在访问应用程序用户界面中任何其他单元前必须关闭这个表单。 | 0 - 无模式 |
您可以使用 LockScreen 属性,使控件布局属性在运行时的调整看起来更清晰。
在 Visual FoxPro for Windows 中,可指定表单的图标;当该表单在 Windows NT 窗口中最小化或位于 Windows 95 的标题栏上时显示为这个图标。如果要指定表单的图标,将表单的 Icon 属性设置为一个 .ICO 文件的文件名。
若要指定表单的图标
事件是用户的行为,如单击鼠标或鼠标的移动,也可以是系统行为,如系统时钟的进程。方法程序是和对象相联系的过程,只能通过程序以特定的方式激活。有关事件和方法程序的讨论,请参阅第三章“面向对象程序设计”。当触发事件或激活方法程序时,您可以指定要执行的代码。
若要编辑事件或方法程序代码
例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的 Click 事件中可包括这样一行代码:
THISFORM.Release
提示 若要在代码编辑窗口中查看不同过程,请按 PGDN 或 PGUP 键。
当用户单击这个命令按钮时,表单被从屏幕和内存中删除。如果不想从内存中释放表单,可在 click 事件中以这样一行代码代替:
THISFORM.Hide
注释 如果表单集、表单或表单集中任何表单上任何对象的 Init 事件代码返回“假”(.F.),就不能创建这个表单或表单集。
在运行表单之前需要先将它保存。如果在未保存之前就试图运行这个表单或关闭表单设计器,Visual FoxPro 将提示是否保存已做过的修改。
若要保存表单
您也可以将表单或表单上的控件子集保存为类定义。如果您打算创建基于表单的子类,或在其他表单中重新使用这些控件,可将表单作为类定义来保存。
若要将表单或选定的控件保存为类定义
“另存为类”对话框
如果您没有给出文件扩展名,保存文件时会加上默认的 .VCX 扩展名,如果将表单保存为类定义,您就可以用 MODIFY CLASS 命令对它进行修改。有关创建类的详细内容,请参阅第三章“面向对象程序设计”。
您可以从界面直接运行表单,或在程序代码中运行表单。
有几种方法可以运行设计好的表单。
如果在“表单设计器”中工作,可通过单击“表单设计器”工具栏中的“运行”按钮测试表单。如果想在“表单设计器”重新打开表单,关闭运行表单或在工具栏中选择“修改表单”按钮。
您也可以从项目中运行表单,或者以编程方式运行它。
若要以交互方式运行表单
您也可以从“程序”菜单中选择“运行”来运行表单,在“文件类型”框中选择“表单”,选定一个表单再选定“运行”按钮。
若想在程序中运行表单,需要在与事件相关联的代码、方法程序代码或在程序或过程中包含 DO FORM 命令。
默认情况下,当使用 DO FORM 命令时,表单对象的名称与 .scx 文件名称一样。例如,下面的一行代码运行 Customer.scx。Visual FoxPro 自动为这个表单创建一个名为 customer 的对象变量:
DO FORM Customer
若要命名表单对象
例如,下面的命令运行一个表单,同时创建两个表单对象变量名:
DO FORM Customer NAME frmCust1
DO FORM Customer NAME frmCust2
如果在“命令”窗口发出 DO FORM 命令,表单对象就和一个公共变量相关联,您可以通过这个变量名来访问表单对象。例如,在“命令”窗口发出下面的命令,打开一个名为 Customer 的表单并改变它的标题。
DO FORM Customer
Customer.Caption = "Hello"
如果在“命令”窗口发出下面的命令,在活动的输出窗口中将显示 O,表明 Customer 是一个对象:
? TYPE("Customer")
如果在程序中发出 DO FORM 命令,表单对象作用范围限于这个程序,如果程序或过程运行结束,会移去对象,但表单仍然可见。例如您可以运行下面这个程序:
*formtest.prg
DO FORM Customer
在运行完程序后,表单仍然可见,表单上的所有控件仍然处于活动状态,但 TYPE("Customer") 返回 U 表明 Customer 是没有定义的变量。因此在“命令”窗口中发出下面的命令将产生错误:
Customer.Caption = "Hello"
但您还可以使用应用程序对象的 ActiveForm、Forms 和 FormCount 属性访问表单。
DO FORM 命令中的 LINKED 关键字允许将表单和表单对象变量链接起来。如果包含了 LINKED 关键字,当与表单对象相关联的变量超出范围时,表单将被释放。
例如,下面命令创建一个链接到对象变量 frmCust2 的表单:
DO FORM Customer NAME frmCust2 LINKED
当释放 frmCust2 时,表单也关闭。
若想允许用户通过单击“关闭”按钮,或选择由这个表单控制的菜单中的“关闭”命令来关闭活动的表单,需要设置表单的 Closable 属性。
若要允许用户关闭活动表单
例如,您可以通过在“命令”窗口或程序中发出下面的命令来关闭和释放表单 frmCustomer:
RELEASE frmCustomer
也可以在一个控件,比如标题为“退出”的命令按钮的 Click 事件代码中包含下面的命令,它允许用户关闭和释放表单:
THISFORM.Release
可以在与表单的对象相关联的代码中使用 RELEASE 命令,但在 RELEASE 方法程序中却不会执行包含的任何代码。
疑难解答 当释放表单时,同时也从内存中释放了为这个表单创建的对象变量。每一个表单集有一个单独的变量,因此不释放表单集就不能释放表单集中的表单。如果想要释放表单集,可使用 RELEASE THISFORMSET 命令。如果想将一个表单从屏幕移去,不再让用户看见或使用它,可以使用 THISFORM.Hide 命令。
Visual FoxPro 中的对象模式能让您在运行时刻对属性进行充分的控制。
若想操作一个对象,需要确定它和容器层次的关系。在容器层次的最高级(表单集或表单)需要引用对象变量。除非使用 DO FORM 命令中的 NAME 子句,否则对象变量和 .scx 文件有相同的名称。
通过引用由点号 (.) 分隔的对象变量、控件和属性可以处理属性:
objectvariable.[form.]control.property = Setting
下表列出的属性或关键字使在对象层次上引用对象变得更容易:
属性或关键字 | 引用 |
ActiveControl | 当前活动表单中具有焦点的控件 |
ActiveForm | 当前活动表单 |
ActivePage | 当前活动表单中的活动页 |
Parent | 对象的直接容器 |
THIS | 对象或对象的过程或事件 |
THISFORM | 包含对象的表单 |
THISFORMSET | 包含对象的表单集 |
例如,若要改变表单集中 frmCust 表单的一个命令按钮的标题,这个表单集保存在 Custview.scx 文件中,可在程序中或命令窗口中使用下面的命令:
CustView.frmCust.cmdButton1.Caption = "Edit"
可在表单或表单集中使用 THIS、THISFORM 和 THISFORMSET 引用对象。例如,要想在单击命令按钮时改变它的标题,可在命令按钮的 Click 事件代码中包含下面的命令:
THIS.Caption = "Edit"
下表给出了使用 THISFORMSET、THISFORM、THIS 和 Parent 设置对象的示例:
命令 | 包含命令的地方 |
|
表单集中除 frm1 之外任何表单中任何控件的事件或方法程序代码。 |
|
所在表单中除 cmd1 之外任何控件的事件或方法程序代码。 |
|
想要改变其标题的控件的事件或方法程序代码。 |
|
表单上一个控件的事件或方法程序代码。这个命令将表单的背景颜色改为暗红色。 |
若要在运行时刻用表达式来设置属性
- 或者 -
例如,根据一个变量的不同值,可以将一个按钮的标题设置为“Edit”或“Save”。首先在表单的调用程序中声明这个变量:
PUBLIC glEditing
glEditing = .F.
然后在 Caption 设置中使用一个 IIF 表达式:
frsSet1.frmForm1.cmdButton1.Caption = ;
IIF(glEditing = .F., "Edit", "Save")
可以决定按钮的大小,使用带有表的字段的表达式设置标题:
*
将按钮宽度设置为'Call '
的宽度+
姓名的宽度frmForm1.cmdButton1.Width = 5 + ;
LEN(ALLTRIM(employee.first_name+ " " + employee.last_name))
*
将按钮标题设置为'Call ' +
姓名frmForm1.cmdButton1.Caption = "Call " + ;
ALLTRIM(employee.first_name + " " + employee.last_name)
还可以用一个用户自定义函数设置标题:
frsSet1.frmForm1.cmdButton1.Caption = setcaption()
可以同时设置多个属性。
若要设置多个属性
例如,要设置表单中表格的列的多个属性,可在表单中任何事件或方法程序代码中包含下面的语句:
WITH THISFORM.grdGrid1.grcColumn1
.Width = 5
.Resizable = .F.
.ForeColor = RGB(0,0,0)
.BackColor = RGB(255,255,255)
.SelectOnEntry = .T.
ENDWITH
调用对象的方法程序的语法是:
Parent.Object.Method
如果创建了对象,您就可以在应用程序的任何地方调用这个对象的方法程序。下面的命令调用方法程序来显示表单并将焦点设置到一个命令按钮:
*
保存在MYF_SET.SCX
中的表单集myf_set.frmForm1.Show
myf_set.frmForm1.cmdButton1.SetFocus
若要隐藏表单,使用这个命令:
myf_set.frmForm1.Hide
当事件发生时,包含在这个事件过程中的代码也被执行。例如,用户单击一个命令按钮,包含在这个命令按钮中的 Click 事件过程中的代码也将运行。
调用与一个事件相关联的过程代码并不使事件发生。例如,下面的语句执行 frmPhoneLog 的 Activate 事件中的代码,但它并不激活表单:
frmPhoneLog.Activate
而调用表单的 Show 方法程序可以显示和激活表单,此时 Activate 事件中的代码也被执行:
frmPhoneLog.Show
下面的例子在一个表单集中设置属性,并从不同对象中调用事件代码。示例的表单集中包含两个表单: frmLeft 和 frmRight。
表单设计器中的示例表单集
左表单中的两个复选框和命令按钮中有与它们相关联的事件代码。左表单的文本框名称为 txtInput。
左表单中对象的事件代码
对象 | 事件 | 代码 |
chkItalic | Click |
|
chkBold | Click |
|
cmdClear | Click |
|
使用 THISFORM 关键字或 Parent 属性可在一个控件的事件代码中设置另一个控件的属性。当用户最初单击“斜体”和“粗体”复选框时,就执行下面两个命令,设置相应的文本框属性:
THISFORM.txtInput.FontItalic = .T.
THIS.Parent.txtInput.FontBold = .T.
在这里,THISFORM 和 THIS.Parent 可以互相更改。
运行时的示例表单集
cmdClear 的单击事件中的代码使用了 THISFORM,来重新设置表单上其他控件的值。
您也可以在一个表单中设置另一个表单的属性。右表单中包含有 5 个命令按钮,表单中的第一个按钮的 Click 事件中有这样的代码:
THISFORMSET.frmLeft.Caption = ;
ALLTRIM(ThisFormSet.frmLeft.txtInput.Value)
注意在不同表单间设置属性时,必须引用表单集和表单。
用户单击右表单上的“改变左表单的标题”命令按钮
右表单上的第二个命令按钮的单击事件代码演示了如何在表单的对象中设置另一表单的属性:
THISFORM.Caption = ;
ALLTRIM(ThisFormSet.frmLeft.txtInput.Value)
如果用户选择了这个按钮,右表单的标题将变为左表单中文本框中的值。
下面的代码属于“改变粗体设置”命令按钮的 Click 事件,它改变左表单中的“粗体”复选框,调用与这个控件相关联的事件代码。
THISFORMSET.frmLeft.chkBold.Value = ;
NOT THISFORMSET.frmLeft.chkBold.Value
THISFORMSET.frmLeft.chkBold.InteractiveChange
例子中的最后一行调用了 chkBold 的 InteractiveChange 事件。也可用下面的命令调用此过程。
THISFORMSET.frmForm1.chkBold.InteractiveChange( )
如果忽略这个过程调用,虽然复选框的值会改变,但文本框的 FontBold 属性永远不会相应地改变。
用户单击右表单上的“改变粗体设置”命令按钮
下面的代码属于“隐藏左表单”命令按钮的 Click 事件,它用于隐藏或显示表单,并根据 Visible 属性的值相应地改变按钮的标题。
IF ThisFormSet.frmLeft.Visible
ThisFormSet.frmLeft.Hide
THIS.Caption = "Show Left Form"
ELSE
ThisFormSet.frmLeft.Show
THIS.Caption = "Hide Left Form"
ENDIF
注意控件事件代码中使用了 THIS 关键字来引用这个控件的属性。
用户单击右表单上的“隐藏左表单”命令按钮
下面的代码属于“退出”命令按钮的 Click 事件,用于释放表单集,关闭所有的表单:
RELEASE ThisFormSet
下面的过程说明在应用程序中有关管理表单的常见任务。
您可以隐藏一个表单,使它不可见。在隐藏表单后,用户不能访问表单上的控件,但您仍可以用程序完全控制它们。
若要隐藏表单
例如,在与命令按钮的 Click 事件相关的代码中,您可以包含下面一行代码:
THISFORM.Hide
当用户单击命令按钮时,表单仍在内存中,但不可见。
当用户完成对表单的操作后,您可以让用户释放表单。在释放表单后,您就不能再访问表单的属性和方法程序了。
若要释放表单
例如,在与命令按钮的 Click 事件相关的代码中,您可以包含下面一行代码:
THISFORM.Release
当用户单击命令按钮时,表单被关闭。
在运行表单时,为设置属性值或者指定操作的默认值,有时需要将参数传递到表单。
若要将参数传递到在表单设计器中创建的表单
PARAMETERS cString, nNumber
THIS.ItemName = cString
THIS.ItemQuantity = nNumber
DO FORM myform WITH "Bagel", 24
在整个应用程序中您都可以使用表单,让用户指定值。
若要从表单返回值
例如,如果 FindCust ID 是一个返回字符值的有模式表单,下面的一行代码将返回值返回到一个名为 cCustID 的变量中。
DO FORM FindCustID TO cCustID
有关详细内容,请参阅 RETURN 和 DO FORM 主题。
疑难解答 如果出现错误,请确保将 WindowType 设置为 1(模式)。
在创建表单时,可以使用“文件”菜单上的“另存为 HTML”命令将表单中的内容另存为 HTML (超文本标记语言)文件。
若要将表单另存为 HTML 文件
在同一时刻,可以有一个类定义的多个实例活动。例如,设计一个订购表单,而在应用程序中拥有几个打开的订购单,每一个都使用相同的表单定义,但可独立地显示和操作。
当您管理一个表单的多个实例时,必须记住以下要点:
下例中的代码演示了表单的多个实例的创建,为简洁起见,代码未做优化,只是提供了一个概念。
下面的表单启动多个实例:
启动表单
Launch.scx 的属性设置
对象 | 属性 | 设置 |
frmLaunch | AForms[1] |
|
Launch.scx 的事件代码
对象 | 事件 | 代码 |
cmdQuit | Click |
|
cmdLaunch | Click |
|
进一步编写本例的代码时,您可以管理表单对象数组,使得关闭表单后,空的数组元素能被作为打开的表单重新使用。否则,数组的大小将不断增加,元素的个数也逐个增加。
Multi.scx 是具有多个实例的表单。这个表单的数据环境包含 Employee 表。
Multi.scx 的多个实例
Multi.scx 的属性设置
对象 | 属性 | 设置 |
txtFirstname | ControlSource |
|
txtLastName | ControlSource |
|
frmMulti | DataSession |
|
当您在“启动器”表单选择“启动表单”按钮时,就创建一个 Multi 表单的实例。在关闭“启动器”表单后,属性数组 aForms 被释放,Multi 的所有实例都被清除。
Visual FoxPro 提供了一些函数和属性来帮助您管理对象的多个实例。有关其他内容,请参阅了《Language Reference》中的 AINSTANCE( )、AUSED( ) 和 Data SessionID。
在“选项”对话框中可以设置“表单设计器”的最大设计区。
“选项”对话框的“表单”选项卡
若要设置表单的最大设计区
当您设置最大设计区时,表单设计器的背景在设计区范围为白色,超出最大设计区的部分为灰色。如果您是在 1024 x 768 分辨率的显示器上设计应用程序,您可以将设计分辨率设置为 640 x 480,这样可以保证您设计的表单能适用于 640 x 480 的屏幕。
在设计区中,必须考虑标准的窗口属性,如工具栏。例如,在 640 x 480 分辨率的屏幕中,一个在屏幕的上端或下端带有停放的状态栏和工具栏的表单只能有最大值为 390 像素点的高度。
Visual FoxPro 主窗口属性 |
要求的像素 |
标题和菜单 | 38 |
状态栏 | 23 |
停放的工具栏 | 29 |
可以创建这样的表单,它可以很容易地在使用本地数据和远程数据(例如,存储在数据服务器上)之间切换。这样就可以使用本地或测试数据来创建应用程序的原型,然后切换到远程或实际的数据上,而不对表单做实质性的修改。
例如,如果 Visual FoxPro 应用程序是一个存储在数据服务器上的大型客户表的前端处理,则可创建一个本地 .dbf 文件,其中包含小型但具有代表意义的数据样本。然后在小型数据集合基础上创建、测试和调试表单。当准备发布应用程序时,再将表单链接到大型数据集合上。
能够在本地和远程数据库之间切换的关键在于使用的是视图而不是直接将表单(及其控件)与表链接。若要访问远程数据,则必须在任意事件中使用视图。因此为了方便本地数据与远程数据的切换,也需为本地数据创建视图。创建表单时,将这两个视图都添加到它的数据环境中,根据需要进行切换。
若要创建可在本地和远程数据间切换的表单
注释 由于两个视图使用同样的别名,不要选择默认的 0 - 本地和远程。
创建表单后,通过改变“数据环境”的 OpenView 属性切换视图的别名。可以在使用“表单设计器”时在“数据环境”中做此工作。如果要在运行时刻切换视图,还可以写出代码并将其附加某个事件中。例如,可将这些代码放入 Activate 事件中:
THISFORM.DataEnvironment.OpenViews = 2 &&
使用远程视图
如果要创建一个可在本地和远程数据间切换的表单,还必须设计定位代码用以容纳两个视图,尤其是设计具有一对多关系的表单。例如,如果表单只访问本地表或视图,可在 Next 命令按钮中使用下列代码,用来移动指针到临时表的下一个记录:
SKIP 1
THISFORM.Refresh()
但是,当在远程视图中定位时,此代码无效。因为代码假设临时表包含了表单需要的所有数据。通常情况下,希望从远程数据源上下载的数据越少越好。
解决的办法是使用带参数的视图。例如,用来编辑客户信息的视图定义如下代码:
SELECT * FROM CUSTOMERS WHERE ;
CUSTOMERS.COMPANY_NAME = ?pCompanyName
表单运行时,会在对话框中提示用户输入客户名或允许用户在文本框中输入一个名称。“显示”按钮的代码可能与以下代码相似:
pCompanyName = THISFORM.txtCompanyName.Value
REQUERY("customer")
THISFORM.Refresh()
有关带参数的视图的详细内容,请参阅第八章“创建视图”中的“创建参数化视图”部分。
您可以用模板为所有的新表单创建自己的表单类,也可以利用 Visual FoxPro 的示例类。
当创建一个新表单时,它基于“选项”对话框中设置的模板表单。如果没有指定模板,新表单将基于 Visual FoxPro 表单基类。有关 Visual FoxPro 类的详细内容,请参阅第三章“面向对象程序设计”。
表单模板允许您为表单设置默认属性,这样就能方便地让应用程序中的所有表单具有相同的外表和风格。例如,您可以在表单上包含公司徽标,可以用有关属性设计模板表单类,以便在所有的表单中使用一致的配色方案。如果公司徽标有变化,您只需修改模板表单中的图画,创建在这个模板上的所有的表单将自动继承新的徽标。
您可在 Visual FoxPro 表单中加入自定义的属性和方法程序,使这些属性和方法程序对应用程序中的每一个表单都有效。如果您习惯于创建属于表单的变量和用户自定义过程,使用自定义属性和方法程序不但提供了这个功能,还让您拥有一个整洁的封装模型。
您可以为表单模板从注册的类库中指定一个表单类。
若要指定默认的表单模板
如果没有选定表单模板,会出现“表单模板”对话框,这样您可以选择一个表单类。如果已选定表单模板,可以选择对话按钮来选择其他的类。
“选项”对话框的“表单”选项卡
您可以用与设置表单模板一样的方法指定表单集模板。下面是可能的情况:
选择“新建”对话框中的“表单”(或所有其他新建表单的方法),将自动创建一个基于模板表单集类的表单集。当在“表单设计器”中选择“表单”菜单的“添加新表单”命令时,一个基于表单模板的表单将添加到表单集中。
选择“新建”对话框中的“表单”(或所有其他新建表单的方法),将自动创建一个基于模板表单集类的表单集。当在“表单设计器”中选择“表单”菜单的“添加新表单”命令时,一个基于 Visual FoxPro 表单基类的表单被添加到表单集中。
选择“新建”对话框中的“表单”(或所有其他新建表单的方法),将自动创建一个基于模板表单类的表单。
选择“新建”对话框中的“表单”(或所有其他新建表单的方法),将自动创建一个基于 Visual FoxPro 表单基类的表单。