第十章:使用控件

在应用程序中使用控件可以提高人机交互能力。通过在表单的控件上键入、单击以及在控件之间移动,用户可以操作数据,完成自己的任务。

本章内容要点:

有关详细信息,请参阅《Language Reference》中的“控件和对象”

深入了解控件和数据

在您的表单中可以有两类控件:与表中数据绑定的控件和不与数据绑定的控件。当用户使用绑定型控件时,所输入或选择的值将保存在数据源中(数据源可以是表的字段、临时表的字段或变量)。要想把控件和数据绑在一起,可以设置控件的 ControlSource 属性。如果绑定表格和数据,则需要设置表格的 RecordSource 属性。

如果没有设置控件的 ControlSource 属性,用户在控件中输入或选择的值只作为属性设置保存。在控件生存期之后,这个值并不保存在磁盘上,也不保存到内存变量中。

控件的 ControlSource 属性设置的作用

控件 作用
复选框 如果 ControlSource 是表中的字段,当记录指针在表中移动时,ControlSource 字段中的 NULL 值、逻辑值“真”(.T.) 或“假”(.F.) 或数值 0、1 或 2 将分别代表复选框被选中、清除或灰色状态。
如果 ControlSource 是表中的字段,当用户编辑列中的数值时,实际是在直接编辑字段中的值。要将整个表格和数据绑定,可设置表格的 RecordSource 属性。
列表框组合框 如果 ControlSource 是一个变量,用户在列表中选择的值也保存在变量中;如果 ControlSource 是表中的字段,值将保存在记录指针所在的字段中。如果列表框中项和表中字段的值匹配,当记录指针在表中移动时,将选定列表中的这个项。
选项按钮 如果 ControlSource 是一个数值字段,根据按钮是否被选中,在字段中写入 0 或 1。

如果 ControlSource 是逻辑型的,则根据按钮是否被选中,在字段中写入“真”(.T.) 或“假”(.F.)。如果记录指针在表中移动,则更新选项按钮的值,以反映字段中的新值。

如果选项按钮的 OptionGroup 控件(不是选项按钮本身)的 ControlSource 是一个字符型字段,当选择该选项按钮时,选项按钮的标题就保存在字段中。记住,一个选项按钮(与 OptionGroup 控件明显不同)的控件源不能是一个字符型字段,否则当运行表单时 Visual FoxPro 会报告数据类型 不匹配。
微调 微调控件可以反映相应字段或变量的数值变化,并可以将值写回到相应字段或变量中。
文本框编辑框 表字段中的值在文本框中显示,用户对这个值的改变将写回表中。移动记录指针将影响文本框的 Value 属性

部分通过使用控件完成的任务需要将数据与控件绑定,其他任务则不需要。

根据任务选择合适的控件

Visual FoxPro 的控件具有良好的灵活性和通用性。虽然可以用多种控件来完成某个特定的任务,但最好保持控件的使用方法的一致性。这样,当用户一看到所提供的界面,就知道自己能做什么。例如,标签和命令按钮都具有 Click 事件,但熟悉图形界面的用户更习惯单击命令按钮来执行指令。

表单的绝大部分功能可以归为下列几类:

提供一组预先设定的选择

确保数据库数据有效性的最直接方法之一就是,为用户提供一组预先设定的选项。控制用户的选择,可以保证在数据库中不存储无效数据。您可以用下列控件为用户提供一组预先设定的选择:

使用选项按钮组

选项按钮组是包含选项按钮的容器。通常,选项按钮允许用户指定对话框中几个操作选项中的一个,而不是输入数据。例如,选项按钮可以指定是向文件或打印机输出结果还是进行打印预览,详细内容,请参阅第十二章“添加查询和报表”

设置选项按钮组中的选项按钮数目

在表单中创建一个选项按钮组时,它默认地包含两个选项按钮,改变 ButtonCount 属性可以设置选项按钮组中的选项按钮数目。

若要设置选项按钮组中的选项按钮数目

选项按钮组的 Value 属性表明用户选定了哪一个按钮。例如,选项按钮组有六个选项按钮,如果用户选择了第四个选项,选项按钮组的 Value 属性就是 4。

如果组的 ControlSource 属性是一个字符型字段,或者如果在运行表单之前将 Value 属性设置为一个字符值,则组的 Value 属性就是被选中的选项按钮的标题。

设置选项按钮的属性

要想在“表单设计器”中人工调整选项按钮组或命令按钮组的单个组件,可从这个组的快捷菜单中选择“编辑”命令。

可以在“属性”窗口中设置单个按钮的属性。也可以在运行时刻,通过指定选项按钮的名称和属性值来设置这些属性。例如,在同一表单上的选项按钮组对象中的方法程序或事件代码中有如下所示的一行代码,设置了 opgChoices 选项按钮组中 optCust 按钮的标题:

THISFORM.opgChoices.optCust.Caption = "Sort by Customer"

还可以在运行时刻使用 Buttons 属性,并指定选项按钮在组中的索引号来设置这些属性。例如,如果 optCust 是组中的第三个按钮,下面一行代码同样完成对 optCust 标题的设置:

THISFORM.opgChoices.Buttons(3).Caption = "Sort by Customer"

若要设置组中所有按钮的属性

启用或废止组中的按钮

前面的示例表明了如何通过编程方式废止组中的所有选项按钮。当废止了选项按钮时,它们用选项按钮的 DisabledForeColor 和 DisabledBackColor 属性指定的颜色显示。您也可以将选项按钮组的 Enabled 属性设置为“假”(.F.),但是这样用户就不会看到任何迹象。

判断当前选定的按钮

根据选项按钮组Value 属性可以判断用户选定了哪个按钮。如果按钮的控件源为数值型,且组中有五个按钮,如果选定了第三个按钮,则选项按钮组的 Value 属性值为 3。如果没有选定选项按钮,选项按钮组的 Value 属性为 0。

使用组的 ValueButtons 属性,也可以确定选定选项按钮的标题。例如,下面一行代码将选定选项的 Caption 属性保存到名为 cSelected 的变量中:

oGroup = THISFORM.opg1
cSelected = oGroup.Buttons(oGroup.Value).Caption

用选项按钮筛选列表

如果您有少数的几个预定义的表过滤器,您可以使用选项按钮允许用户在过滤器之间切换。

在下面的示例中,假定有一个包含三个选项按钮的列表框和选项按钮组和一个列表框的表单。

列表框的属性设置

对象 属性 设置
lstCustomers RowSourceType 2 - 别名
lstCustomers RowSource Customer

筛选条件是在选项按钮的 Click 事件代码中设置的。

当用户选择选项按钮时,对列表进行筛选的事件代码

对象 事件 代码
optAll Click
SET FILTER TO
GO TOP
THISFORM.lstCustomers.Requery
optCanada Click
SET FILTER TO customer.country = "Canada"
GO TOP
THISFORM.lstCustomers.Requery
optUK Click
SET FILTER TO customer.country = "UK"
GO TOP
THISFORM.lstCustomers.Requery

请不要忘记在关闭按钮的 Click 事件中或 Destroy 事件中包含 SET FILTER TO 命令,以便当用户关闭表单时重置筛选条件。

提示 当列表源已经更改时,为刷新列表,可使用 Requery 方法程序。

使用选项按钮将用户的选择存储到表中

在少数情况下,可以通过选项按钮获得用户信息,并通过保存 Caption 属性将这些信息保存在表中。例如,在一个标准化考试的应用程序中,可以使用选项按钮,使用户在多项选择 A、B、C、D 中进行选择。还可以用选项按钮在雇员表中指明性别。

若要将一个选项按钮的 Caption 属性保存到表中

  1. 将选项按钮组的 Value 属性设置为空字符串。

  2. 将按钮组的 ControlSource 属性设置为表中的一个字符型字段。

例如,组中选项按钮的标题分别为“A”、“B”、“C”和“D”,并且选项按钮组的 ControlSource 属性设置为一个字符型字段,那么当用户选择标题为“B”的按钮时,“B”将被保存在字段中。

若想查看使用选项按钮进行多项选择测验的示例

  1. 运行 Solution.app,该程序位于 Visual Studio …\Samples\Vfp98\Solution 目录中。

  2. 在目录树视图中,选取“Controls”,然后单击“Option buttons”。

  3. 单击“Present a user with multiple choices”。

使用列表框和下拉列表框

列表框和下拉列表框(即 Style 属性为 2 的组合框控件 — 下拉列表)为用户提供了包含一些选项和信息的可滚动列表。列表框中,任何时候都能看到多个项;而在下拉列表中,只能看到一个项,用户可单击向下按钮来显示可滚动的下拉列表框。

要查看如何使用列表框和下拉列表框的演示示例,请运行 Visual Studio …\Samples\Vfp98\Solution 目录下的 SOLUTION.APP,其中包括下列内容:

具有相同 RowSource 属性设置的列表框和下拉列表框

提示 如果表单上有足够的空间,并且想强调可以选择的项,请使用列表框;要想节省空间,并且想强调当前选定的项,请使用下拉列表框。

常用的列表框属性和方法程序

下面是设计时刻经常设置的列表框属性:

属性 说明
ColumnCount 列表框的列数。
ControlSource 用户从列表中选择的值保存在何处。
MoverBars 是否在列表项左侧显示移动钮栏,这样有助于用户更方便地重新安排列表中各项的顺序。
Multiselect 用户能否从列表中一次选择一个以上的项。
RowSource 列表中显示的值的来源。
RowSourceType 确定 RowSource 是下列哪种类型:一个值、表、SQL 语句、查询、数组、文件列表或字段列表。

注释 列表的 Value 属性可以是数值型,也可以是字符型,默认值为数值型。如果 RowSource 是一个字符型值,并且您想让 Value 属性反映列表中选定的字符串,请将 Value 属性设置为空字符串。先按 SPACEBAR 键,再按 BACKSPACE 键,可为“属性”窗口中的属性输入一个空串。

下面是常用的列表框方法程序:

方法程序 说明
AddItem 给 RowSourceType 属性为 0 的列表添加一项。
RemoveItem 从 RowSourceType 属性为 0 的列表中删除一项。
Requery 当 RowSource 中的值改变时更新列表。

填充列表框或组合框

通过设置 RowSourceTypeRowSource 属性,可以用不同数据源中的项填充列表框。

为列表框或组合框选择数据源类型

RowSourceType 属性决定列表框或组合框的数据源类型 — 如数组。设置好 RowSourceType 后,设置 RowSource 属性可指定列表项的数据源。

RowSourceType 列表项的源
0 无,由程序向列表中添加项。
1
2 别名
3 SQL 语句
4 查询 (.QPR)
5 数组
6 字段
7 文件
8 结构
9 弹出式菜单。包含此项是为了提供向后兼容性。

下面几节将详细介绍 RowSourceType 的不同设置。

如果将 RowSourceType 属性设置为 0(默认值),则不能自动填充列表项。可以用 AddItem 方法程序添加列表项:

frmForm1.lstMyList.RowSourceType = 0
frmForm1.lstMyList.AddItem("First Item")
frmForm1.lstMyList.AddItem("Second Item")
frmForm1.lstMyList.AddItem("Third Item")

RemoveItem 方法程序从列表中移去列表项。例如,下面一行代码从列表中移去“Second Item”项:

frmForm1.lstMyList.RemoveItem(2)

如果将 RowSourceType 属性设置为 1,可用 RowSource 属性指定多个要在列表中显示的值。如果在“属性”窗口中设置 RowSource 属性,请用逗号分隔列表项;要在程序中设置 RowSource 属性,请用逗号分隔列表项,并用引号括起来:

Form1.lstMyList.RowSourceType = 1
Form1.lstMyList.RowSource = "one,two,three,four"

别名 如果将 RowSourceType 属性设置为 2,可以在列表中包含打开表的一个或多个字段的值。

如果 ColumnCount 属性设置为 0 或 1,列表将显示表中第一个字段的值;如果 ColumnCount 属性设置为 3,列表将显示表中最前面的三个字段值;如果您不想按字段在表中的保存顺序显示字段,可将 RowSourceType 属性设置为 3 — SQL 语句或 6 — 字段。

注释 如果 RowSourceType 设置为 2 — 别名或 6 — 字段,当用户在列表中选择新值时,表的记录指针将移动到用户所选择项的记录上。

SQL 语句 如果将 RowSourceType 属性设置为 3 — SQL 语句,则在 RowSource 属性中包含一个 SELECT - SQL 语句。例如,下面的 SQL 语句将 Customer 表的全部字段和记录选择到临时表中。

SELECT * FROM Customer INTO CURSOR mylist

如果在程序中设置 RowSource 属性,请记住将 SELECT 语句用引号括起来。

注释 默认情况下,不带 INTO 子句的 SELECT 语句立刻在“浏览”窗口中显示得到的临时表。由于在 RowSource 的 SQL 语句中很少这样要求,应在 SELECT 语句中包含 INTO CURSOR 子句。

查询 如果将 RowSourceType 属性设置为 4,可以用查询的结果填充列表框,查询是在“查询设计器”中设计的。当 RowSourceType 设置为 4 时,请将 RowSource 属性设置为 .QPR 文件。例如,下面一行代码将列表的 RowSource 属性设置为一个查询:

THISFORM.List1.RowSource = "region.qpr"

如果不指定文件扩展名,Visual FoxPro 将默认扩展名是 .QPR。

数组 如果 RowSourceType 属性设置为 5,可以用数组中的项填充列表。您可以为 RowSource 创建一个表单表单集的数组属性,或者使用应用程序中其他部分创建的数组。

有关创建数组属性的详细内容,请参阅第九章“创建表单”

疑难解答 Visual FoxPro 只在需要的时候计算列表的 RowSource 设置值,而不是在设置 RowSource 的方法程序中计算,因此需要特别注意作用域。如果在方法程序中创建了一个局部数组,则这个数组的作用域只在这个方法程序内,并不是每当 Visual FoxPro 计算设置值时该数组都可用。如果将列表的 RowSource 设置为表单或表单集的数组属性,则需要相对于列表来引用这个属性,而不应相对于设置属性的方法程序。例如,如果有一个名为 arrayprop 的表单数组属性,表单的 Init 过程中的下面两行代码将产生不同的结果:

THIS.lst1.RowSource = "THIS.arrayprop"   && 错误
THIS.lst1.RowSource = "THISFORM.arrayprop" && 正确

若要用多维数组的项来填充列表

  1. RowSourceType 属性设置为 5。

  2. RowSource 属性设置为对应的多维数组。

  3. ColumnCount 属性设置为要显示的列数。

  4. 将每列的 ColumnWidths 属性设置为需要的宽度。

字段 如果 RowSourceType 属性设置为 6,则可以指定一个字段或用逗号分隔的一系列字段值来填充列表,例如:

contact,company,country

对于 RowSourceType 属性为 6 — 字段,可在 RowSource 属性中包括下列几种信息:

如果想在列表中包括多个表的字段,需将 RowSourceType 属性设置为 3 — SQL 语句。

与 RowSourceType 值为 2 — 别名不同,RowSourceType 值为 6 — 字段时允许不按字段在表中的实际位置来显示字段。

文件 如果将 RowSourceType 属性设置为 7,将用当前目录下的文件来填充列表。而且,列表中的选项允许选择不同的驱动器和目录,并在列表中显示其中的文件名。

用目录中文件名填充的列表

可将 RowSource 属性设置为列表中显示的文件类型。例如,要在列表中显示 Visual FoxPro 表,可将 RowSource 属性设置为 *.dbf。

结构 如果将 RowSourceType 属性设置为 8,将用 RowSource 属性指定的表中的字段名来填充列表。如果您想为用户提供用来查找值的字段名列表或用来对表进行排序的字段名列表,这个 RowSourceType 设置很有用。

弹出式菜单 如果将 RowSourceType 属性设置为 9,则可以用一个先前定义的弹出式菜单来填充列表。包含这一选项是为了提供向后兼容性。

创建具有多列的列表框

虽然列表框默认为一列,但 Visual FoxPro 中的列表框可以包含任意列。多列列表框和表格的区别在于,在多列列表框中您一次选择一行,而在表格中可以选择每个单元,另外不能直接编辑列表中的数据。

若要在列表框中显示多列

  1. ColumnCount 属性设置为所需的列数。

  2. 设置 ColumnWidths 属性。例如,如果列表框中有三列,下面的命令将各列宽度分别设置为 10、15 和 30。
    THISFORM.listbox.ColumnWidths = "10, 15, 30"
    
  3. RowSourceType 属性设置为“6 - 字段”。

  4. RowSource 属性设置成列中要显示的字段。例如,下面的命令将三列列表框的三列数据源设置为 Customer 表中的 contact、city 和 country 字段:
    form.listbox.RowSource = "contact,city,country"
    

注释 要想使列排列整齐,需要设置 ColumnWidths 属性或将 FontName 属性修改为等宽字体。

当列表的 RowSourceType 属性设置为 0 - 无时,您可以使用 AddListItem 方法程序向多列列表框中添加项。例如,下面的代码向一个列表框的指定列表中添加文字∶

THISFORM.lst1.ColumnCount = 3
THISFORM.lst1.Columnwidths = "100,100,100"
THISFORM.lst1.AddListItem("row1 col1", 1,1)
THISFORM.lst1.AddListItem("row1 col2", 1,2)
THISFORM.lst1.AddListItem("row1 col3", 1,3)
THISFORM.lst1.AddListItem("row2 col2", 2,2)

允许用户选择列表框中的多项

默认情况下,一次只能选定一个列表项,但您也可以允许用户选择列表中的多个列表项。

若要选择列表中的多项

为了处理选定的项,例如把它们复制到一个数组或在应用程序的其他地方使用它们,可以循环遍历各列表项,处理 Selected 属性为“真”(.T.) 的项。下面的代码包含在列表框的 InteractiveChange 事件中,在 comboSelected 组合框中显示这个列表框中的选定项,并且在 txtNoSelected 文本框中显示选定项的数目:

nNumberSelected = 0  && 跟踪数目的变量
THISFORM.cboSelected.Clear && 清除组合框
FOR nCnt = 1 TO THIS.ListCount
   IF THIS.Selected(nCnt)
      nNumberSelected = nNumberSelected + 1
      THISFORM.cboSelected.Additem (THIS.List(nCnt))
   ENDIF
ENDFOR
THISFORM.txtNoSelected.Value = nNumberSelected

允许用户在列表框中添加项

除了让用户从列表框中选择项外,还允许用户交互地向列表中添加项。

若要以交互方式向列表添加项

在下面示例中,当用户按 ENTER 键时,文本框 KeyPress 的事件中的代码将文本框中的文本添加到一个列表框中,并且清除文本框中的文本。

LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 13   && Enter    THISFORM.lstAdd.AddItem(This.Value)
   THIS.Value = ""
ENDIF

允许用户从列表向表中输入数据

如果列表的 ControlSource 属性设置为字段,那么用户在列表中选择的项将会写到表中。这是保持表中数据完整性的一个简单方法。因为,这样做用户可能输入错误数据,但不可能输入非法值。

例如,用户如果在列表中选择州或国家/地区,就不能输入无效的州或国家/地区的缩写。

允许用户在列表中选择一个值以转到某个记录

有时您也许想让用户自己选择所要查看或编辑的记录。例如,您可能为用户提供了一个顾客姓名列表,当用户从列表中选择一个顾客时,需要同时选择表中那个顾客的记录,并在表单的文本框中显示该顾客的有关信息。可以有很多方法做到这一点,采用何种方法取决于表单中的数据源。

RowSourceType 选择相应的记录
2 - 别名
6 - 字段
当用户在列表中选择一个值时,记录指针将自动指向所需的记录。在列表的 InteractiveChange 事件代码中使用 THISFORM.Refresh 方法程序,可让表单中的其他控件显示新值。
0 - 无
1 - 值
3 - SQL 语句
4 - 查询
5 - 数组
在 InteractiveChange 事件中,选择包含所需记录的表,然后搜索想要的值。例如,如果 RowSource 中拥有顾客表中的顾客标识号,可使用下面的代码:
SELECT customer
LOCATE FOR THIS.Value = cust_id
THISFORM.Refresh

根据列表值刷新一对多显示

当用户通过选择列表中的一个值来转到某个记录时,您可能需要一个一对多关系反映父表中记录指针的变化。利用本地表以及本地视图远程视图都可以实现这一功能。

本地表

列表的 RowSourceType 属性如果为 2 — 别名或 6 — 字段,并且 RowSource 属性是本地表,该本地表在表单的数据环境中具有关系设置,则当用户选择新值时,可使用 InteractiveChange 事件中的 THISFORM.Refresh 方法程序。一对多关系中的“多”方只自动显示与关系中父表的表达式相匹配的记录。

视图

如果列表框的属性是一个本地视图远程视图,则一对多显示的刷新就有些不同。下面的示例说明了使用列表框表格创建一个表单。列表框显示 TESTDATA!Customer 表的 cust_id 字段的值。表格显示与在列表框中选择的 cust_id 字段相关的订单。

首先,在“视图设计器”中创建一个订单的参数化视图。当您在“视图设计器”中创建该视图时,请将外部关键字的选择标准设置到一个变量中。在下面的示例中,该变量称为 m.cCust_id

使用一个变量的参数化视图

然后,当您设计表单时,请采用下列步骤。请注意,该视图需要一个参数值,该参数在加载表单时是不可用的。通过将视图临时表对象的 NoDataOnLoad 属性设置为“真”(.T.),则只有在调用 REQUERY( ) 函数时才运行视图,这时用户可能已经为参数化视图中使用的变量选择了一个值。

若要按本地视图或远程视图设计一个一对多列表

  1. “数据环境”添加表和带有参数的视图。

  2. 对于“数据环境”中的视图临时表对象,在其“属性”窗口中将 NoDataOnLoad 属性设置为“真”(.T.)。

  3. 将列表的 RowSourceType 属性设置为“6 - 字段”,并且将列表的 RowSource 属性设置为在视图的参数中引用为外部关键字的字段。

    在示例中,您需要将 RowSource 属性设置为 customer.cust_id

  4. 将表格的 RecordSource 属性设置为您原先创建的视图的名称。

  5. 在列表的 InteractiveChange 事件代码中,将列表的值保存在变量中,然后重新查询视图,如下例所示∶
    m.cCust_id = THIS.Value
    *假设视图名为 orders_view
    =REQUERY("orders_view") 
    

有关本地视图和远程视图的详细内容,请参阅第八章“创建视图”

在列表框中显示子记录

在列表框中可以显示一对多关系记录,即记录指针在父表中移动时,显示关系中相应的子记录。

若要在列表框中显示子记录

  1. 向表单中添加列表框。

  2. 将列表框的 ColumnCount 属性设置为要显示的列数。

    例如,如果想在列表框中显示 Order_id、Order_net 和 Shipped_on 三个字段,应将 ColumnCount 属性设置为 3。

  3. 根据要显示的字段,将 ColumnWidths 属性设置为合适宽度。

  4. 将列表框的 RowSourceType 属性设置为“3 - SQL 语句”。

  5. RowSource 属性设置为 SELECT 语句。例如,下面的语句根据顾客表中的当前记录从订购表中选择三个字段:
    SELECT order_id, order_net, shipped_on from orders ;
    WHERE order.cust_id = customer.cust_id ;
    INTO CURSOR temp
    
  6. 在表单的 Init 事件以及表中移动记录指针的代码中,重新查询列表:
    THISFORM.lstChild.Requery
    

将图片添加到列表项中

可以将列表框的 Picture 属性设置为 .bmp 文件,该图形文件可以在列表项的前面显示。

例如,如果有一个文件列表框,也许您想根据文件类型是表、程序或其他类型,在项前显示不同的位图。

带有图片的列表框

下面是与列表框 Click 事件相关的代码:

FOR iItem = 5 TO THIS.ListCount      && 文件从第五项开始
   cExtension = UPPER(RIGHT(THIS.List(iItem),3))
   DO CASE
      CASE cExtension = "DBF"
         THIS.Picture(iItem) = "tables.bmp"
      CASE cExtension = "BMP"
         THIS.Picture(iItem) = "other.bmp"
      CASE cExtension = "PRG"
         THIS.Picture(iItem) = "programs.bmp"
      CASE cExtension = "SCX"
         THIS.Picture(iItem) = "form.bmp"
      OTHERWISE 
         THIS.Picture(iItem) = IIF("]" $ cExtension, ;
            "", "textfile.bmp")
   ENDCASE
ENDFOR

使用复选框

可以使用复选框让用户指定一个布尔状态:“真”、“假”;“开”、“关”;“是”、“否”。然而有时不能将问题准确地归为“真”或“假”,如对“真”或“假”的调查表不作出任何回答。

若要查看使用复选框的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后单击“Check box”。

Value 属性决定复选框有三种可能的状态。

显示 Value 属性
0 或 .F.
1 或 .T.
2
.NULL.

Value 属性反映最近一次指定的数据类型。如果该属性设置为“真”(.T.) 或“假”(.F.),类型为逻辑型,直到属性重新设置为数值型值。

提示 用户可以按 CTRL+0,在复选框中显示 null 值。

保存或显示逻辑字段

如果复选框的 ControlSource 属性设置为表中的一个逻辑字段,那么当前的记录值为“真”(.T.) 时,复选框显示为选中;如果当前记录值为“假”(.F.),复选框显示为未选中;如果当前记录为 null 值 (.NULL.),复选框则变为灰色。

接受预先不能确定的输入

并不是总能预先确定用户向控件输入的所有可能值。下面的控件允许接收不能预先确定的用户输入:

使用文本框

文本框是一类基本控件,它允许用户添加或编辑保存在表中非备注字段中的数据。

若要查看使用文本框的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后单击“Text box”。

若要在程序中引用或更改文本框中显示的文本

如果设置了文本框的 ControlSource 属性,则显示在文本框中的值将保存在文本框的 Value 属性中,同时保存在 ControlSource 属性指定的变量或字段中。

检验文本框中的数据是否有效

若要检验文本框中的值,可在与 Valid 事件相关的方法程序中写进相应代码。如果值无效,则返回“假”(.F.) 或 0。如果返回“假”(.F.),就显示一条“无效输入”信息。如果您要显示自己的信息,请在 Valid 事件代码中包含 WAIT WINDOW 命令或者 MESSAGEBOX( ) 函数并且返回 0 值。

例如,有一个让用户键入约会日期的文本框,通过在文本框的 Valid 事件代码中包含下面代码,可以检查输入值,确保输入的日期还没有到。

IF CTOD(THIS.Value) < DATE( )
   = MESSAGEBOX("You need to enter a future date",1)
   RETURN 0
ENDIF

当文本框得到焦点后选择文本

当用户使用键盘在文本框中输入文字时,要想选中所有的文字,需要将 SelectOnEntry 属性设置为“真”(.T.)。

对文本框中的文本进行格式编排

InputMask 属性决定在文本框中可以键入的值,而 Format 属性则决定在文本框中值的显示方式。

使用 InputMask 属性

InputMask 属性决定了键入到文本框中字符的特性。例如,将 InputMask 属性设置为 999,999.99 可限制用户只能输入具有两位小数并小于 1,000,000 的数值。在用户输入任何值之前,逗号和句号就显示在文本框中。如果用户按一个字符键,则这个字符不能显示在文本框中。

如果有逻辑字段,并且想让用户能键入“Y”或“N”而不是“T”或“F”,应将 InputMask 属性设置为“Y”。

在文本框中接收用户密码

在应用程序中,经常需要获得某些安全信息,如密码。这时可以用文本框来接收这一信息,而在屏幕上并不显示。

接收用户输入同时不显示实际输入值

如果属性设置为除空字符串外的任何字符,文本框的 ValueText 属性将保存用户的实际输入值,而对于用户所按的每一个键都用一般的字符来显示。

在文本框中输入日期

文本框具有一些属性,设置这些属性,可以使您的用户方便地输入日期值。

属性 说明
Century 年份的前两个数字是否显示。
DateFormat 将文本框中的日期编排为十五个预定的格式,例如美语、德语、日语。
StrictDateEntry 将 StrictDateEntry 设置为“0 - 疏松”,可以允许用户按照比默认的 99/99/99 更灵活的格式输入日期。

常用文本框属性

下面列出了在设计时刻常用的文本框属性:

属性 说明
Alignment 文本框中的内容是左对齐、右对齐、居中还是自动对齐。自动对齐取决于数据类型。例如,数值型右对齐,字符型左对齐。
ControlSource 在文本框中显示表字段或变量的值。
InputMask 指定每个字符输入时必须遵守的规则。有关 InputMask 的详细内容,请参阅“帮助”。
SelectOnEntry 当文本框得到焦点时是否自动选中文本框中的内容。
TabStop 用户是否能用 tab 键选择该控件。如果 TabStop 设置为“.F.”,用户仍能用单击的方法选择该文本框。

使用编辑框

编辑框中允许用户编辑长字段或备注字段文本,允许自动换行并能用方向键、PageUp 和 PageDown 键以及滚动条来浏览文本。

若要查看使用编辑框的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后单击“Editbox”。

用户可以在编辑框中编辑备注字段

如果用户想在编辑框中编辑备注字段,只需将编辑框的 ControlSource 属性设置为该备注字段。例如,如果在名为 log 的表中有一个 comments 备注字段,可以将编辑框的 ControlSource 属性设置为 log.comments,这样用户就能在编辑框中编辑这个备注字段。

用户可以在编辑框中编辑文本文件

用户还可以在编辑框中编辑文本文件。如下面的表单所示。

在编辑本框中编辑文本文件的示例表单

表单中的“确定”按钮在 Click 事件代码中用下面命令关闭表单:

RELEASE THISFORM

本例中有另外两个按钮:cmdOpenFile 和 cmdSave。它们让用户打开一个文本文件,在编辑后保存这个文件。

与 cmdOpenFile 的 Click 事件相关的代码

代码 注释
CREATE CURSOR textfile ;
  (filename c(35), mem m)
APPEND BLANK
创建一个临时表,其中的字符型字段保存文本文件的名称,备注字段保存文本文件的内容。

向临时表中添加一个空记录。
REPLACE textfile.FileName WITH ;
  GETFILE("TXT")
使用 GETFILE( ) 函数返回要打开的文件名。在临时表的 FileName 字段中保存这个文件名。
IF EMPTY(textfile.FileName)
   RETURN
ENDIF
如果用户在“打开”对话框中选择了“取消”,则字段就成为空的,也没有文件打开。
APPEND MEMO mem FROM ;
  (textfile.FileName) OVERWRITE
将文件中的文本添到备注字段中。
THISFORM.edtText.ControlSource = ;
  "textfile.mem"
THISFORM.Refresh
设置表单上编辑框的 ControlSource 属性。
THISFORM.cmdSave.Enabled = .T.
启用“保存”按钮。

在文件打开并且编辑之后,“保存”按钮就允许用户将所作修改存回文件中。

与 cmdSave 的 Click 事件相关的代码

代码 注释
COPY MEMO textfile.mem TO ;
  (textfile.filename)
使用备注字段中的文本覆盖文件中原有的值。

在编辑框中对选定文本进行处理

编辑框和文本框有三个属性可以用于对选定文件进行操作:SelLength、SelStart 和 SelText.

利用 SelStartSelLength 属性可以从程序中选定文件。例如,下面的代码可在编辑框中选择第一个单词:

Form1.edtText.SelStart = 0 
Form1.edtText.SelLength = AT(" ", Form1.edtText.Text) - 1

提示 改变 SelStart 属性时,编辑框就会滚动,显示新的 SelStart 值。如果您在一个循环中改变 SelStart 值,例如查找文本时,如果您在执行这个过程之前包含 THISFORM.LockScreen = .T.,在执行这个过程之后包含 THISFORM.LockScreen = .F.,则您的代码可以执行得更快。

利用 SelText 属性可以访问编辑框或文本框中选定文本。例如,下面一行代码可将选定文本全部变为大写:

Form1.edtText.SelText = UPPER(Form1.edtText.SelText)

常用的编辑框属性

下表列出了设计时刻常用的编辑框属性:

属性 说明
AllowTabs 确定用户在编辑框中是否能插入 tab 键,而不是移到下一个控件。如果允许插入 tab 键,应提示用户可用 CTRL+TAB 移到下一个控件。
HideSelection 确定在编辑框没有获得焦点时编辑框中选定的文本是否仍然显示为选定状态。
ReadOnly 用户能否修改编辑框中的文本。
ScrollBars 是否具有垂直滚动条。

使用组合框

组合框兼有列表框和文本框的功能。有两种形式的组合框,即下拉组合框和下拉列表框,通过更改控件的 Style 属性可选择想要的形式。下拉列表框已在本章前面的“使用列表框和下拉列表框”中讨论过。

下拉组合框

用户可以单击下拉组合框上的按钮以查看选择项的列表,也可以直接在按钮旁边的框中直接输入一个新项。组合框的 Style 属性默认为 0 — 下拉组合框。

将用户项添加到下拉组合框的列表中

要将新的用户值添加到下拉组合框,可在与组合框的 Valid 事件相关的方法程序中使用下面一行代码:

THIS.AddItem(THIS.Text)

但是,在添加一项之前,最好检查保证在下拉组合框中没有该值。

lItemExists = .F. && 假设列表中没有该值。
FOR i = 1 to THIS.ListCount
   IF THIS.List(i) = THIS.Text
      lItemExists = .T.
      EXIT
   ENDIF
ENDFOR

IF !lItemExists
   THIS.AddItem(THIS.Text)
ENDIF

常用组合框属性

下面列出的属性常在设计时刻使用:

属性 说明
ControlSource 指定用于保存用户选择或输入值的表字段。
DisplayCount 指定在列表中允许显示的最大数目。
InputMask 对于下拉组合框,指定允许键入的数值类型。
IncrementalSearch 指定在用户键入每一个字母时,控件是否和列表中的项匹配。
RowSource 指定组合框中项的来源。
RowSourceType 指定组合框中数据源类型。组合框 RowSourceType 属性和列表框一样。有关它们的解释,请参阅“帮助”或本章前面有关列表框和下拉列表框的讨论。
Style 指定组合框是下拉组合框还是下拉列表。

接受给定范围的数值输入

设置 InputMask 属性,以及在 Valid 事件写入有关代码,虽然能确保输入到文本框中的数值在给定范围内,但检查输入值范围更简单的方法是使用微调控件。

使用微调控件

使用微调控件可以让用户通过“微调”值来选择,或直接在微调框中键入值。

设置用户输入值的范围

KeyboardHighValueSpinnerHighValue 属性设置为用户可在微调控件中输入的最大值。

KeyboardLowValueSpinnerLowValue 属性设置为用户在微调控件中输入的最小值。

单击向上按钮,可减少微调控件值

有时,用微调控件输入诸如表示“优先级”的值,单击向上按钮时优先级从 2 提高到 1。要想单击向上按钮时减少微调值,可将 Increment 属性设置为 -1。

微调非数值型值

微调控件值一般为数值型,也可以使用微调控件和文本框来微调多种类型的数值。例如,如果想让用户微调一定范围的日期,可以调整微调控件的大小,使它只显示按钮,同时在微调按钮旁边放置一个文本框,设置文本框的 Value 属性为日期,在微调控件的 UpClickDownClick 事件中增加或减少日期。

提示 您可以使用 Windows API 函数 GetSystemMetrics 设置微调的宽度,这样只有按钮是可见的,并且使按钮的宽度最适合于显示上下箭头的位图。

  1. 将微调的 BorderStyle 属性设为 0。

  2. 在微调的 Init 事件中包含下列代码∶
DECLARE INTEGER GetSystemMetrics IN Win32api INTEGER
THIS.Width = GetSystemMetrics(2) && SM_CXVSCROLL

常用的微调属性

下表列出了在设计时刻常用的微调控件属性的设置。

属性 说明
Interval 用户每次单击向上或向下按钮时增加和减少的值。
KeyboardHighValue 用户能键入到微调文本框中的最高值。
KeyboardLowValue 用户能键入到微调文本框中的最低值。
SpinnerHighValue 用户单击向上按钮时,微调控件能显示的最高值。
SpinnerLowValue 用户单击向下按钮时,微调控件能显示的最低值。

允许特定操作

您经常想让用户完成一些和操作值无关的特定动作。例如,让用户关闭一个表单、打开另一个表单、在表中浏览、保存或取消编辑、运行报表或查询、跳至 Internet 或 intranet 上的目标地址以及任何其他的操作。

使用命令按钮和命令按钮组

特定操作代码通常放置在命令按钮的 Click 事件中。

使命令按钮成为默认选择

将命令按钮的 Default 属性设置为“真”(.T.),可使该命令按钮成为默认选择。默认选择的按钮比其他命令按钮多一个粗的边框。如果一个命令按钮是默认选择,那么按 ENTER 键后,将执行这个命令按钮的 Click 事件。

注释 如果选定的表单对象是编辑框表格,当按 ENTER 时,不会执行默认选择按钮的 Click 事件代码。在编辑框中按 ERENT,将在编辑框中的值加入一个回车和换行符;在表格中按 ENTER,将选择一个相邻的区域。若要执行默认按钮的 Click 事件,请按 CTRL+ENTER。

常用命令按钮属性

设计时刻经常需要设置下面的命令按钮属性。

属性 说明
Cancel 指定当用户按下 ESC 时,执行与命令按钮的 Click 事件相关的代码。
Caption 在按钮上显示的文本。
DisabledPicture 当按钮失效时,显示的 .bmp 文件。
DownPicture 当按钮按下时,显示的 .bmp 文件。
Enabled 能否选择此按钮。
Picture 显示在按钮上的 .bmp 文件。

还可以将命令按钮组成一组,这样即可单独操作,也可作为一个组来统一操作。

通过组来管理命令按钮的选择

要让组中所有命令按钮的 Click 事件代码都用同一个方法程序过程,可将代码加入命令按钮组的 Click 事件代码中。命令按钮组Value 属性指明单击了哪个按钮。如下面的示例代码所示:

DO CASE
   CASE THIS.Value = 1
      WAIT WINDOW "You clicked " + THIS.cmdCommand1.Caption NOWAIT
      * 执行某些动作
   CASE THIS.Value = 2
      WAIT WINDOW "You clicked " + THIS.cmdCommand2.Caption NOWAIT
      * 执行其他动作
   CASE THIS.Value = 3
      WAIT WINDOW "You clicked " + THIS.cmdCommand3.Caption NOWAIT
      * 执行第三种动作
ENDCASE

注释 如果只单击命令按钮组,而没有单击某一个按钮,Value 属性的值仍为上一次选定的命令按钮。

如果为组中某个按钮的 Click 事件编写了代码,当选择这个按钮时,将执行编写的代码而不是组的 Click 事件代码。

常用命令按钮组属性

下面列出了在设计时刻常用的命令按钮组属性。

属性 说明
ButtonCount 组中命令按钮的数目。
BackStyle 命令按钮组是否具有透明或不透明的背景。一个透明的背景与组下面的对象颜色相同,通常是表单或页面的颜色。

使用“超级链接”对象

可以使用“超级链接”对象跳转到 Internet 或 intranet 的一个目标地址上。使用“超级链接”对象启动一个超级链接知道的应用程序(一般是 Internet 浏览器,例如:Microsoft Internet Explorer),然后打开地址中指定的页面。此超级链接的 NavigateTo( ) 方法程序允许您指定跳转目标的地址。

例如,要从表单定位到万维网上的某个 Microsoft Internet 站点,首先应将“超级链接”控件添加到表单上,然后再添加一个命令按钮,随后为此命令按钮的 Click 事件添加以下代码:

THISFORM.Hyperlink1.NavigateTo(‘www.microsoft.com’)

当表单运行时,单击命令按钮即可跳转到 Microsoft Web 站点上。

在给定时间间隔执行指定操作

计时器控件允许在指定的时间间隔执行操作和检查数值。

使用计时器控件

计时器控件与用户的操作独立。它对时间作出反应,可以让计时器以一定的间隔重复地执行某种操作。计时器通常用来检查系统时钟,确定是否到了应该执行某一任务的时间。对于其他一些后台处理,计时器也很有用。

若要查看使用计时器的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后选取“Timer”。

每个计时器都有一个 Interval 属性,它指定了一个计时器事件和下一个计时器事件之间的毫秒数。如果计时器有效,它将以近似等间隔的时间接收一个事件(命名为 Timer 事件)。在使用计时器编程时,必须考虑 Interval 属性的几条限制。

将计时器控件放置在表单中

将计时器控件放置在表单中同于放在其他控件中,只需在“表单控件”工具栏中选择计时器工具并把它拖到表单中即可。

计时器控件

设计时刻,计时器在表单中是可见的,这样便于选择属性、查看属性和为它编写事件过程;而运行时刻,计时器不可见,它的位置和大小都无关紧要。

计时器控件的初始化

计时器控件有两个主要属性:

属性 设置
Enabled 若想让计时器在表单加载时就开始工作,应将这个属性设置为“真”(.T.),否则将这个属性设置为“假”(.F.)。也可以选择一个外部事件(如命令按钮的 Click 事件)启动计时器操作。
Interval Timer 事件之间的毫秒数。

注意,计时器的 Enabled 属性和其他对象的 Enabled 属性不同。对大多数对象来说,Enabled 属性决定对象是否能对用户引起的事件作出反应。对计时器控件来说,将 Enabled 属性设置为“假”(.F.),会挂起计时器的运行。

必须记住 Timer 事件是周期性的。Interval 属性不能决定事件已进行了多长时间,而是决定事件发生的频率。间隔的长短要根据需要达到的精度来确定。由于存在一些潜在的内部误差,请将间隔设置为所需精度的一半。

注释 计时器事件越频繁,处理器就需要用越多的时间响应计时器事件,这样会降低整个程序的性能。除非必要,请尽量不要设置太小的时间间隔。

对计时器事件的响应

当一个计时器的时间间隔过去后,Visual FoxPro 将产生一个 Timer 事件。可以通过检查一些普通的条件(如系统时钟)来对这个事件作出响应。

数字时钟是使用计时器控件的一个简单但非常有用的应用程序。一旦弄清这个应用程序的工作原理,就可以将它改进为闹钟、跑表或其他计时工具。

数字时钟应用程序包括一个计时器和带有边框的标签。在设计时刻,应用程序如下图所示:

数字时钟应用程序

运行时刻,看不见计时器。

控件 属性 设置
lblTime Caption
Timer1 Interval 500 (半秒)
Timer1 Enabled True

这个应用程序唯一的过程是 Timer 事件过程。

IF THISFORM.lblTime.Caption != Time()
   THISFORM.lblTime.Caption = Time()
ENDIF

一般将时间间隔设置为想要区分的最短时间周期的一半(在这里是一秒),根据这一规则,将计时器的 Interval 属性设置为 500 毫秒。这样设置可能使计时器代码在一秒钟内以同样的时间值两次更新标签,从而引起闪烁。所以其中的代码在改变标题之前应先进行测试,看标签中显示的时间是否和现在的时间不同。

显示信息

完美设计的原则之一就是使有关信息可视化。可以用下面的控件来显示用户需要的信息:

使用图象

图象控件允许在表单中添加图片(.bmp 文件)。图象控件和其他控件一样,具有一整套的属性事件方法程序。因此,在运行时刻可以动态地更改它。用户可以用单击、双击和其他方式来交互地使用图象。

下面列出了图象控件的一些主要属性。

属性 说明
Picture 要显示的图片(.bmp 文件)。
BorderStyle 决定图象是否具有可见的边框。
Stretch 如果 Stretch 设置为 0 - 剪裁,那么超出图象控件范围的那一部分图象将不显示;如果 Stretch 设置为 1 - 等比填充,图象控件将保留图片的原有比例,并在图象控件中显示最大可能的图片;如果 Stretch 设置为 2 - 变比填充,将图片调整到正好与图象控件的高度和宽度匹配。

使用标签

标签和文本框不同之处在于标签:

在程序中可以改变标签的 CaptionVisible 属性,便于标签显示不同的内容。

常用的标签属性

下面列出了在设计时刻常用的标签属性:

属性 说明
Caption 标签显示的文本。
AutoSize 确定是否根据标题的长度来调整大小标签。
BackStyle 确定标签是否透明。
WordWrap 确定标签上显示的文本能否换行。

使用文本框和编辑框显示信息

设置文本框和编辑框的 ReadOnly 属性为“真”(.T.),可以显示那些只能查看而不能修改的信息。如果编辑框无效,用户就不能滚动文本。

使用形状和线条

形状线条有助于可视方式将表单中的组件归成组。研究表明,将相关项联系起来有助于用户学习和了解界面,更易于使用应用程序。

下表列出了设计时刻常用的形状属性。

属性 说明
Curvature 从 0(直角)到 99(圆或椭圆)的一个值。
FillStyle 确定形状是透明的还是具有一个指定的背景填充方案。
SpecialEffect 确定形状是平面的还是三维的。仅当 Curvature 属性设置为 0 时才有效。

下表列出了设计时刻常用的线条属性。

属性 说明
BorderWidth 线宽为多少像素点。
LineSlant 当线条不为水平或垂直时,线条倾斜的方向。这个属性的有效值为斜杠 ( / ) 和反斜杠 ( \ )。

使用表单图形显示信息

下面的表单方法程序可在表单中使显示信息图形化。

方法程序 说明
Circle 在表单上画一个圆形或弧。
Cls 清除表单中的图形和文本。
Line 在表单中画线。
Pset 将表单中的某一点设置为指定颜色。
Print 在表单中打印一个字符串。

若要查看使用表单图形的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Forms”,然后选取“Form graphics”。

增强控件显示

除标题外,命令按钮复选框选项按钮也能显示图片。这些控件都具有在控件上显示图片的属性。

属性 说明
DisabledPicture 当按钮无效时,在按钮上显示的图片。
DownPicture 当按钮按下时,在按钮上显示的图片。
Picture 当按钮有效且没有按下时,在按钮上显示的图片。

如果没有指定 DisabledPicture 属性,按钮无效时 Visual FoxPro 将显示变灰的 Picture 指定的图片。如果不指定 DownPicture 属性,按钮按下时 Visual FoxPro 用不同的背景色显示图片,让按钮看上去有按下的效果。

如果只显示图片而不显示标题,可在“属性”窗口的“属性编辑”框中删除默认标题,将 Caption 属性设置为空字符串。

使用图片掩码

通常,一个 .bmp 图片会带有白色空白,而您又不希望这些空白出现在控件中,不规则形状图象周围的白边会使控件很难看。为解决这个问题,Visual FoxPro 为图片创建了一个临时的默认掩码,赋予白色区域透明属性,这样按钮下面的颜色或背景色就能显示出来。若要保留 .bmp 图片中的白色区域,可为 .bmp 图片创建一个自定义的掩码,覆盖默认值。

若要为 .bmp 图片创建掩码

  1. 请在 Microsoft Paint 或其他的位图应用程序中打开 .bmp 文件。

  2. 将所有想在 .bmp 中显示的区域涂黑,而让想透明显示的区域仍保留白色。

  3. 在同样的目录下保存这个文件,文件名与 .bmp 文件相同,但扩展名改为 .msk。

当 Visual FoxPro 加载一个由命令按钮、选项按钮或复选框的 Picture 属性指定的 .bmp 文件时,它在相同的目录下寻找相匹配的 .msk 文件。如果这个目录中存在与这个 .bmp 文件同名的 .msk 文件,Visual FoxPro 把它作为这个 .bmp 文件的掩码,.msk 图片中所有白色区域在 .bmp 图片中都为透明,而 .msk 图片中的黑色区域则照 .bmp 图片中的内容显示。

注释 .bmp 图片和 .msk 图片必须具有相同尺寸,以便掩码能表示 .bmp 图片的区域。

操作多行数据

Visual FoxPro 用一个强有力的工具 - 表格对象 - 显示和操作多行数据。

使用表格

表格是一个容器对象,和表单集包含表单一样,表格也能包含列。这些列除了包含标头和控件外,每一个列还拥有自己的一组属性事件方法程序,从而为表格单元提供了大量的控件。

容器 可以包含
表格
标头,控件

表格对象能在表单页面中显示并操作行和列中的数据。使用表格控件的一个非常有用的应用程序是创建一对多表单,例如一个发票表单。

若要查看使用表格的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后选取“Grid”。

放置了表格的表单

若要将表格控件添加到表单

如果没有指定表格的 RecordSource 属性,同时在当前工作区中有一个打开的表,那么表格将显示这个表的所有字段。

设置表格列数

首先需要设置的表格控件属性是列数。

若要设置表格中的列数

  1. 在属性和方法程序列表中选择 ColumnCount 属性。

  2. 在属性框中,键入需要的列数。

如果 ColumnCount 属性设置为 -1(默认值),在运行时刻,表格将包含与其链接的表中字段同样数量的列。

在设计时刻人工调整表格的显示效果

在表格中加入列后将改变列的宽度和行的高度。可以在“属性”窗口中人工设置列和行对象的高度和宽度属性,也可以在设计表格时以可视方式设置这些属性。

若要切换到表格设计方式

在表格设计方式下,表格周围将显示一个粗框。若要退出表格设计方式,只需选择表单或其他控件。

若要调整表格中列的宽度

  1. 在表格设计方式下,将鼠标指针置于表格列的标头之间,这时指针变为带有左右两个方向箭头的竖条。

  2. 将列拖动到需要的宽度。

    – 或者 –

    “属性”窗口中设置列的 Width 属性。

若要调整表格中行的高度

  1. 在表格设计方式下,将鼠标指针置于“表格”控件左侧的第一个按钮和第二个按钮之间,这时指针将变成带有向上和向下箭头的横条。

  2. 将行拖动到需要的宽度。

    – 或者 –

    “属性”窗口中设置列的 Height 属性。

提示AllowRowSizing 设置为“假”(.F.),可以防止用户在运行时刻改变表格行的高度。

设置表格中显示的数据源

可以为整个表格设置数据源,也可以为每个列单独设置数据源。

若要为整个表格设置数据源

  1. 请选择表格,然后单击“属性”窗口的 RecordSourceType 属性。

  2. 如果让 Visual FoxPro 打开表,请将 RecordSourceType 属性设置为“0 — 表”;如果在表格中放入打开表的字段,则将 RecordSourceType 属性设置为“1 — 别名”。

  3. 单击“属性”窗口中的 RecordSource 属性。

  4. 键入作为表格数据源别名名。

想在特定的列中显示一个特定字段,也可以为列设置数据源

若要设置列的数据源

  1. 选择列,然后单击“属性”窗口的 ControlSource 属性。

  2. 键入作为列的数据源的别名名或字段名。例如,可以键入:
    Orders.order_id
    

向表格添加记录

将表格的 AllowAddNew 属性设置为“真”(.T.),可以允许用户向表格中显示的表中添加新的记录。如果将 AllowAddNew 属性设置为真,当用户选中了最后一个记录,并且按下 DOWN ARROW 键时,就向表中添加了新记录。

如果您还想进一步控制用户什么时候向表中添加新记录,可以将 AllowAddNew 属性设置为默认的“假”(.F.),并使用 APPEND BLANKINSERT 命令添加新记录。

使用表格控件创建一对多表单

表格最常见的用途之一是,当文本框显示父记录数据时,表格显示表的子记录;当用户在父表中浏览记录时,表格将显示相应的子记录。

如果表单的数据环境包含两表之间的一对多关系,那么要在表单中显示这个一对多关系非常容易。

若要设置具有数据环境的一对多表单

  1. 将需要的字段从“数据环境”中的父表拖动到表单中。

  2. 从“数据环境”中将相关的表拖动到表单中。

在大多数情况下,都要为表单或表单集创建一个数据环境,但是即使不用“数据环境”,创建一对多表单也并不复杂。

若要创建没有数据环境的一对多表单

  1. 将文本框添加到表单中,显示主表中需要的字段。

  2. 设置文本框的 ControlSource 属性为主表。

  3. 在表单中添加一个表格。

  4. 将表格的 RecordSource 属性设置为相关表的名称。

  5. 设置表格的 LinkMaster 属性为主表名称。

  6. 设置表格的 ChildOrder 属性为相关表中索引标识的名称,索引标识和主表中的关系表达式相对应。

  7. 将表格的 RelationalExpr 属性设置为联接相关表和主表的表达式。例如,如果 ChildOrder 标识以“lastname + firstname”建立的索引,应将 RelationalExpr 也设置为相同的表达式。

无论用哪种方法建立一对多表单,都可以添加定位控件,浏览父表并刷新表单对象。例如,在一个命令按钮的 Click 事件中可包含下面的代码:

SELECT orders && 如果 orders 是父表
SKIP
IF EOF( )
   GO BOTTOM
ENDIF
THISFORM.Refresh

在表格列中显示控件

除了在表格中显示字段数据,还可以在表格的列中嵌入控件,这样就为用户提供嵌入的文本框复选框下拉列表框微调按钮和其他控件。例如,如果表中有一个逻辑字段,当运行该表单时,通过辨认复选框可以判定哪个记录值是“真”(.T.) 和哪个记录值是“假”(.F.)。修改这些值只需设置或清除复选框即可。

可以在“表单设计器”中交互地向表格列中添加控件,也可以通过编写代码在运行时刻添加控件。

若要交互地在表格列中添加控件

  1. 在表单中添加一个表格。

  2. “属性”窗口中,将表格的 ColumnCount 属性设置为需要的列数。

    例如,如果需要一个两列的表格则键入“2”。

  3. 在“属性”窗口的“对象”框中为控件选择父列。

    例如,要选择 Column1 来添加控件,当选择这一列时,表格的边框发生变化,表明正在编辑一个包含其中的对象。

  4. “表单控件”工具栏中选择所要的控件,然后单击父列。

    在“表单设计器”中,新控件不在表格列中显示,但在运行时刻会显示出来。

  5. 在“属性”窗口中,要确保该控件缩进显示在“对象”框中父列下面。

    添加到表格列中的复选框

    如果新控件是一个复选框,应将复选框的 Caption 属性设置为“ ”,并将列的 Sparse 属性设置为“假”(.F.)。

  6. 将父列的 ControlSource 属性设置为需要的表字段。

    例如,下面的演示中,列的 ControlSource 属性是文件 TESTDATA.DBC 的 products.discontinu,这个文件保存在 \Samples\VFP\DATA 目录下。

  7. 将父列的 CurrentControl 属性设置为新加入的控件。

当运行表单时,这个控件将显示在表格列中。

在运行时刻,复选框显示在列中

提示 如果想让复选框在表格列中居中,可先创建一个容器类,将复选框添加到容器类中,并调整复选框在容器类中的位置。然后将容器类添加到表格列中,并将复选框的 ControlSource 属性设置为需要的字段。

若要在“表单设计器”中移去表格列中的控件

  1. “属性”窗口的对象框中选择要移去的控件。

  2. 激活“表单设计器”

    如果“属性”窗口可见,控件的名称将显示在“对象”框中。

  3. 按下 DELETE 键。

也可以在代码中使用 AddObject 方法程序将控件添加到表格列中。

若要通过代码将控件添加到表格列

例如,Init 事件包含了如下代码,向列中添加两个控件,并将其中一个设置为当前控件:

THIS.grcColumn1.AddObject("spnQuantity", "SPINNER")
THIS.grcColumn1.AddObject("cboQuantity", "COMBOBOX")
THIS.grcColumn1.CurrentControl = "spnQuantity"
* 下面的代码确保控件是可见的,并且显示在表格中的每一行。
THIS.grcColumn1.spnQuantity.Visible = .T.
THIS.grcColumn1.Sparse = .F.

在本例中,Column1 有三个可能的当前控件值:

注释 在表格级上设置的属性并不会传到列或标头。因此,必须直接设置标头或所包含控件的属性,它们不会继承列级别的属性设置。

提示 要想在表格列中显示组合框最佳状态,请设置下列组合框属性∶

BackStyle = 0      && s-
Margin = 0
SpecialEffect = 1 && -G
BorderStyle = 0      && r

在表格中进行有条件的格式设置

表格中的特定格式能让用户更容易浏览表格记录,并找出想要的信息。如果想进行有条件的格式设置,可使用列的动态字体和颜色属性。

例如,可以将表格添加到表单中,并将 ColumnCount 属性设置为 2。将第一列的 ControlSource 属性设置为 orders.to_name,第二列的 ControlSource 属性设置为 orders.order_net。如果想用黑色的前景色显示少于 500.00 的订货总计,用红色的前景色显示大于或等于 500.00 的订货总计,可在表格的 Init 事件代码中包含下列代码:

THIS.Column2.DynamicForeColor = ;
   "IIF(orders.order_net >= 500, RGB(255,0,0), RGB(0,0,0))"

常用的表格属性

下表列出了设计时刻常用的表格属性。

属性 说明
ChildOrder 父表主关键字相联接的子表中的外部关键字
ColumnCount 列的数目。如果 ColumnCount 设置为 -1,表格将具有和表格数据源中字段数一样多的列。
LinkMaster 显示在表格中的子记录的父表。
RecordSource 表格中要显示的数据。
RecordSourceType 表格中显示数据来源于何处:别名查询或用户根据提示选定的表。

常用的列属性

下表列出了在设计时刻常用的列属性。

属性 说明
ControlSource 在列中要显示的数据。常见的是表中的一个字段。
Sparse 如果将 Sparse 属性设置为“真”(.T.),表格中控件只有在列中的单元被选中时才显示为控件(列中的其他单元仍以文本形式显示)。将 Sparse 设置为“真”(.T.),允许用户在滚动一个有很多显示行的表格时能快速重画。
CurrentControl 表格中哪一个控件是活动的。默认值为“Text1”。如果在列中添加了一个控件,则可以将它指定为 CurrentControl。

注释 列中控件的 ReadOnly 属性被列的 ReadOnly 属性覆盖。如果在和 AfterRowColChange 事件相关的代码中设置列中控件的 ReadOnly 属性,当指针位于该列时,新的设置有效。

使控件易于使用

您一定想让用户尽可能容易地了解和使用控件。使用访问键、Tab 键次序、工具提示文本或者有选择地使某些项无效都能让您设计出易于使用的应用程序。

设置访问键

访问键能在表单中的任何地方通过按 ALT 和访问键来选择一个控件。

若要为控件指定访问键

例如,下面是对命令按钮的 Caption 属性的设置,将 O 作为它的访问键。

\<Open

用户能在表单中任何地方按 ALT+O 选择这个命令按钮

若要为文本框或编辑框指定访问键

  1. 创建一个标签,在作为访问键的字母前键入一个反斜杠和一个小于符号 (\<),例如,C\<ustomer

  2. 如果您想在文本框或编辑框中接受焦点,要保证该标签为位于文本框或编辑框之前的 Tab 键次序中的控件。

设置控件的 Tab 键次序

表单控件的默认 Tab 键次序是控件添加到表单时的次序。

提示 设置控件的 Tab 键次序可以使用户按照逻辑顺序在控件之间移动。

若要改变控件的 Tab 键次序

  1. “表单设计器”工具栏中选择“设置 Tab 键次序”。

  2. 双击控件旁边的框,这个控件将在表单打开时具有最初焦点。

  3. 按需要的 Tab 键次序依次单击框。

  4. 单击控件外的任何地方,完成设置。

也可以根据“选项”对话框的“表单”选项卡中的设置,按照列表为表单中的对象设置 Tab 键次序。

可以在一个控件组中设置选项按钮和命令按钮的选择顺序。要想使用键盘移动到一个控件组,用户需要按 Tab 键移动到控件组的第一个按钮,然后使用箭头键选择该组中其他按钮。

若要更改一个控件组中按钮的选择顺序

  1. “属性”窗口中,在“对象”列表里选择控件组。一条粗的边框表明该组处于编辑状态。

  2. 选择“表单设计器”窗口。

  3. 从“显示”菜单中选择“Tab 键次序”命令。

  4. 选择合适的 Tab 键次序。

设置工具提示文本

每个控件都有一个 ToolTipText 属性,当用户的鼠标指针在控件上停留时,将显示这个属性指定的文本。提示对于带有图标而没有文本的按钮特别有用。

若要指定工具提示文本

表单的 ShowTips 属性决定是否显示工具提示文本。

更改鼠标指针的显示

可以改变鼠标指针的显示,直观地为用户提供应用程序所处的不同状态。

例如,在 Tasmanian Traders 示例应用程序的 tsBaseForm 类中,一个 WaitMode 方法程序将鼠标指针改变为默认的等待状态光标。在运行任何需要持续一段时间的代码之前, Tasmanian Traders 应用程序将一个真值 (.T.) 传递给 WaitMode 方法程序,以改变指针的形状,使用户知道此过程正在进行中。当执行过程结束时,使用假值 (.F.) 调用 WaitMode 方法程序,可以恢复默认的鼠标指针形状。

* tsBaseForm 类的 WaitMode 方法程序
LPARAMETERS tlWaitMode

lnMousePointer = IIF(tlWaitMode, MOUSE_HOURGLASS, MOUSE_DEFAULT)
thisform.MousePointer = lnMousePointer
thisform.SetAll('MousePointer', lnMousePointer)

如果您不想将鼠标指针改变为默认形状,可将 MousePointer 属性设置为 99 - 自定义,并将 MouseIcon 属性设置为自己的光标 (.cur) 或图标 (.ico) 文件。

启用和废止控件

在某给定情况下,如果不能使用某个控件,可将该控件的 Enabled 属性设置为“假”(.F.)。

启用和废止组中的按钮

将每个按钮的 Enabled 属性设置为“真”(.T.) 或“假”(.F.),可以启用或废止组中单个选项按钮或命令按钮。也可通过设置组的 Enabled 属性来启用或废止组中全部按钮。如下面一行代码所示:

frmForm1.cmgCommandGroup1.Enabled = .T.

选项按钮组命令按钮组的 Enabled 属性设置为“假”(.F.) 时,组中所有按钮都将废止,但不会显示出禁用的前景色和背景色。设置组的 Enabled 属性不会影响组中单个按钮的 Enabled 属性,这就可以废止其中有些按钮已经失效的按钮组。当重新启用该按钮组时,原来失效的按钮仍然失效。

如果让组中的所有按钮失效,以显示为失效的外观,并且不保留组中按钮哪些有效、哪些失效的信息,可使用组的 SetAll 方法程序,如下所示:

frmForm1.opgOptionGroup1.SetAll("Enabled", .F.)

允许用户拖放

在设计 Visual FoxPro 应用程序时,可以将对象从“项目管理器”“数据库设计器”“数据环境”中拖动到表单或报表上合适的位置。可以在运行时刻扩展 Visual FoxPro 的这一拖放功能。

拖放功能可以扩展为多表单操作。用户可以将文本、文件和控件拖动到屏幕的任何位置,包括其他的表单上。

Visual FoxPro 目前支持两种类型的拖放:OLE 拖放和控件拖放。OLE 拖放允许您在两个支持 OLE 拖放功能的应用程序(例如 Visual FoxPro、Visual Basic、Windows 资源管理器、Microsoft Word 和 Excel 等等)之间移动数据。在一个发布的 Visual FoxPro 应用程序中,可以在应用程序的控件之间移动数据,或者在控件和其他支持 OLE 拖放功能的 Window 应用程序之间移动数据。

控件拖放功能允许您在 Visual FoxPro 应用程序内拖放 Visual FoxPro 控件。早期的 Visual FoxPro 版本同样也支持控件拖放功能。当用户拖动控件时,Visual FoxPro 提供了和对象相同尺寸的灰色外框,并和鼠标指针一起移动。您可以为控件的 DragIcon 属性指定一个光标文件 (.cur) 来覆盖默认方式。

本节描述了控件的拖放功能,有关 OLE 拖放的详细内容,请参阅第三十一章“互操作性和 Internet”中的“OLE 拖放”

若要查看控件拖放的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后选取“General”。

在运行时刻拖动一个图象控件

注释 在运行时刻拖动控件并不改变控件的位置,但可以按照本章稍后的“在拖放操作中引起控件移动”一节中的说明,编写重新定位的程序,改变控件位置。通常拖动只是用于指示执行某些操作,当用户释放鼠标按钮后,控件仍将保留在原来的位置。

使用下面的拖放属性、事件和方法程序,可以指定拖动操作的含义,也可以指定控件拖动的方式。

若要 使用下列特性
指定是自动还是人工拖动控件。 DragMode 属性
指定控件在拖动时显示的图标。 DragIcon 属性
识别何时控件放到对象上。 DragDrop 事件
识别何时控件拖过对象。 DragOver 事件
启动和停止人工拖动。 Drag 方法程序

所有可视的控件在运行时刻都可以拖动,并且所有控件都拥有上表中列出的属性。表单能识别 DragDrop 和 DragOver 事件,但不具备 DragMode 和 DragIcon 属性。

启用自动拖动方式

如果允许用户无论何时单击控件时都能拖动控件,可将 DragMode 属性设置为 1,这能启用控件的自动拖动方式。当拖动设置为“自动”时,拖动功能总是打开的。

注释 在自动拖动方式下,被拖动的控件不识别其他的鼠标事件。

在用户停放对象时的响应

拖动控件之后释放鼠标按钮时,Visual FoxPro 产生一个 DragDrop 事件,对这一事件有多种响应方法。可将控件重新定位在新的位置(由灰色外框的最后位置来指明)。记住,控件不会自动移到新的位置。

在讨论拖放操作时,有两个术语很重要 — “源”和“目标”。

术语 意义
被拖动的控件。
目标 用户将控件拖到其上的对象。这个对象可以是一个能识别 DragDrop 事件的表单或控件。

释放鼠标时,如果鼠标指针处于一个控件边框内,这个控件就成了目标。如果指针处于表单的空白部分,表单将成为目标。

DragDrop 事件接受三个参数oSourcenXCoordnYCoordoSource 参数是对拖放到目标上的控件的引用,nXCoord nYCoord 参数分别包含了鼠标指针在目标中的水平和垂直坐标。

因为 oSource 是一个对象,所以可以象使用控件那样使用它 -- 可以引用它的属性或调用它的方法程序。例如,下面列出的是与 DragDrop 事件相关的代码中的语句,检查用户是否已将一个控件停放到自己上面。

LPARAMETERS oSource, nXCoord, nYCoord
IF oSource.Name != THIS.Name
   * 执行某些动作。
ELSE
   * 控件在自己上面停放。
   * 执行其他动作。
ENDIF

oSource 的所有可能控件类型都有 Visible 属性。因此,当把控件拖放到表单中某一部分或另一个控件上时,可以让控件隐藏。下面几行是一个图像控件的 DragDrop 事件的相关代码,它使一个拖动控件在拖放到图象上时变为不可见。

LPARAMETERS oSource, nXCoord, nYCoord
oSource.Visible = .F.

指示有效的停放区

当启用拖放功能时,可以提示用户哪些地方可以停放控件,哪些地方不能停放控件。完成这个功能最好的方法是在 DragOver 事件的相关代码中改变数据源的 DragIcon 属性。

在下列代码中,一个控件的 DragOver 事件向用户指示这个控件不是一个有效的停放目标。这个例子中的 cOldIcon 是用户自定义的表单属性。

LPARAMETERS oSource, nXCoord, nYCoord, nState
DO CASE
   CASE nState = 0 && 进入
      THISFORM.cOldIcon = oSource.DragIcon
      oSource.DragIcon = "NODROP01.cur"
   CASE nState = 1 && 离开
      oSource.DragIcon = THISFORM.cOldIcon
ENDCASE

控件拖动的开始和停止时间

DragMode 属性有两个设置:人工和自动拖动,人工设置允许用户对控件进行更灵活的控制。它允许用户指定什么时候拖动控件,什么时候不拖动(当 DragMode 设置为自动拖动时,总能拖动控件)。

例如,可以在对 MouseDown 和 MouseUp 事件的响应中启用拖动,也可以在对键盘或菜单命令的响应中启动。设置为人工时,控件在被拖动前还可以识别一个 MouseDown 事件,可以在该事件中记录鼠标位置。

要从代码中启用拖动,应将 DragMode 设为默认设置(0 - 人工 ),然后在开始或停止拖动对象时调用 Drag 方法程序

container.control.Drag(nAction)

如果 nAction 为 1,Drag 方法程序初始化控件的拖动操作;如果 nAction 为 2,停放控件,并产生一个 DragDrop 事件;nAction 为 0 时,取消拖动,其效果除不能产生 DragDrop 事件外与 nAction 值为 2 时类似。

注释 要从列表框中启用拖放操作,最好是在源列表框 MouseMove 事件的相关代码中调用 Drag 方法程序(必须在确定鼠标按钮按下之后)。有关示例请参阅 Visual Studio …\Samples\Vfp98\Solution\Controls\Lists 目录下的 Lmover.scx。

在拖放操作中引起控件移动

有时用户在释放鼠标按钮后,需要改变源控件的位置。要让控件移动到新的鼠标位置,可使用 Move 方法程序。例如,下面列出的表单的 DragDrop 事件代码就将被拖动的控件移动到停放位置。

LPARAMETERS oSource, nXCoord, nYCoord
oSource.Move(nXCoord, nYCoord)

因为控件的左上角置于鼠标的位置上,这些代码也许不能达到想要的精确效果。下面的代码将控件中心置于鼠标的位置上。

LPARAMETERS oSource, nXCoord, nYCoord
oSource.Move ((nXCoord – oSource.Width / 2), ;
   (nYCoord – oSource.Height / 2))

只有将 DragIcon 属性设置为非默认值(灰色矩形框)时,上述代码才能获得最好的效果。如果使用的是灰色矩形框,用户通常根据灰色矩形框的最后位置来精确确定控件的位置。要做到这点,应记录下鼠标在源控件中的最初位置,然后用这个位置作为计算控件移动偏移量的基准。有关示例,请参阅 Visual Studio …\Samples\Vfp98\Solution\Forms 目录下的Ddrop.scx。

若要记录最初的鼠标位置

  1. 指定控件为人工拖动方式。

  2. 声明两个表单级的变量,nDragX 和 nDragY

  3. MouseDown 事件发生时启用拖动,同时在这个事件中将 nXCoordnYCoord 值保存在表单级变量中。

  4. MouseUp 事件发生时关闭拖动功能。

扩展表单

页框能扩展表单的表面面积,ActiveX 控件则能扩展表单的功能。

使用页框

页框是包含页面的容器对象,页面又可包含控件。可以在页框、页面或控件级上设置属性。

若要查看使用页框的示例

  1. 运行 Solution.app ,该文件位于 Visual Studio …\Samples\Vfp98\Solution 目录下。

  2. 在目录树视图中,单击“Controls”,然后选取“Page frame”。

可以把页框想象为有多层页面的三维容器,只有最上层页面(或在页框的顶部)中的控件才是可见和活动的。

表单上一个页框可有多个页面

页框定义了页面的位置和页面的数目,页面的左上角固定在页框的左上角。控件能放置在超出页框尺寸的页面上。这些控件是活动的,但如果不从程序中改变页框的 HeightWidth 属性,那么这些控件不可见。

在应用程序中使用页面

使用页框和页面,可以创建带选项卡的表单或对话框,和“项目管理器”中见到的一样。

此外,用页框还能在表单中定义一个区域,在这个区域中可以方便地将控件换入换出。例如,在向导中,表单的大部分内容是保持不变的,但有一个区域在每一步都要更改。此时不必为向导的不同步骤创建五个表单,而只需创建一个带有页框的表单,页框中有五个页面即可。

Visual Studio ...\Samples\Vfp98\Solution 目录中有一个文件 Solution.app,其中包含了一个有两个页框的示例,说明了带有选项卡和不带有选项卡的页框的使用方法。

将页框添加到表单中

表单中可以包含一个或多个页框。

若要将页框添加到表单

  1. “表单控件”工具栏中,选择“页框”按钮并在“表单”窗口拖动到想要的尺寸。

  2. 设置 PageCount 属性,指定页框中包含的页面数。

    有四个页面的页框

  3. 从页框的快捷菜单中选择“编辑”命令,将页框激活为容器。页框的边框变宽,表示它处于活动状态。

  4. 同于向表单中添加控件的方法,向页框中添加控件。

    注释 和其他容器控件一样,必须选择页框,并从用鼠标右键弹出的快捷菜单中选择“编辑”命令,或在“属性”窗口的“对象”下拉列表中选择容器。这样,才能先选择这个容器(具有宽边),再朝正设计的页面中添加控件。在添加控件前,如果没有将页框作为容器激活,控件将添加到表单中而不是页面中,即使看上去好象是在页面中。

若要在页框中选择一个不同的页面

  1. 单击鼠标右键,将页框作为容器激活,然后选择“编辑”。

  2. 选择要使用的页面选项卡。

    – 或者 –

将控件添加到页面上

如果将控件添加到页面上,它们只有在页面活动时才可见和活动。

若要将控件添加到页面上

  1. “属性”窗口的“对象”框中选择页面,页框的周围出现边框,表明可以操作其中包含的对象

  2. “表单控件”工具栏中,选择想要的控件按钮并在页面中调整到想要的大小。

管理“页面”选项卡上的长标题

如果选项卡上的标题太长,不能在给定页框宽度和页面数的选项卡上显示出来,可以有下面两种选择:

在程序中换页面

不管页框是否具有选项卡,都可以从程序中使用 ActivePage 属性来激活一个页面。例如,下面列出表单中一个命令按钮的 Click 事件过程代码,它将表单中页框的活动页面改为第三页面。

THISFORM.pgfOptions.ActivePage = 3

常用的页框属性

下表列出了在设计时刻常用的页框属性。

属性 说明
Tabs 确定页面的选项卡是否可见。
TabStyle 是否选项卡都是相同的大小,并且都与页框的宽度相同。
PageCount 页框的页面数。

ActiveX控件

单击“ActiveX 控件”按钮,并在“表单”窗口中将其拖至期望的大小,可以将 OLE 对象添加到表单。这个工具可以处理诸如 Microsoft Excel 或 Microsoft Word 服务程序对象。另外,如果 Windows SYSTEM 目录上包含 ActiveX 控件(带有 .ocx 扩展名的文件),它也可以表示一个 ActiveX 控件。有关 ActiveX 控件的一般内容,请参阅第十六章“添加 OLE”

ActiveX 绑定控件

单击“ActiveX 绑定控件”按钮,并在“表单”窗口中拖至期望的大小,可以在表单中创建一个绑定型 OLE 控件对象。在创建这个对象后,可以将它和表中的通用字段链接,然后可以用这个对象显示字段中的内容。例如,如果将 Word 文件保存在通用字段中,就可以在表单中使用一个绑定型 OLE 对象来显示这些文件的内容。

若要创建一个绑定型 OLE 对象

  1. 创建或打开表单。

  2. “表单控件”工具栏中选择“ActiveX 绑定控件”按钮,并在表单中将它拖至期望的大小。

  3. 设置对象的 ControlSource 属性,将这个 OLE 对象和通用字段链接。

有关使用ActiveX 绑定控件的示例,请参阅第十六章“添加 OLE”