157
22/3/29 1 第6第 第第第第第第第第第第第第 第第第第 第第第第第第第第 第第第第 第第第第 第第第第第第 第第第第第第 第第

第 6 章 利用表单设计应用程序界面

  • Upload
    mikasi

  • View
    196

  • Download
    0

Embed Size (px)

DESCRIPTION

第 6 章 利用表单设计应用程序界面. 设计表单 在表单中添加对象 处理对象 管理表单 控件使用要点 控件使用技巧 小结. 6.1 设计表单. 设置数据环境 创建单文档和多文档界面 用表单集扩充表单. 表单设计器. VFP 提供了一个功能强大的“表单设计器”,使得设计表单的工作变得又快又容易。 在“表单设计器”中可以处理下列内容: 表单中不同类型的对象。 与表单相关联的数据。 顶层表单或子表单。 能一起操作的多个表单。 基于自定义模板的表单。. 表单和表单集. - PowerPoint PPT Presentation

Citation preview

23/4/24 1

第 6 章 利用表单设计应用程序界面 设计表单 在表单中添加对象 处理对象 管理表单 控件使用要点 控件使用技巧 小结

23/4/24 2

6.1 设计表单 设置数据环境 创建单文档和多文档界面 用表单集扩充表单

23/4/24 3

表单设计器 VFP 提供了一个功能强大的“表单设计器”,使得设计表单的工作变得又快又容易。 在“表单设计器”中可以处理下列内容:

• 表单中不同类型的对象。• 与表单相关联的数据。• 顶层表单或子表单。• 能一起操作的多个表单。• 基于自定义模板的表单。

23/4/24 4

表单和表单集 表单和表单集是拥有自己的属性、事件和方法程序的对象,在“表单设计器”中可以设置这些属性、事件和方法程序。 表单集包括了一个或多个表单,可以将它们作为一个整体来操作。例如,如果在表单集中有 4 个表单,可以在运行时用一个命令显示或隐藏它们。 可使用如下 3 种方法之一新建一个表单:

• 在项目管理器中先选定“表单”,然后单击“新建”按钮。• 选择“文件”菜单中的“新建”命令,选定“表单”,并单击“新建文件”按钮。• 使用 CREATE FORM 命令。

23/4/24 5

表单设计器(续) 如图 6-1 所示,“表单设计器”包含下列工具栏:“表单设计器”、“表单控件”、“布局”和“调色板”。

图 6-1 “ 表单设计器”及其工具栏

23/4/24 6

6.1.1 设置数据环境 每一表单或表单集都包括一个数据环境。 数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。 可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。 在表单运行时,数据环境可自动打开、关闭表和视图。并且,通过设置“属性”窗口中的

ControlSource 属性设置框,“数据环境”将帮助设置控件的 ControlSource 属性,在这个属性框中列出了数据环境中的所有字段。

23/4/24 7

6.1.1 设置数据环境 若要打开“数据环境设计器”,可按如下步骤操作:

( 1 )从“显示”菜单或快捷菜单中选择“数据环境”命令,出现如图 6-2 所示的窗口。( 2 )从快捷菜单中选择“添加”命令。( 3 )在“添加表或视图”对话框中选择一表或视图添加到数据环境中去。

图 6-2 数据环境设计器

23/4/24 8

1. 常用数据环境属性 表 6-1 列出了属性窗口中经常设置的数据环境属性。

属性 说明 默认设置AutoCloseTables 控制当释放表或表单集时,

是否关闭表或视图 “ ”真 ( .T.)

AutoOpenTables控制当运行表单时,是否打开数据环境中的表或视图 “ ”真 ( .T.)

InitialSelectedAlias

当运行表单时选定的表或视图“ ”设计时为 。如果没有指定,

“在运行时首先加到 数据环”境 中的临时表最先被选定

表 6-1 常用数据环境属性

23/4/24 9

2. 向“数据环境设计器”中添加表或视图 向“数据环境设计器”添加表或视图时,可以看到属于表或视图的字段和索引。 若要向数据环境中添加表或视图时,可按如下步骤进行:

( 1 )在“数据环境设计器”中,从“数据环境”菜单中选择“添加”命令。( 2 )在“添加表或视图”对话框中,从列表中选择一个表或视图。如果没有打开的数据库或项目,通过选择“其他”来选择表。

也可以将表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。 当“数据环境设计器”处于活动状态时,“属性”窗口会显示与数据环境相关联的对象及属性。在“属性”窗口的“对象”框中,数据环境的每个表格或视图,表格之间的每个关系,以及数据环境本身均是各自独立的对象。

23/4/24 10

3. 从“数据环境设计器”中移去表 当从“数据环境设计器”中移去表时,与这个表有关的所有关系也随之移去。 若要将表或视图从“数据环境设计器”中移去,可以:

• 在“数据环境设计器”中选择要移去的表或视图。• 从“数据环境”菜单中选择“移去”命令。

23/4/24 11

4. 在“数据环境设计器”中设置关系 如果添加进“数据环境设计器”的表具有在数据库中设置的永久关系,这些关系将自动地添加到数据环境中。 如果表中没有永久的关系,可以在“数据环境设计器”中设置。 要在“数据环境设计器”中设置关系,可将字段从主表拖动到相关表中的字段上。 如果和主表中的字段相关的表中没有索引标识,系统将提示用户是否创建索引标识。

23/4/24 12

5. 在“数据环境设计器”中编辑关系 在“数据环境设计器”中设置了一个关系后,在表之间将有一条连线指出这个关系。 若要编辑关系的属性,可在属性窗口中从名称列表框选择要编辑的关系。 关系的属性对应于 SET RELATION 和 SET SKIP命令中的子句和关键字。 RelationalExpr 属性的默认设置为主表中关键字字段的名称。 如果相关表是以表达式作为索引的,就必须将

RelationalExpr 属性设置为这个表达式。• 例如,如果相关表以 ALLTRIM(xh) 作为索引,就必须将

RelationalExpr 属性设置为 ALLTRIM(xh) 。

23/4/24 13

5. 在“数据环境设计器”中编辑关系(续) 如果关系不是一对多关系,必须将 OneToMany 属性设置为“假”,这对应于使用 SET RELATION命令时不发出 SET SKIP 命令。 将关系的 OneToMany 属性设置为“真”,相当于发出 SET SKIP 命令。 当浏览父表时,在记录指针浏览完子表中所有的相关记录之前,记录指针一直停留在同一父记录上。

• 注意:如果在表单或表单集中想设置一对多关系,必须将 OneToMany 属性设置为“真”,甚至在数据库中已经建立了永久一对多关系时,也必须如此。

23/4/24 14

6.1.2 创建单文档和多文档界面 VFP允许创建两种类型的应用程序:

• 多文档界面( MDI ):各个应用程序由单一的主窗口组成,且应用程序的窗口包含在主窗口中或浮动在主窗口顶端。• 单文档界面( SDI ):应用程序由一个或多个独立窗口组成,这些窗口均在 Windows桌面上单独显示。

由单个窗口组成的应用程序通常是一个 SDI 应用程序,但也有一些应用程序综合了 SDI 和 MDI 的特性。• 例如, Visual FoxPro 将调试器显示为一 SDI 应用程序,而它本身又包含了自己的 MDI 窗口。

23/4/24 15

6.1.2 创建单文档和多文档界面(续) 为了支持这两种类型的界面, VFP允许创建以下几种类型的表单,如图 6-3 所示。

图 6-3 子表单、浮动表单和顶层表单

23/4/24 16

6.1.2 创建单文档和多文档界面(续) 子表单:包含在另一个窗口中,用于创建 MDI 应用程序的表单。

• 子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。 浮动表单:属于父表单(主表单)的一部分,但并不包含在父表单中,可以被移至屏幕的任何位置,但不能在父窗口后台移动。浮动表单也可用于创建

MDI 应用程序。• 若将浮动表单最小化时,它将显示在桌面的底部。• 如父表单最小化,则浮动表单也一同最小化。

顶层表单:没有父表单的独立表单,用于创建一个SDI 应用程序,或用作 MDI 应用程序中其他子表单的父表单。

23/4/24 17

1. 指定表单类型 创建各种类型的表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。 如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且需要指定是否是 MDI类的子表单,即指出表单的最大化是如何工作的。 如果子表单是 MDI 类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单及工具栏。 非 MDI 类的子表单,最大化时将占据父表单的全部用户区域,但仍保留它本身的标题和标题栏。

23/4/24 18

1. 指定表单类型(续) 若要建立一个子表单,可以:

( 1 )用“表单设计器”创建或编辑表单。( 2 )可将表单 ShowWindows 属性设置为下列值之一:

1 ) 0 : In Screen 。子表单的父表单将为 VFP 主窗口。2 ) 1 : In Top-Level Form 。当子窗口显示时,子表单的父表单是活动的顶层表单。如果希望子窗口出现在顶层表单窗口内,而不是出现在 VFP 主窗口内时,可选用该项设置。

( 3 )如果希望子表单最大化时与父表单组合成一体,可设置表单的 MDIForm 属性为“真”( .T. );如果希望子表单最大化时仍保留为一独立的窗口,可设置表单的 MDIForm 属性为“假”( .F. )。

23/4/24 19

1. 指定表单类型(续) 浮动表单是由子表单变化而来的。若要指定为浮动表单,可以:

( 1 )用“表单设计器”创建或编辑表单。( 2 )可将表单的 ShowWindow 属性设置为以下值之一:

1 ) 0 :在屏幕中。浮动表单的父表单将出现在 VFP 主窗口。2 ) 1 :在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表单。

( 3 )将表单的 Desktop 属性设置为“真”。 若要指定顶层表单,可以:

( 1 )用“表单设计器”创建或编辑表单。( 2 )将表单 ShowWindow 属性设置为“ 2- 作为顶层表单”。

23/4/24 20

2. 显示位于顶层表单中的子表单 如果所创建的子表单中的 ShowWindow 属性设置为“ 1- 在顶层表单中”,则不需直接指定一顶层表单作为子表单的父表单。而是在子窗口出现时,指定子表单成为父表单。

若要显示位于顶层表单中的子表单,可以:( 1 )创建顶层表单。( 2 )在顶层表单的事件代码中包含 DO FORM 命令,指定要显示的子表单的名称。例如,在顶层表单中建立一个按钮,然后在按钮的 Click 事件代码中包含如下命令:

DO FORM Subform• 注意:在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的 Init 事件来显示子表单,因为此时顶层表单还未激活。( 3 )激活顶层表单,如有必要,触发用以显示子表单的事件。

23/4/24 21

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

23/4/24 22

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.

23/4/24 23

6.1.3 用表单集扩充表单 可以将多个表单包含在一个表单集中,作为一组处理。表单集有以下优点:

• 可同时显示或隐藏表单集中的全部表单。• 可以可视地调整多个表单,以控制它们的相对位置。• 因为表单集中所有表单都是在单个 .SCX 文件中用单独的数据环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录则被更新和显示。

注意:运行表单集时,将加载表单集所有表单和表单的所有对象。加载带很多控件的多个表单会花几秒钟时间。

23/4/24 24

1. 创建表单集 表单集是一个包含有一个或多个表单的父层次的容器。 可在“表单设计器”中创建表单集。 若要创建表单集,可从“表单”菜单中,选择“创建表单集”选项。 如果不需要将多个表单处理为表单组,则不必创建表单集。 创建表单集以后,就可向其中添加表单。

23/4/24 25

2. 添加和删除表单 创建了表单集以后,可添加新表单或删除表单。 若要向表单集中添加附加的表单,可从“表单”菜单中选择“添加新表单”。 若要从表单集中删除表单,可以:

• 在“表单设计器”的“属性”窗口的对象列表框中,选择要删除的表单。• 从“表单”菜单中选择“移除表单”。

如果表单集中只有一个表单,可删除表单集而只剩下表单。若要删除表单集,可从“表单”菜单中选择“移除表单集”。

23/4/24 26

2. 添加和删除表单(续) 表单以表的格式存储在 .SCX 后缀的文件中。 创建表单时, .SCX 表包含了一个表单的记录、一个数据环境的记录和两个内部使用记录。 VFP 为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集和每个新表单添加一个附加的记录。 每个表单的父容器为表单集,每个控件的父容器为其所在的表单。 注意:当运行表单时,若不想在表单集中所有表单的初始化时就设置为可视的,可以在表单集运行时:

• 将不显示的表单的 Visible 属性设置为“假”( .F. );• 要显示表单, Visible 属性设置为“真”( .T. )。

23/4/24 27

6.2 在表单中添加对象 深入了解容器和控件对象 添加 Visual FoxPro 容器 向表单中添加 Visual FoxPro 控件 在表单中添加数据绑定型控件 在表单中添加用户自定义的对象 确定表单中的控件数目 在表单中添加属性和方法程序 包含预定义常量

23/4/24 28

6.2.1 深入了解容器和控件对象 VFP 中的对象根据它们所基于的类的性质可分为两类:( 1 )容器可以作为其他对象的父对象。

• 例如,一个表单作为一个容器,是放在它上面的复选框的父对象。( 2 )控件可以包含在容器中,但不能作为其他对象的父对象。

• 例如,复选框就不能包含任何其他的对象。 在“表单设计器”中即可以设计容器,也可设计控件。

23/4/24 29

6.2.2 添加 Visual FoxPro 容器 除表单集和表单外, VFP还提供了 4 个基本容器类:命令按钮组、选项按钮组、表格和页框。 在表单中添加容器对象:

• 从“表单控件”菜单栏上选择所需要容器对象的按钮(表格、页框或按钮),并在表单中拖动,调整到所需要的大小。 在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。 在表单中添加页框时,页框默认包含两个页面。

• 将 BottonCount 属性或 PageCount 属性设置为需要的数目,可以包含更多的按钮或页面。

23/4/24 30

6.2.2 添加 Visual FoxPro 容器(续) 向表单中添加表格时, ColumnCount 属性的默认值为 -1 ,表示处于 AutoFill 状态。

• 在运行时表格将显示与 RowSource 表中的字段同样数量的列。• 如果不想处于 AutoFile 状态,可以设置表格的

ColumnCount 属性为指定列的数目。 VFP 中的所有容器对象都有与它们相关联的记数属性和收集属性。

• 收集属性是引用其每个被包含对象的数组;• 记数属性是指示其包含对象数的数值属性。

23/4/24 31

6.2.2 添加 Visual FoxPro 容器(续) 每个容器的收集和记数属性根据包含在容器中的对象类型来命名,表 6-

2 列出了容器及其相应的收集和记数属性。 这些属性以编程方式循环地处理所包含的所有或指定的对象。

容器 收集属性 记数属性应用程序 ObjectsForms CountFormCount

表单集 Forms FormCount

表单 ObjectsControls CountControlCount

页框 Pages PageCount

页 Controls ControlCount

表格 Columns ColumnCount

命令组 Buttons ButtonCount

选项组 Buttons ButtonCount

列 Controls ControlCount

工具栏 Controls ControlCount

容器 Controls ControlCount

控件 Controls ControlCount

23/4/24 32

6.2.2 添加 Visual FoxPro 容器(续) 以下几行代码设置在表格中列的 backcolor 属性,以实现红色与绿色交替出现的功能:

o=THISFORM.grd1FOR i=1 to o.ColumnCount

IF i % 2=0 &&偶数列o.Columns(i).BackColor=RGB(0,255,0) &&绿色ELSEo.Columns(i).BackColor=RGB(255,0,0) &&红色ENDIF

ENDFOR

23/4/24 33

6.2.3 向表单中添加 Visual FoxPro 控件 控件工具栏使用户很方便地在表单中添加任何一种标准的 VFP 控件。 常用的 VFP 控件有:

• 复选框、组合框、命令按钮、编辑框、文本框和列表框;• 图像、标签、线条、形状和微调控件;• 超级链接、 ActiveX 绑定控件、 ActiveX 控件和计时器。

若要在表单中添加控件,可在“表单控件”工具栏中选择所需的控件按钮,在表单中单击或拖动按钮,把它调整到想要的大小。

23/4/24 34

6.2.4 在表单中添加数据绑定型控件 通过给控件的 ControlSource 属性设置了字段或给表格

的 RecordSource 设置表或视图,可使控件与表、视图、表的字段,或视图的字段中的数据相联系。 也可通过直接将表和视图从项目管理器或“数据库设计器”或“数据环境设计器”拖到表单中,以创建数据绑定型控件。 在“表设计器”中,“属性”选项卡的 FieldMapping属性设置或“选项”对话框的 FieldMapping 选项卡的设置,是这种方法创建控件类的基础。

23/4/24 35

6.2.5 在表单中添加用户自定义的对象 VFP最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。 若创建了类,就可以将它们添加到表单中。 若要基于自定义类上添加对象,可在项目管理器中,将类拖动到容器中。当给工具栏添加类时,也可直接在“表单控件”工具栏中添加

23/4/24 36

1. 在控件工具栏上添加类库 类库必须在注册后才能在“表单控件”工具栏中显示出来。 若要注册类库,可以如下操作:

( 1 )从“工具”菜单中选择“选项”,打开“选项”对话框。( 2 )在“选项”对话框中,选择“控件”选项卡。( 3 )选择“添加”按钮。( 4 )如图 6-4 ,在打开的对话框中,选择一个要加到“选定”列表中的类库,并选择“打开”按钮。( 5 )重复步骤( 3 )和( 4 )。

23/4/24 37

1. 在控件工具栏上添加类库(续)

图 6-4 “ 选项”对话框的“控件”选项卡

23/4/24 38

1. 在控件工具栏上添加类库(续) 可以在“表单设计器”中直接注册类库。 若要在表单设计器中注册一个类库,可以如下操作:

( 1 )在“表单控件”工具栏中选择“查看类”按钮。( 2 )如图 6-5 所示,从子菜单中选择“添加”。( 3 )在“打开”对话框中选择要添加到“表单控件”工具栏上的类库,然后选择“打开”按钮。

图 6-5 表单控件

23/4/24 39

2. 从类库中添加对象到表单 从“选项”对话框的“控件”选项卡或从“查看类”子菜单添加类库,能在“表单设计器”中访问它们。 从“表单控件”工具栏添加自定义对象,操作如下:

( 1 )在“表单控件”工具栏中,选择“查看类”按钮。( 2 )如图 6-6 所示,从已注册类库的列表中选择一个类库,它包含了要加到表单中的控件。工具栏与选定库中的控件放在一起。( 3 )单击所需要的控件,并在表单中拖动到合适大小。

图 6-6 查看类按钮

23/4/24 40

6.2.6 确定表单中的控件数目 使用 ControlCount 属性可以确定表单中究竟有多少个控件,而 Controls[n] 属性允许引用表单上的任何一个控件。 下面的程序用于打印出当前活动表上所有控件的 NAME 属性:

ACTIVATE SCREENFOR nCnt=1 TO

Application.ActiveForm.ControlCount? Application.ActiveForm.Controls[nCnt].Name

ENDFOR

23/4/24 41

6.2.7 在表单中添加属性和方法程序 可以向表单中添加任意多个新的属性和方法程序。 属性拥有一个值,而方法程序拥有一个过程代码,当调用方法程序时,即运行这一过程代码。 新建的属性和方法程序属于表单,可以像引用其他属性和方法程序那样引用它们。

23/4/24 42

1. 创建新属性 如果已经有一个表单集,那么在“表单设计器”中加入的属性和方法程序就属于表单集。 若没有建立表单集,则属性和方法程序属于表单。 在表单或表单集中添加新属性,操作如下:

( 1 )从“表单”菜单中选择“新建属性”命令。( 2 )在“新建属性”对话框中,键入属性的名称。还可以加入关于这个属性的说明,它将显示在“属性”窗口的底部,如图 6-7 所示。

23/4/24 43

1. 创建新属性(续)

图 6-7 在“表单”中添加“属性”

23/4/24 44

2. 创建数组属 数组属性和其他属性一样都属于表单或表单集,不同的是可用 VFP 的数组命令和函数处理它。 若要创建一个数组属性,可以如下操作:

( 1 )在表单中添加新属性。( 2 )在“新建属性”对话框的“属性名”框中键入数组属性的名称,包括数组的大小和维数。

例如,要创建一个 10 行的二维数组,应在“新建属性”对话框的“属性名”框中输入 arrayprop[10, 2] 。

23/4/24 45

3. 创建新方法程序 可在表单中添加方法程序,并可用调用表单类方法程序的方式调用它。 若要在表单或表单集中创建一个新方法程序,可如下操作:

( 1 )从“表单”菜单中选择“新方法程序”。( 2 )在“新方法程序”对话框中,键入方法程序的名称,还可以包含有关这个方法程序的说明,这是可选的。

调用用户自定义方法程序和调用基类方法程序一样,使用下面的语法:ObjectName.MethodName

用户建立的方法程序同样可以接受参数并返回值,这种情况下,可以使用赋值语句来调用方法程序:cVariable =

ObjectName.MethodName(cParameter.nParameter)

23/4/24 46

6.2.8 包含预定义常量 为了在方法程序中使用预定义常量,可在表单或表单集中用 #INCLUDE 命令包含一个头文件。 头文件一般包含有 #DEFINE预处理器伪指令定义的编译时的常数。 若要在表单中包含文件,可以如下操作:

( 1 )从“表单”菜单中选择“包含文件”。( 2 )在“包含文件”对话框的“包含文件”文本框中指定文件,或者选择对话框按钮以打开“包含”对话框并选定文件。( 3 )单击“确定”按钮。

23/4/24 47

6.3 处理对象 在设计时设置属性 定义表单行为 指定表单的图标 编辑事件代码和方法程序代码 保存表单 将表单和控件保存为类 运行表单 在运行时刻设置属性 在运行时调用方法程序 对事件作出响应

23/4/24 48

6.3 处理对象 在设计时有几种方法处理对象:

• 在“表单设计器”窗口中通过拖动来设置对象的大小和位置。• 选择“布局”工具栏上的对齐工具,或者选择“格式”菜单中的选项可以对齐控件。• 在“调色板”工具栏中选择前景和背景颜色来设置颜色。• 在“属性”窗口中设置属性。表单或表单集中对象的属性主要是在属性窗口中设置。

23/4/24 49

6.3.1 在设计时设置属性 打开“属性”窗口,如图 6-8 所示,显示选定对象的属性或事件。 如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。 要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。 若要设置属性,可首先在“属性”窗口中,从“属性和事件”列表中选择一个属性。然后在属性设置框中,为选中的属性键入或选择需要的设置。 注意:那些在设计时为只读的属性,例如,对象的

Class 属性,在“属性”窗口的“属性和事件”列表框中以斜体显示。

23/4/24 50

6.3.1 在设计时设置属性(续) 如果属性要求输入字符值,不必用引号将这个值括起来。

• 例如,要将一个表单的标题设为 xs ,只需在“属性设置”框中输入xs;若想让表单的标题是 xs ,即想让引号也出现在窗口的标题上,在“属性设置”框中输入xs 。

图 6-8 “ 属性”窗口

23/4/24 51

6.3.1 在设计时设置属性(续) 通过“属性”窗口,可将属性设置为表达式或函数的结果。若要用表达式设置属性,可以如下操作:

• 在“属性”窗口中,单击“函数”按钮打开“表达式生成器”。• 在“属性设置”框中输入“ =”号,并在后面输入表达式。例如,想设置表单的 caption 属性,使它在运行表单时能够指示当前的活动表,可在“属性设置”框中输入 =ALIAS() 。

在“属性”窗口中设置一个属性表达式,并在运行时刻或设计时刻初始化对象时,才对这个属性表达式进行求值。 如果建立了对象,除非明确地改变它,否则属性设置都不会改变。

23/4/24 52

6.3.2 定义表单行为 在“表单设计器”中设计表单时,表单是“活”的,除非 Visiable 属性设置为“假”( .F. ),对表单的外观和行为的修改将立刻在表单上反映出来。 如果将 WindowState 属性设置为“ 1-最小化”或“ 2-最大化”,“表单设计器”中的表单会立即体现这一设置。

如果将 Movable 属性设置为“假”( .F. ),那么不但用户在运行时刻不能移动表单,即使在设计时刻也不能移动它。 因此应该在设置那些决定表单行为的属性之前,先完成表单的功能设计,并添加所有需要的控件。

23/4/24 53

6.3.2 定义表单行为(续) 表 6-3 列出了在设计时常用的表单属性,定义表单的外观和行为。 使用 LockScreen 属性,使控件布局属性在运行时的调整看起来更清晰。

属性 说明 默认值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 - 无模式

23/4/24 54

6.3.3 指定表单的图标 在 Visual FoxPro for Windows 中,可指定表单的图标; 当该表单在 Windows NT 窗口中最小化或位

于 Windows 2000/XP 的标题栏上时显示为这个图标。 如果要指定表单的图标,将表单的 Icon 属性设置为一个 .ico 文件的文件名。

23/4/24 55

6.3.4 编辑事件代码和方法程序代码 事件:

• 用户的行为,如单击或鼠标的移动;• 系统行为,如系统时钟的进程。

方法程序是和对象相联系的过程,只能通过程序以特定的方式激活。 当触发事件或激活方法程序时,可以指定要执行的代码。 若要编辑事件代码或方法程序代码,可以如下操作:

( 1 )从“显示”菜单中选择“代码”命令。( 2 )在“过程”框中选择事件或方法程序。( 3 )在编辑窗口中键入代码,在触发事件或激活方法程序时将执行这些代码。

23/4/24 56

6.3.4 编辑事件代码和方法程序代码(续) 例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的 Click 事件中可包括这样一行代码:

THISFORM.Release 注意:若要在代码编辑窗口中查看不同过程,可按

PgDn 或 PgUp 键。 用户单击该命令按钮,表单被从屏幕和内存中删除。 如果不想从内存中释放表单,可在 Click 事件中以这样一行代码代替:

THISFORM.Hide 注意:如果表单集、表单或表单集中任何表单上任何对象的 Init 事件代码返回“假”( .F. ),就不能创建这个表单或表单集。

23/4/24 57

6.3.5 保存表单 在运行表单之前需要先将它保存。 如果在未保存之前就试图运行这个表单或关闭“表单设计器”, VFP 将提示是否保存已做过的修改。 若要保存表单,在“表单设计器”中,从“文件”菜单中选择“保存”命令。

23/4/24 58

6.3.6 将表单和控件保存为类 可将表单或表单上的控件子集保存为类定义。 如果打算创建基于表单的子类,或在其他表单中重新使用这些控件,可将表单作为类定义来保存。 若将表单或选定的控件保存为类定义,操作如下:

( 1 )从“文件”菜单中选择“另存为类”。( 2 )在图 6-9 所示的“另存为类”对话框中,选择“当前表单”或“选定控件”。( 3 )在“类名”框中输入类的名称。( 4 )在“文件”框中输入保存类的文件名。( 5 )单击“确定”按钮。

23/4/24 59

6.3.6 将表单和控件保存为类(续) 如果没有给出文件扩展名,保存文件时会加上默认

的 .VCX 扩展名;如果将表单保存为类定义,可以用 MODIFY CLASS 命令对它进行修改。

图 6-9 “ 另存为类”对话框

23/4/24 60

6.3.7 运行表单 可从界面直接运行表单 也可在程序代码中运行表单1. 交互地运行表单 有几种方法可以运行设计好的表单:

• 如果在“表单设计器”中工作,可通过选择“表单”菜单中的“执行表单”测试表单;此时关闭运行表单,可在“表单设计器”中重新打开表单。• 也可以从项目中运行表单,或者以编程方式运行它。

以交互方式运行表单,采用以下方式之一进行:• 在项目管理器中,选择要运行的表单,再选择“运行”按钮。• 在“命令”窗口中,使用 DO FORM 命令运行表单。• 从“程序”菜单中选择“运行”,在“文件类型”框中选择“表单”,选定一个表单,再单击“运行”按钮。

23/4/24 61

2. 从程序中运行表单 在程序中运行表单,要在与事件相关联的代码、方法代码,或在程序或过程中包含 DO FORM 命令。3. 命名表单对象 默认情况下,当使用 DO FORM 命令时,表单对象的名称与 .scx 文件名称一样。

• 例如,下面的一行代码运行 Student.scx 。 Visual FoxPro自动为这个表单创建一个名为 Student 的对象变量:DO FORM Student

若要命名表单对象,可使用 DO FORM 命令的NAME 子句。例如,下面的命令运行一个表单,同时创建两个表单对象变量名:

DO FORM Student NAME frmStu1DO FORM Student NAME frmStu2

23/4/24 62

4. 处理表单对象 在“命令”窗口发出 DO FORM 命令,表单对象就和一公共变量相关联,可通过该变量名访问表单对象。

• 例如,在“命令”窗口发出下面的命令,打开一个名为Student 的表单并改变它的标题:DO FORM StudentStudent.Caption = "Hello"

如果在“命令”窗口发出下面的命令,在活动的输出窗口中将显示 O ,表明 Student 是一个对象:? TYPE("Student")

可在程序中发出 DO FORM 命令访问表单 也可使用应用程序对象的 ActiveForm 、 Forms 和

FormCount 属性访问表单。

23/4/24 63

5. 将表单链接到表单对象变量 DO FORM 命令中的 LINKED 关键字允许将表单和表单对象变量链接起来。 如果包含了 LINKED 关键字,当与表单对象相关联的变量超出范围时,表单将被释放。

• 例如,下面的命令创建一个链接到对象变量frmStu2 的表单:

DO FORM Student NAME frmStu2 LINKED 当释放 frmStu2 时,表单也关闭:

RELEASE frmStu2

23/4/24 64

6. 关闭活动的表单 若想允许用户通过单击“关闭”按钮,或选择由这个表单控制的菜单中的“关闭”命令来关闭活动的表单,需要设置表单的 Closable 属性。 若允许用户关闭活动表单,可在“属性”窗口中,将

Closable 属性设为“真”,或用 RELEASE 命令。• 例如,可以通过在“命令”窗口或程序中发出下面的命令关闭和释放 frmStudent 表单: RELEASE frmStudent

也可以在一个控件。例如,标题为“退出”的命令按钮的 Click 事件代码中包含下面的命令,它允许用户关闭和释放表单: THISFORM.Release

可在与表单对象相关联的代码中使用 RELEASE 命令,在 RELEASE 方法程序中不会执行包含的任何代码。

23/4/24 65

6.3.8 在运行时刻设置属性 VFP 中的对象模式使得在运行时刻能对属性进行充分的控制。1. 在对象层次上引用对象 若想操作一个对象,需确定它和容器层次的关系。 在容器层次的最高级(表单集或表单)需要引用对象变量,除非使用 DO FORM 命令中的 NAME 子句,否则对象变量和 .scx 文件有相同的名称。 通过引用由点号“ .”分隔的对象变量、控件和属性,可以处理属性,例如:

objectvariable.[form.]control.property = Setting

23/4/24 66

1. 在对象层次上引用对象(续) 表 6-4 列出的属性或关键字使在对象层次上引用对象变得更容易。

• 例如,若要改变表单集中 frmCust 表单的一个命令按钮的标题,这个表单集保存在 Stuview.scx 文件中,可在程序中或命令窗口中使用下面的命令:StuView.frmStu.cmdButton1.Caption = "Edit"

可在表单或表单集中使用 THIS 、 THISFORM 和THISFORMSET 引用对象。• 例如,要想在单击命令按钮时改变它的标题,可在命令按钮的 Click 事件代码中包含下面的命令:THIS.Caption = "Edit"

23/4/24 67

2. 在运行时使用表达式设置属性 在运行时也可以使用表达式或函数来设置属性。 要在运行时将属性设置为表达式,可为属性指定一个表达式,或者为属性指定一个用户自定义函数的结果。

• 例如,根据变量的不同值,可将按钮的标题设置为 Edit或 Save 。

• 首先在表单的调用程序中声明这个变量:PUBLIC glEditingglEditing =.F.

• 然后在 Caption 设置中使用一个 IIF 表达式:frsSet1.frmForm1.cmdButton1.Caption = IIF(glEditing =.F.,"Edit","Save")

• 还可以用一个用户自定义函数设置标题:frsSet1.frmForm1.cmdButton1.Caption = setcaption()

23/4/24 68

3. 设置多个属性 用户可以同时设置多个属性,此时可使用 WITH…

ENDWITH 结构。• 例如,要设置表单中表格的列的多个属性,可在表单中任何事件或方法程序代码中包含下面的语句:WITH THISFORM.grdGrid1.grcColumn1

Width = 5.Resizable = .F..ForeColor = RGB(0, 0, 0).BackColor = RGB(255, 255, 255).SelectOnEntry = .T.

ENDWITH

23/4/24 69

6.3.9 在运行时调用方法程序 调用对象的方法程序的语法是:

Parent.Object.Method 如果创建了对象,用户可以在应用程序的任何地方调用这个对象的方法程序。下面的命令调用方法程序来显示表单,并将焦点设置到一个命令按钮:

* 保存在 MYF_SET.SCX 中的表单集myf_set.frmForm1.Showmyf_set.frmForm1.cmdButtonl.SetFocus

若要隐藏表单,可以使用这个命令:myf_set.frmForml.Hide

23/4/24 70

6.3.10 对事件作出响应 当事件发生时,包含在这个事件过程中的代码也被执行。

• 例如,用户单击一个命令按钮,包含在这个命令按钮中的 Click 事件过程中的代码也将运行。

调用与一个事件相关联的过程代码并不使事件发生。• 例如,下面的语句执行 frmPhoneLog 的 Activate 事件中的代码,但它并不激活表单:frmPhoneLog.Activate

而调用表单的 Show 方法程序可显示和激活表单时,Activate 事件中的代码也被执行:frmPhoneLog.Show

23/4/24 71

6.4 管理表单 隐藏表单 释放表单 将参数传递到表单 从表单返回值 管理表单的多个实例 为表单设置设计区 在表单中使用本地和远程数据 设置表单模板

23/4/24 72

6.4.1 隐藏表单 用户可以隐藏一个表单,使它不可见。 在隐藏表单后,用户不能访问表单上的控件,但仍可以用程序完全控制它们。 若要隐藏表单,可以使用 Hide 方法程序。

• 例如,在与命令按钮的 Click 事件相关的代码中,可以包含下面一行代码:THISFORM.Hide

当用户单击命令按钮时,表单仍在内存中,但不可见。

23/4/24 73

6.4.2 释放表单 当用户完成对表单的操作后,可以让用户释放表单。 在释放表单后,就不能再访问表单的属性和方法程序了。 若要释放表单,可以使用 RELEASE 命令。

• 例如,在与命令按钮的 Click 事件相关的代码中,可以包含下面一行代码:THISFORM.Release

当用户单击命令按钮时,表单被关闭。

23/4/24 74

6.4.3 将参数传递到表单 在运行表单时,为设置属性值或指定操作的默认值,有时需要将参数传递到表单。 将参数传递到在“表单设计器”中创建的表单,操作如下:

( 1 )创建容纳参数的表单属性,如 ItemName 和ItemQuantity 。

( 2 )在表单的 Init 事件代码中,包含 PARAMETERS语句:PARAMETERS cString,nNumber

( 3 )在表单的 Init 事件代码中,将参数分配给属性:THIS.ItemName=cStringTHIS.ItemQuantity=nNunber

( 4 )当表单运行时,在 DO FROM 命令中包括 WITH 字句:DO FROM myform WITH "Bagel", 24

23/4/24 75

6.4.4 从表单返回值 在整个应用程序中都可使用表单,让用户指定值。 若要从表单返回值,可以如下操作:

( 1 )将表单的 WindowType 属性设置为 1 ,使表单成为有模式表单。( 2 )在与表单的 UnLoad 事件相关的代码中,包含一个带返回值的 RETURN 命令。( 3 )在运行表单的程序或方法程序中,在 DO FORM 命令中包含 TO 关键字。• 例如,如果 FindXsXh 是一返回字符值的有模式表单,下面的一行代码将返回值返回到一名为 cXsXh 的变量中。

DO FORM FindXsXh TO cXsXh• 注意:如果出现错误,应确保将 WindowType 设置为 1(模式)。

23/4/24 76

6.4.5 管理表单的多个实例 在同一时刻,可以有一个类定义的多个实例活动。

• 例如,只设计一个选课表单,而在应用程序中有几个打开的选课单,每一个都使用相同的表单定义,但可独立地显示和操作。 当管理一表单的多个实例时,必须记住以下要点:

( 1 )在启动表单中创建一个数组属性,数组中的每个元素用来存放一个表单的实例变量,在事先不知道有多少个实例时,跟踪实例变量的最简便的方法就是使用数组。( 2 )对于拥有多个实例的表单,将其 DataSession 属性设置为 2 :私有数据工作期。• 私有数据工作期为表单的每个实例提供一个独立的工作区,因此选定的表和记录指针的位置都是独立的。

23/4/24 77

6.4.6 为表单设置设计区 设置表单的最大设计区,操作如下:

( 1 )从“工具”菜单中选择“选项”命令。( 2 )在“选项”对话框,选择“表单”选项卡,如图 6-10 所示。( 3 )在“最大设计区”框中,选择最大设计区的像素坐标。

图 6-10 “ 表单”选项卡

23/4/24 78

6.4.7 在表单中使用本地和远程数据 可创建这样的表单,很容易地在使用本地数据和远程数据(例如,存储在数据服务器上)之间切换。 就可以使用本地或测试数据来创建应用程序的原型,然后切换到远程或实际的数据上,而不对表单做实质性的修改。

• 例如,如果 VFP 应用程序是一个存储在数据服务器上的大型学生表的前端处理,则可创建一个本地 .dbf 文件,其中包含小型但具有代表意义的数据样本。• 然后在小型数据集合基础上创建、测试和调试表单。当准备发布应用程序时,再将表单链接到大型数据集合上。

23/4/24 79

6.4.7 在表单中使用本地和远程数据(续) 能够在本地和远程数据库之间切换的关键在于使用的是视图而不是直接将表单(及其控件)与表链接。 若要访问远程数据,则必须在任何事件中使用视图。 为了方便本地数据与远程数据的切换,也需为本地数据创建视图。 创建表单时,将这两个视图都添加到它的数据环境中,根据需要进行切换。

23/4/24 80

6.4.7 在表单中使用本地和远程数据(续) 创建在本地和远程数据间切换的表单,操作如下:

( 1 )创建数据的两个视图,一个指向远程数据,另一个指向本地数据。( 2 )新建表单。( 3 )打开表单的“数据环境设计器”,添加这两个视图。( 4 )在“数据环境设计器”中右击,选择“属性”命令。( 5 )在“属性”窗口中,为两个临时表设置同样的 Alias 属性。( 6 )将“数据环境”的 OpenViews 属性设置为“ 1- 本地”或“ 2-远程”,取决于表单运行时使用哪个视图。• 注意:由于两个视图使用同样的别名,不要选择默认的“ 0- 本地和远程”。

( 7 )在表单中,添加需要的控件,将 ControlSourc 属性设置为视图的相应字段。由于两个视图使用同样的别名,表单运行时控件将自动对那个活动的视图作出反应。

23/4/24 81

6.4.7 在表单中使用本地和远程数据(续) 创建表单后,通过改变“数据环境” OpenView 属性切换视图的别名。可在使用“表单设计器”时在“数据环境”中做此工作。 如果要在运行时刻切换视图,还可写出代码并将其附加到某个事件中。

• 例如,可将这些代码放入 Activate 事件中:THISFORM.DataEnvironment.OpenViews=2 && 使用远程视图

如果要创建一个可在本地和远程数据间切换的表单,还必须设计定位代码,用以容纳两个视图,尤其是设计具有一对多关系的表单。• 例如,若表单只访问本地表或视图,可在 Next 命令按钮中使用下列代码,用来移动指针到临时表的下一记录:

SKIP 1THISFORM.Refresh()

23/4/24 82

6.4.7 在表单中使用本地和远程数据(续) 当在远程视图中定位时,此代码无效。因为代码假设临时表包含了表单需要的所有数据。 通常情况下,希望从远程数据源上下载的数据越少越好。 解决的办法是使用带参数的视图。

• 例如,用来编辑学生信息的视图定义如下代码:SELECT * FROM xsb WHERE xsb.x = ?pX

表单运行时,会在对话框中提示用户输入系名或允许用户在文本框中输入一个名称。“显示”按钮的代码可能与以下代码相似:pX = THISFORM.txtX.ValueREQUERY("xsb")THISFORM.Refresh()

23/4/24 83

6.4.8 设置表单模板 可以用模板为所有的新表单创建自己的表单类,也可以利用 VFP 的示例类来设置表单模板。 当创建一个新表单时,它基于在“选项”对话框设置的模板表单。 如果没有指定模板,新表单将基于 VFP 表单基类。

23/4/24 84

1. 使用表单模板的优点 通过表单模板,可为表单设置默认属性,能方便地让应用程序中的所有表单具有相同的外表和风格。

• 例如,可以在表单上包含各系的徽标,可以用有关属性设计模板表单类,以便在所有的表单中使用一致的配色方案。• 如果系的徽标有变化,只需修改模板表单中的图画,创建在这个模板上的所有的表单将自动继承新的徽标。

可在 VFP 表单中加入自定义的属性和方法程序,使这些属性和方法程序对应用程序中的每一个表单都有效。 如果习惯于创建属于表单的变量和用户自定义过程,使用自定义属性和方法程序不但提供了这个功能,还能拥有一个整洁的封装模型。

23/4/24 85

2. 指定默认的表单模板 可以为表单模板从注册的类库中指定一个表单类。 指定默认的表单模板,操作如下:

( 1 )从“工具”菜单中选择“选项”命令。( 2 )在“选项”对话框中,选择“表单”选项卡。( 3 )如图 6-10 所示,在“模板类”区域选择“表单”复选框。• 如果没有选定表单模板,会出现“表单模板”对话框,这样可以选择一个表单类;• 如已选定表单模板,可选择对话按钮来选择其他的类。( 4 )如果想在以后的 VFP 工作期中使用这个模板,选择“设置为默认值”按钮。( 5 )单击“确定”按钮。

23/4/24 86

3. 使用表单模板 可以用与设置表单模板一样的方法指定表单集模板。下面是可能的情况:

( 1 )表单集模板和表单模板都被指定( 2 )只有表单集模板被指定( 3 )只有表单模板被指定( 4 )没有模板被指定

23/4/24 87

6.5 控件使用要点 设置控件的数据源 根据任务选择合适的控件 预先设定选择的控件 接受预先不能确定的输入 接受给定范围的数值输入 允许特定操作 使用计时器控件 显示信息 使用表格控件

23/4/24 88

“ 表单控件”工具栏 控件是实现 GUI 用户界面的一个重要组成部分,也是最直观、最能体现友好用户界面的构件,可以提高人机交互能力。 通过在表单的控件上输入、单击及在控件之间移动,用户可以操作数据,完成自己的任务。 在“表单设计器”中,打开“表单控件”工具栏,如图

6-11 所示。

图 6-11 “ 表单控件”工具栏

23/4/24 89

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

ControlSource 属性。 如果绑定表格和数据,则需要设置表格的

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

23/4/24 90

6.5.1 设置控件的数据源(续) 不同控件的 ControlSource 属性设置的作用如表 6-5 所示。

控件 作用复选框 如果 ControlSource是表中的字段,当记录指针在表中移动时, ControlSource字段中的 NULL

“ ”值、逻辑值 真 ( .T. “ ”)或 假 ( .F.)或数值 0 、 1 或 2将分别代表复选框被选中、清除或灰色状态列 如果 ControlSource是表中的字段,当用户编辑列中的数值时,实际是在直接编辑字段中的值。要将整个表格和数据绑定,可设置表格的 RecordSource属性列表框与组合框

如果 ControlSource 是一个变量,用户在列表中选择的值也保存在变量中;如果 ControlSource是表中的字段,值将保存在记录指针所在的字段中。如果列表框中项和表中字段的值匹配,当记录指针在表中移动时,将选定列表中的这个项

选项按钮如果 ControlSource是一个数值字段,根据按钮是否被选中,在字段中写入 0 或 1。如果ControlSource “ ”是逻辑型的,则根据按钮是否被选中,在字段中写入 真 ( .T. “ ”)或 假 ( .F.)。如果记录指针在表中移动,则更新选项按钮的值,以反映字段中的新值。如果选项按钮的OptionGroup控件(不是选项按钮本身)的 ControlSource是一个字符型字段,当选择该选项按钮时,选项按钮的标题就保存在字段中。一个选项按钮(与 OptionGroup控件明显不同)的控件源不能是一个字符型字段,否则当运行表单时 Visual FoxPro会报告数据类型不匹配

微调 微调控件可以反映相应字段或变量的数值变化,并可以将值写回到相应字段或变量中文本框或编辑框 表字段中的值在文本框中显示,用户对这个值的改变将写回表中。移动记录指针将影响文本框

的 Value 属性

23/4/24 91

6.5.2 根据任务选择合适的控件 VFP 的控件具有良好的灵活性和通用性。 可以用多种控件来完成某个特定的任务,但最好保持控件的使用方法的一致性。

• 例如,标签和命令按钮都具有 Click 事件,但熟悉图形界面的用户更习惯单击命令按钮来执行指令。 表单的绝大部分功能可以归为下列几类:

• 为用户提供一组预先设定的选择。• 接受不能预先设定的用户输入。• 在给定范围内接受用户输入。• 允许用户执行特定的命令。• 在给定的时间间隔内执行特定的命令。• 显示信息。

23/4/24 92

6.5.3 预先设定选择的控件 确保数据库有效性的最直接方法之一,就是为用户提供一组预先设定的选项。 控制用户的选择,可以保证在数据中不存储无效数据。 可以用选项按钮组、列表框和下拉列表,或复选框为用户提供一组预先设定的选择。

23/4/24 93

1. 使用选项按钮组 选项按钮组是包含选项按钮的容器。 通常,选项按钮允许用户指定对话框中几个操作选项中的一个,而不是输入数据。

• 例如,选项按钮可以指定是向文件或打印机输出结果还是进行打印预览。( 1 )设置选项按钮组中的选项按钮数目。 ( 2 )设置选项按钮的属性。( 3 )判断当前选定的按钮。( 4 )使用选项按钮将用户的选择存储到表中。

23/4/24 94

2. 使用列表框和下拉列表框 列表框和下拉列表框(即 Style 属性为 2 的组合框控件-下拉列表)为用户提供了包含一些选项和信息的可滚动列表。 列表框中,任何时候都能看到多个项;而在下拉列表中,只能看到一个项,用户可单击向下按钮来显示可滚动的下拉列表框。 如果表单上有足够的空间,并且想强调可以选择的项,一般使用列表;要想节省空间,并且想强调当前选定的项,一般使用下拉列表框。

23/4/24 95

( 1 )创建具有多列的列表框 然列表框默认为一列,但 VFP 中的列表框可以包含任意列。 多列列表框和表格的区别在于,在多列列表框中一次选择一行,而在表格中可以选择每个单元。 另外,不能直接编辑列表中的数据。 若要在列表框中显示多列,可以:

• 将 ColumnCount 属性设置为所需的列数。• 设置 ColumnWidths 属性。例如,如果列表框中有三列,下面的命令将各列宽度分别设置为 10 、 8 和 16 。THISFORM.listbox.ColumnWidths = "10, 8, 16"• 将 RowSourceType 属性设置为“ 6- 字段”。• 将 RowSource 属性设置成列中显示的字段。例如,下面的命令将三列列表框的三个列数据源设置为 xsb 表中的 xh 、 xm 和 x 字段:form.listbox.RowSource = "xh, xm, x"

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

23/4/24 96

( 2 )允许用户选择列表框中的多项 默认情况下,一次只能选定一个列表项,但也可以允许用户选择列表中的多个列表项。 若要选择列表中的多项,可将列表的

MultiSelect 属性设置为“真”( .T. )。 为了处理选定的项,例如把它们复制到一个数组或在应用程序的其他地方使用它们,可以循环遍历各列表项,处理 Selected 属性为“真”( .T. )的项。

23/4/24 97

( 3 )允许用户在列表框中添加项 除了让用户从列表框中选择项外,还允许用户交互地向列表中添加项。 若要以交互方式向列表添加项,可使用 AddItem 方法程序。

• 在下例中,文本框的 KeyPress 事件中的代码将文本框中的文本添加到一个列表框中,并且当用户按 Enter 键时,清除文本框中的文本。LPARAMETERS nKeyCode, nShiftAltCtrlIF nKeyCode = 13 && Enter 键

THISFORM.lstAdd.AddItem(This.Value)THIS.Value = ""

ENDIF

23/4/24 98

( 4 )允许用户在列表中选择一个值以转到某个记录 有时程序开发人员也许想让用户自己选择所要查看或编辑的记录。

• 例如,可能为用户提供了一个学生姓名列表,当用户从列表中选择一个学生时,需要同时选择表中那个学生的记录,并在表单的文本框中显示该学生的有关信息。 可以有很多方法做到这一点,采用何种方法取决于表单中的数据源,如表 6-6 所示。 RowSourceType 选择相应记录

2 - 别名6 - 字段

当用户在列表中选择一个值时,记录指针将自动指向所需的记录。在列 表的 InteractiveChange事件代码中使用 THISFORM.Refresh方法程序,可让表单中的其他控件显示新值

0 - 无1 - 值3 - SQL语句4 - 查询5 - 数组

在 InteractiveChange 事件中,选择包含所需记录的表,然后搜索想要的值。例如,如果 RowSource中拥有学生表中的学号,可使用下面的代码: SELECT xsb LOCATE FOR THIS.Value = xh THISFORM.Refresh

23/4/24 99

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

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

• 视图:在“视图设计器”中创建视图时,将 SELECT语句的参数设置为列表的 Value 属性,例如:SELECT * FROM xk WHERE xk.xh=?THISFORM.Istxh.Value

23/4/24 100

( 5 )根据列表值刷新一对多显示(续) 按本地视图或远程视图设计一个一对多列表,操作如下:

• 向“数据环境”添加表和带有参数的视图。• 对于“数据环境”中的视图临时表对象,在其“属性”窗口中将 NoDataOnLoad 属性设置为“真”( .T. )。• 将列表的 RowSourceType 属性设置为“ 6- 字段”,并且将列表的 RowSource 属性设置为在视图的参数中引用为外部关键字的字段。 • 将表格的 RecordSource 属性设置为原先创建的视图的名称。• 在列表 InteractiveChange 事件代码中,将列表的值保存在变量中,然后重新查询视图。

23/4/24 101

( 6 )在列表框中显示子记录 在列表框中可以显示一对多关系记录,即记录指针在父表中移动时,显示关系中相应的子记录。 在列表框中显示子记录,操作如下:

• 向表单中添加列表框。• 将列表框的 ColumnCount 属性设置为要显示的列数。例如,如果想在列表框中显示 xh 和 cj两个字段,应将 ColumnCount 属性设置为 2 。• 根据要显示的字段,将 ColumnWidths 属性设置为合适的宽度。• 将列表框的 RowSourceType 属性设置为“ 3-SQL语句”。• 将 RowSource 属性设置为 SELECT语句。例如,下面的语句根据学生中的当前记录从选课表中选择两个字段:

SELECT xh,cj from xk;WHERE xk.xh = xsb.xh;INTO CURSOR temp

• 在表单的 Init 事件以及表中移动记录指针的代码中,重新查询列表:THISFORM.lstChild.Requery

23/4/24 102

( 7 )将图片添加到列表项中 可以将列表框的 Picture 属性设置为 .bmp 文件,该图形文件可以在列表项的前面显示。

• 例如,如果有一个文件列表框,想根据文件类型是表、程序或其他类型,在项前显示不同的位图,如图 6-12 所示,为一带有图片的列表框。

图 6-12 带有图片的列表框

23/4/24 103

3. 使用复选框 使用复选框让用户指定一个布尔状态:“真”、“假”;“开”、“关”;“是”、“否”。 有时不能将问题准确地归为“真”或“假”,此时可使用复选框的 Value 属性,它使得复选框有三种可能的状态: 0 或 .F. 、 1 或 .T. 、 2 或 .NULL. 。 Value 属性反映最近一次指定的数据类型。如果该属性设置为“真”( .T. )或“假”( .F. ),类型为逻辑型,直到属性重新设置为数值型值。 如果复选框的 ControlSource 属性设置为表中的一个逻辑字段,那么当前的记录值为“真”( .T. ) 时,复选框显示为选中;如果当前记录值为“假”( .F. ),复选框显示为未选中;如果当前记录为 null值( .NUL

L. ),复选框则变为灰色。• 注意:当用户按 Ctrl+0 (零)键,在复选框中显示 null值。

23/4/24 104

6.5.4 接受预先不能确定的输入 并不是总能预先确定用户向控件输入的所有可能的值。 文本框、编辑框或组合框允许接收不能预先确定的用户输入。1. 使用文本框 文本框是一类基本控件,它允许用户添加或编辑保存在表中非备注字段中的数据。 通过设置或引用 Value 属性,可以在程序中引用或更改文本框中显示的文本。

23/4/24 105

1. 使用文本框(续) 如果设置了文本框的 ControlSource 属性,则显示在文本框中的值将保存在文本框的

Value 属性中,同时保存在 ControlSource属性指定的变量或字段中。( 1 )检验文本框中的数据是否有效。

• 若要检验文本框中的值,可在与 Valid 事件相关的方法程序中写进相应代码。( 2 )当文本框得到焦点后选择文本。( 3 )在文本框中接收用户密码。

• 将其 PasswordChar 属性设置为“ *” 或其他的一般字符。

23/4/24 106

2. 使用编辑框 在编辑框中允许编辑长字段或备注字段文本,允许自动换行并能用方向键、 PageUp 键和 PageDown 键及滚动条浏览文本。 如果用户想在编辑框中编辑备注字段,只需将编辑框的

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

编辑框和文本框有三个属性可以用于对选定文件进行操作:SelLength 、 SelStart 和 SelText 。利用 SelStart 和SelLength 属性可以从程序中选定文件。• 例如,下面的代码可在编辑框中选择第一个单词:Form1.edtText.SelStart = 0 Form1.edtText.SelLength = AT(" ", Form1.edtText.Text) - 1

利用 SelText 属性可以访问编辑框或文本框中选定文本。• 例如,下列代码可将选定文本全部变为大写:Form1.edtText.SelText = UPPER(Form1.edtText.SelText)

23/4/24 107

3. 使用组合框 组合框兼有列表框和文本框的功能。 有两种形式的组合框,即下拉组合框和下拉列表框,通过更改控件的 Style 属性可选择想要的形式。 单击下拉组合框上的按钮以查看选择项的列表,也可以直接在按钮旁边的框中直接输入一个新项。组合框的 Style 属性默认为“ 0- 下拉组合框”。 要将新的用户值添加到下拉组合框,可在与组合框

的 Valid 事件相关的方法程序中使用下面一行代码:THIS.AddItem(THIS.Text)

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

23/4/24 108

6.5.5 接受给定范围的数值输入 设置 InputMask 属性,以及在 Valid 事件写入有关代码,虽然能确保输入到文本框中的数值在给定范围内,但检查输入值范围更简单的方法是使用微调控件。 使用微调控件可以让用户通过“微调”值来选择,或直接在微调框中键入值。 微调控件的 KeyboardHighValue 和 SpinnerHighValue 属性设置为用户可在微调控件中输入的最大值, KeyboardLowValue 和 SpinnerLowValue 属性设置为用户在微调控件中输入的最小值。 有时,用微调控件输入诸如表示“优先级”的值,单击向上按钮时优先级从 2 提高到 1 。要想单击向上按钮时减少微调值,可将 Increment 属性设置为 -1 。 微调控件值一般为数值型,也可以使用微调控件和文本框来微调多种类型的数值。

23/4/24 109

6.5.6 允许特定操作 有时,想让用户完成一些和操作值无关的特定动作。 例如,让用户关闭一个表单、打开另一个表单、在表中浏览、保存或取消编辑、运行报表或查询、跳至 Internet 或 Intranet 上的目标地址以及任何其他的操作,可以采用以下方式之一。

23/4/24 110

1. 使用命令按钮或命令按钮组 特定操作代码通常放置在命令按钮的 Click 事件中。 将命令按钮的 Default 属性设置为“真”( .

T. ),可使该命令按钮成为默认选择。 默认选择的按钮比其他命令按钮多一个粗的边框。 如果一个命令按钮是默认选择,那么按回车键后,将执行这个命令按钮的 Click 事件。

23/4/24 111

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

DO CASECASE THIS.Value = 1 && 执行某些动作

WAIT WINDOW "You clicked " + THIS.cmdCommand1.Caption NOWAITCASE THIS.Value = 2 && 执行其他动作

WAIT WINDOW "You clicked " + THIS.cmdCommand2.Caption NOWAITCASE THIS.Value = 3 && 执行第三种动作

WAIT WINDOW "You clicked " + THIS.cmdCommand3.Caption NOWAIT

ENDCASE

23/4/24 112

3. 使用“超级链接”对象 可以使用“超级链接”对象跳转到 Internet 或

Intranet 的一个目标地址上。 使用“超级链接”对象启动一个超级链接知道的应用程序(一般是 Internet 浏览器,例如, Microsoft

Internet Explorer ),然后打开地址中指定的页面。此超级链接的 NavigateTo() 方法程序允许指定跳转目标的地址。• 例如,要从表单定位到万维网上的某个 Microsoft站点,首先应将“超级链接”控件添加到表单上,然后添加一个命令按钮,再为此命令按钮的 Click 事件添加以下代码:THISFORM.Hyperlink1.NavigateTo('www.microsoft.com')• 当表单运行时,单击命令按钮即可跳转到 Microsoft Web站点上。

23/4/24 113

6.5.7 使用计时器控件 计时器控件允许在指定的时间间隔执行操作和检查数值。 它与用户的操作独立,并对时间作出反应。 可以让计时器以一定的间隔重复地执行某种操作。 计时器通常用来检查系统时钟,确定是否到了应该执行某一任务的时间。对于其他一些后台处理,计时器也很有用。 将计时器控件放置在表单中同于放置在其他控件中,只需在“表单控件”工具栏中选择计时器工具并把它拖到表单中即可。 设计时,计时器在表单中是可见的,这样便于选择属性、查看属性和为它编写事件过程;而运行时,计时器不可见,因此它的位置和大小都无关紧要。

23/4/24 114

6.5.8 显示信息 完美设计的原则之一就是使有关信息可视化。 可以用图像、标签、文本框、编辑框或形状来显示用户需要的信息。1. 使用图像 图像控件允许在表单中添加图片( .bmp 文件)。图像控件和其他控件一样,具有一整完套的属性、事件和方法程序,因此,在运行时刻可以动态地更改它。用户可以用单击、双击和其他方式来交互地使用图像。

23/4/24 115

6.5.8 显示信息(续)2. 使用标签 标签和文本框的不同之处在于:标签没有数据源,不能直接编辑,也不能用 Tab 键选择。在程序中可以改变标签的 Caption 和 Visible 属性,便于标签显示不同的内容。3. 使用文本框和编辑框显示信息 设置文本框和编辑框的 ReadOnly 属性为“真”( .T. ),可以显示那些只能查看而不能修改的信息。如果编辑框无效,用户就不能滚动文本。4. 使用形状和线条 形状和线条有助于以可视方式将表单中的组件归成组。将相关项联系起来,有助于用户学习和了解界面,更易于用户使用应用程序。

23/4/24 116

6.5.8 显示信息(续)5. 使用表单图形显示信息 表 6-7 列出的表单方法程序可在表单中使显示信息图形化。

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

表 6-7 使显示信息图形化的表单方法程序

23/4/24 117

6.5.8 显示信息(续)6. 增强控件显示 除标题外,命令按钮、复选框和选项按钮也能显示图片。这些控件都具有在控件上显示图片的属性

DisabledPicture 、 DownPicture 和 Picture 。 如果没有指定 DisabledPicture 属性,按钮无效时, Visual FoxPro 将显示变灰的 Picture 指定的图片;如果不指定 DownPicture 属性,按钮按下时,

Visual FoxPro 用不同的背景色显示图片,让按钮看上去有按下的效果。 如果只显示图片而不显示标题,可在“属性”窗口的“属性编辑”框中删除默认标题,将 Caption 属性设置为空字符串。

23/4/24 118

6. 增强控件显示(续) 通常, .bmp 图片会带有白色空白,但又不希望这些空白出现在控件中,不规则形状图像周围的白边会使控件很难看。 为解决这个问题, VFP 为图片创建了一个临时的默认掩码,赋予白色区域透明属性,这样按钮下面的颜色或背景色就能显示出来。 若想保留 .bmp 图片中的白色区域,可为 .bmp 图片创建一个自定义的掩码,创建掩码的步骤如下:

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

( 2 )将所有想在 .bmp 中显示的区域涂黑,而让想透明显示的区域仍保留白色。( 3 )在同样的目录下保存这个文件,文件名与 .bmp 文件相同,但扩展名改为 .msk 。

23/4/24 119

6. 增强控件显示(续) 当 VFP 加载一个由命令按钮、选项按钮或复选框的 Picture 属性指定的 .bmp 文件时,它在相同的目录下寻找相匹配的 .msk 文件。 如果这个目录中存在与这个 .bmp 文件同名

的 .msk 文件, VFP把它作为这个 .bmp 文件的掩码, .msk 图片中所有白色区域在 .bmp 图片中都为透明,而 .msk 图片中的黑色区域则照 .bmp 图片中的内容显示。• 注意: .bmp 图片和 .msk 图片必须具有相同的尺寸,以便掩码能表示 .bmp 图片的区域。

23/4/24 120

6.5.9 使用表格控件 VFP 用一个强有力的工具——表格对象,显示和操作多行数据。 表格是一个容器对象,和表单集包含表单一样,表格也能包含列。 这些列除了包含标头和控件外,每一个列还拥有自己的一组属性、事件和方法程序,从而为表格单元提供了大量的控件。 表格对象能在表单或页面中显示,并操作行和列中的数据。

23/4/24 121

1. 将表格控件添加到表单 在“表单控件”工具栏中选择“表格”按钮,并在“表单”窗口中调整为期望的大小,可将表格添加到表单。 如果没有指定表格的 RecordSource 属性,同时在当前工作区中有一个打开的表,那么运行时,表格将显示这个表的所有字段。

23/4/24 122

2. 设置表格列数 首先需要设置的表格控件属性是列数,这可通过在“属性”窗口中选择 ColumnCount 属性来进行。 如果 ColumnCount 属性设置为 -1 (默认值),在运行时刻,表格将包含与其链接的表中字段同样数量的列。

23/4/24 123

3. 在设计时刻人工调整表格的显示效果 在表格中加入列后将改变列的宽度和行的高度。 可以在“属性”窗口中人工设置列和行对象的高度和宽度属性,也可以在设计表格时以可视方式设置这些属性。 若要切换到表格设计方式,可从表格的快捷菜单中选择“编辑”命令,或在“属性”窗口的“对象”框中,选择表格的一列。 在表格设计方式下,表格周围将显示一个粗框。若要退出表格设计方式,只需选择表单或其他控件。 若要调整表格中列的宽度,可首先在表格设计方式下,将鼠标指针置于表格列的标头之间,这时指针变为带有左右两个方向箭头的竖条,然后将列拖动到需要的宽度;或者在“属性”窗口中设置列的 Width 属性。 若要调整表格中行的高度,可先在表格设计方式下,将鼠标指针置于“表格”控件左侧的第一个按钮和第二个按钮之间,这时指针将变成带有向上和向下箭头的横条,然后将行拖动到需要的宽度;或者在“属性”窗口中设置列的 Height 属性。

23/4/24 124

4. 设置表格中显示的数据源 可为整个表格设置数据源,也可为每个列单独设置数据源。 若要为整个表格设置数据源,可以如下操作:

( 1 )先选择表格,然后单击“属性”窗口的RecordSourceType 属性。

( 2 )如果让 VFP 打开表,可将 RecordSourceType 属性设置为“ 0- 表”;如果在表格中放入打开表的字段,则将 RecordSourceType 属性设置为“ 1-别名”。

( 3 )单击“属性”窗口中的 RecordSource 属性。( 4 )输入作为表格数据源的别名或表名。

若想在特定的列中显示一个特定字段,也可以为列设置数据源,选择列,然后单击“属性”窗口的ControlSource 属性,输入作为列的数据源的别名、表名或字段名。例如,可以输入: xk.xh 。

23/4/24 125

5. 向表格添加记录 将表格的 AllowAddNew 属性设置为“真”( .T. ),可以允许用户向表格中显示的表中添加新的记录。 如果将 AllowAddNew 属性设置为真,当用户选中了最后一个记录,并且按下“↓”键时,就向表中添加了新记录。 如果想进一步控制用户什么时候向表中添加新记录,可以将 AllowAddNew 属性设置为默认的“假”( .F. ),并使用 APPEND

BLANK 或 INSERT 命令添加新记录。

23/4/24 126

6. 使用表格控件创建一对多表单 表格最常见的用途之一是:当文本框显示父记录数据时,表格显示表的子记录;当用户在父表中浏览记录时,表格将显示相应的子记录。 如果表单的数据环境包含两表之间的一对多关系,那么要在表单中显示这个一对多关系非常容易。 若要设置具有数据环境的一对多表单,可以将需要的字段从“数据环境”中的父表拖动到表单中,并将相关的表拖动到表单中。

23/4/24 127

6. 使用表格控件创建一对多表单(续) 在大多数情况下,都要为表单或表单集创建一个数据环境,但是即使不用“数据环境”,创建一对多表单也并不复杂。 创建没有数据环境的一对多表单,操作如下:

( 1 )将文本框添加到表单中,显示主表中需要的字段。( 2 )设置文本框的 ControlSource 属性为主表。( 3 )在表单中添加一个表格。( 4 )将表格的 RecordSource 属性设置为相关表的名称。( 5 )设置表格的 LinkMaster 属性为主表名称。( 6 )设置表格的 ChildOrder 属性为相关表中索引标识的名称,索引标识和主表中的关系表达式相对应。( 7 )将表格的 RelationalExpr 属性设置为连接相关表和主表的表达式。

23/4/24 128

7. 在表格列中显示控件 除了在表格中显示字段数据,还可以在表格的列中嵌入控件,这样就为用户提供嵌入的文本框、复选框、下拉列表框、微调按钮和其他控件。

• 例如,如果表中有一个逻辑字段,当运行该表单时,通过辨认复选框可以判定哪个记录值是“真”( .T. )和哪个记录值是“假”( .F. )。修改这些值只需设置或清除复选框即可。

23/4/24 129

7. 在表格列中显示控件(续) 可以在“表单设计器”中交互地向表格列中添加控件,也可以通过编写代码在运行时刻添加控件。 交互地在表格列中添加控件,操作如下:

( 1 )在表单中添加一个表格。( 2 )在“属性”窗口中,将表格的 ColumnCount 属性设置为需要的列数。例如,如果需要一个两列的表格则输入 2 。( 3 )在“属性”窗口的“对象”框中为控件选择父列。( 4 )在“表单控件”工具栏中选择所要的控件,然后单击父列。在“表单设计器”中,新控件不在表格列中显示,但运行时刻会显示出来。( 5 )在“属性”窗口中,要确保该控件缩进显示在“对象”框中父列的下面。如果新控件是一个复选框,应将复选框的 Caption 属性设置为“”,并将列的 Sparse 属性设置为“假”( .F. )。

1 )将父列的 ControlSource 属性设置为需要的表字段。2 )将父列的 CurrentControl 属性设置为新加入的控件。

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

23/4/24 130

8. 在“表单设计器”中移去表格列中的控件 若要在“表单设计器”中移去表格列中的控件,可以在“属性”窗口的对象框中选择要移去的控件,然后激活“表单设计器”,如果“属性”窗口可见,控件的名称将显示在“对象”框中,则按下 DELETE 键即可。

23/4/24 131

9. 通过代码将控件添加到表格列 若要通过代码将控件添加到表格列,可在表格的 Init 事件中,使用 AddObject 方法程序将控件添加到表格列,然后设置列的

CurrentControl 属性。

23/4/24 132

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

23/4/24 133

6.6 控件使用技巧 使控件更容易使用的方法 允许用户拖放 扩展表单

23/4/24 134

6.6.1 使控件更容易使用的方法1. 设置访问键 访问键能在表单中的任何地方通过按 Alt 键和访问键来选择一个控件。 若要为控件指定访问键,可到控件的 Caption属性中,在想作为访问键的字母前输入一个反斜杠和一个小于符号( \< )。

• 例如, \<Open 是对命令按钮的 Caption 属性的设置,将 O 键作为它的访问键,用户能在表单中任何地方按 Alt+O 键选择这个命令按钮。

23/4/24 135

1. 设置访问键(续) 若要为文本框或编辑框指定访问键,可以如下操作:

( 1 )创建一个标签,在作为访问键的字母前键入 \< ,例如, \<Customer 。

( 2 )如果要在文本框或编辑框中接受热键,应保证该标签为位于文本框或编辑框之前的 Tab键次序中的控件。

23/4/24 136

2. 设置控件的 Tab 键次序 设置控件的 Tab 键次序可以使用户按照逻辑顺序在控件之间移动。表单控件的默认 Tab 键次序是控件添加到表单时的次序。若要改变控件的 Tab 键次序,可以如下操作:

( 1 )在“表单设计器”工具栏中选择“设置 Tab 键次序”。( 2 )双击控件旁边的框,这个控件将在表单打开时具有最初焦点。( 3 )按需要的 Tab 键次序依次单击框。( 4 )单击控件外的任何地方,完成设置。

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

23/4/24 137

2. 设置控件的 Tab 键次序(续) 可以在一个控件组中设置选项按钮和命令按钮的选择顺序。要使用键盘移动到一个控件组,用户需要

按 Tab 键移动到控件组的第一个按钮,然后使用箭头键选择该组中的其他按钮。 若要更改一个控件组中按钮的选择顺序,可以如下操作:

( 1 )在“属性”窗口中,在“对象”列表里选择控件组。粗边框表明该组处于编辑状态。( 2 )选择“表单设计器”窗口。( 3 )从“显示”菜单中选择“ Tab 键次序”命令。( 4 )选择合适的 Tab 键次序。

23/4/24 138

3. 设置工具提示文本 每个控件都有一个 ToolTipText 属性,当用户的鼠标指针在控件上停留时,将显示这个属性指定的文本,这对带有图标而没有文本的按钮特别有用。 若要指定工具提示文本,可在“属性”窗口中选择 ToolTipText 属性,并键入需要的文本。 表单的 ShowTips 属性决定是否显示工具提示文本。

23/4/24 139

4. 启用和废止组中的控件 将每个按钮的 Enabled 属性设置为“真”( .T. )或“假”

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

将选项按钮组或命令按钮组的 Enabled 属性设置为“假”( .F. )时,组中所有按钮都将废止,但不会显示出禁用的前景色和背景色。 设置组的 Enabled 属性不会影响组中单个按钮的 Enabled 属性,这就允许废止其中有些按钮已经失效的按钮组。 当重新启用该按钮组时,原来失效的按钮仍然失效。 如果让组中的所有按钮失效,显示出失效的外观,并且不保留组中按钮哪些有效、哪些失效的信息,可使用组的 SetAll方法程序,如下所示:

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

23/4/24 140

6.6.2 允许用户拖放 在设计 VFP 应用程序时,可以将对象从“项目管理器”、“数据库设计器”和“数据环境”中拖动到表单或报表上合适的位置。 可在运行时刻扩展 VFP 的这一拖放功能。拖放功能可以扩展为多表单操作:将文本、文件和控件拖动到屏幕的任何位置,包括其他的表单上。 VFP支持两种类型的拖放: OLE 拖放和控件拖放。

• OLE 拖放:允许在两个支持 OLE 拖放功能的应用程序(例如, VFP 、 Visual Basic 、 Windows资源管理器、Microsoft Word 和 Excel 等)之间移动数据。

• 控件拖放:允许在 VFP 应用程序内拖放 VFP 控件。当用户拖动控件时, VFP 提供了和对象相同尺寸的灰色外框,并和鼠标指针一起移动。可以为控件的 DragIcon 属性指定一个光标文件( .cur )来覆盖默认方式。

23/4/24 141

1. 启用自动拖动方式 如果允许用户无论何时单击控件时都能拖动控件,可将 DragMode 属性设置为 1 ,这能启用控件的自动拖动方式。 当拖动设置为“自动”时,拖动功能总是打开的。 注意:在自动拖动方式下,被拖动的控件不识别其他的鼠标事件。

23/4/24 142

2. 在用户释放对象时的响应 拖动控件之后释放鼠标按钮时, VFP 会产生一个

DragDrop 事件,对这一事件有多种响应方法。 可将控件重新定位在新的位置(由灰色外框的最后位置来指明)。 控件不会自动移到新的位置。 两个重要术语:即“源”和“目标”。

• 源:指被拖动的控件• 目标:指用户将控件拖到其上的对象,这个对象是一个能识别 DragDrop 事件的表单或控件。

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

23/4/24 143

2. 在用户释放对象时的响应(续) DragDrop 事件接受三个参数: oSource 、 nXCoord 和

nYCoord 。• 例如,下面列出的是与 DragDrop 事件相关的代码中的语句,检查用户是否已将一个控件停放到自己上面。

LPARAMETERS oSource, nXCoord, nYCoordIF oSource.Name != THIS.Name

* 执行某些动作ELSE

* 控件在自己上面停放* 执行其他动作

ENDIF oSource 的所有可能控件类型都有 Visible 属性。当把控件拖放到表单中某一部分或另一个控件上时,可以让控件隐藏。

• 下面几行是一个图像控件的 DragDrop 事件的相关代码,它使一个拖动控件在拖放到图像上时变为不可见。LPARAMETERS oSource, nXCoord, nYCoordoSource.Visible = .F.

23/4/24 144

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

• 在下列代码中,一个控件的 DragOver 事件向用户指示这个控件不是一个有效的释放目标。这个例子中的 cOldIcon是用户自定义的表单属性。LPARAMETERS oSource, nXCoord, nYCoord, nStateDO CASECASE nState = 0 && 进入 THISFORM.cOldIcon = oSource.DragIcon oSource.DragIcon = "NODROP01.cur"CASE nState = 1 && 离开 oSource.DragIcon = THISFORM.cOldIconENDCASE

23/4/24 145

4. 控件拖动的开始和停止时间 DragMode 属性有两个设置: Manual 和 Automatic 。

• Manual 设置允许用户对控件进行更灵活的控制,它允许用户指定什么时候拖动控件,什么时候不拖动• 当 DragMode 设置为 Automatic 时,总能拖动控件

要从代码中启用拖动,应将 DragMode 设为默认设置( 0-人工),然后在开始或停止拖动对象时调用Drag 方法程序,例如:container.control.Drag(nAction)• 若 nAction 为 1 , Drag 方法程序初始化控件的拖动操作;• 若 nAction 为 2 ,释放控件,并产生一个 DragDrop 事件;

当 nAction 为 0 时,取消拖动,其效果除不能产生DragDrop 事件外与 nAction值为 2 时类似。

23/4/24 146

5. 在拖放操作中引起控件移动 有时用户在释放鼠标按钮后,需要改变源控件的位置。要让控件移动到新的鼠标位置,可使用 Move方法程序。

• 例如,下面列出的表单的 DragDrop 事件代码就将被拖动的控件移动到释放位置:LPARAMETERS oSource, nXCoord, nYCoordoSource.Move(nXCoord, nYCoord)

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

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

– oSource.Height / 2))

23/4/24 147

5. 在拖放操作中引起控件移动(续) 只有将 DragIcon 属性设置为非默认值(灰色矩形框)时,上述代码才能获得最好的效果。 如果使用的是灰色矩形框,用户通常根据灰色矩形框的最后位置来精确确定控件的位置。 要做到这点,应记录下鼠标在源控件中的最初位置,然后用这个位置作为计算控件移动偏移量的基准。 若要记录最初的鼠标位置,可首先指定控件为人工拖动方式,声明两个表单级的变量 nDragX 和

nDragY;当 MouseDown 事件发生时启用拖动,同时在这个事件中将 nXCoord 和 nYCoord值保存在表单级变量中;最后,当 MouseUp 事件发生时,关闭拖动功能。

23/4/24 148

6.6.3 扩展表单 页框能扩展表单的表面面积, ActiveX 控件则能扩展表单的功能。 页框是包含页面的容器对象,页面又可包含控件。 可以在页框、页面或控件级上设置属性。 如图 6-13 所示,可以把页框想象为有多层页面的三维容器,只有最上层页面(或在页框的顶部)中的控件才是可见和活动的。表单上一个页框可有多个页面。 页框

位于页面上但在页框中不可见

Page1Page2Page3Page4

图 6-13 页框示意图

23/4/24 149

1. 将页框添加到表单中 表单中可以包含一个或多个页框。 若要将页框添加到表单,可以如下操作:

( 1 )在“表单控件”工具栏中,选择“页框”按钮并在“表单”窗口拖动到想要的尺寸。( 2 )设置 PageCount 属性,指定页框中包含的页面数。( 3 )从页框的快捷菜单中选择“编辑”命令,将页框激活为容器。页框的边框变宽,表示它处于活动状态。( 4 )用向表单中添加控件的方法,向页框中添加控件。

23/4/24 150

2. 在页框中选择一个不同的页面 若要在页框中选择一个不同的页面,可将页框作为容器激活,并选择要使用的页面选项卡;或者在“属性”窗口的“对象”框中选择这一页面;也可以在“表单设计器”底部的“页”框中选择这一页面。 VFP 包括很多选项卡式对话框,例如,“项目管理器”和“选项”对话框。 若要创建选项卡式对话框,可以如下操作:

( 1 )打开适当的表单。( 2 )在表单控件工具栏中,单击“页框”按钮并在表单中把它拖到一定大小。 Visual FoxPro 创建具有两个页框,每页上有一个选项卡。( 3 )如果想使选项卡多于两页,可以使用属性窗口将页框的 PageCount 属性设置为适当的数目。图 6-14 表示的是有 5 个页面的页框。

23/4/24 151

2. 在页框中选择一个不同的页面(续)( 4 )如果要为每一页加上标题,可以设置对应的

Caption 属性。图6-14 中第一页的标题为“基本情况”。

( 5 )保存表单。 要想更容易地区分不同页,可以通过设置每一页的 BackColor属性来为每一页指定不同的颜色。 图 6-14 有 5 个页面的页框

23/4/24 152

3. 将控件添加到页面上 如果将控件添加到页面上,它们只有在页面活动时才可见和活动。 若要将控件添加到页面上,可以首先在“属性”窗口的“对象”框中选择页面,页框的周围出现边框,表明可以操作其中包含的对象;然后在“表单控件”工具栏中,选择想要的控件按钮,并在页面中调整到想要的大小。

23/4/24 153

4. 管理“页面”选项卡上的长标题 如果选项卡上的标题太长,不能在给定页框宽度和页面数的选项卡上显示出来,可以采用以下方式之一:

• 将 TabStretch 属性设置为“ 1- 单行”,这样只显示能放入选项卡中的标题字符,“单行”是默认设置。• 将 TabStretch 属性设置为“ 0- 多重行”,这样选项卡将层叠起来,以便所有选项卡中的整个标题都能显示出来。

23/4/24 154

5. 在程序中换页面 不管页框是否具有选项卡,都可以从程序中使用 ActivePage 属性来激活一个页面。

• 例如,下面列出表单中一个命令按钮的 Click 事件过程代码,它将表单中页框的活动页面改为第三页面:THISFORM.pgfOptions.ActivePage = 3

23/4/24 155

6 . ActiveX 控件 单击“ ActiveX 控件”按钮,并在“表单”窗口中将其拖至期望的大小,可以将 OLE 对象添加到表单,这个工具可以处理诸如

Microsoft Excel 或 Microsoft Word服务程序对象。 另外,如果 Windows SYSTEM 目录上包含

ActiveX 控件(带有 .ocx 扩展名的文件),它也可以表示一个 ActiveX 控件。

23/4/24 156

7 . ActiveX绑定控件 单击“ ActiveX绑定控件”按钮,并在“表单”窗口中拖至期望的大小,可以在表单中创建一个绑定

型 OLE 控件对象。 在创建这个对象后,可以将它和表中的通用字段链接,然后可以用这个对象显示字段中的内容。

• 例如,如果将 Word 文件保存在通用字段中,就可以在表单中使用一个绑定型 OLE 对象来显示这些文件的内容。 若要创建一个绑定型 OLE 对象,可以如下操作:

( 1 )创建或打开一个表单。( 2 )在“表单控件”工具栏中选择“ ActiveX绑定控件”按钮,并在表单中将它拖至期望的大小。( 3 )设置对象的 ControlSource 属性,将这个 OLE 对象和通用字段链接。

23/4/24 157

6.7 小结 本章详细介绍了表单的创建方法和管理,介绍了常用控件的使用要点和技巧。 表单是应用程序的主要界面,在应用程序的运行过程中,表单为用户和数据库管理系统提供了一个交换信息的接口,通过这个界面,可以实现对数据库的可视化的交互式操作。 创建表单的方法有两种:

• 使用表单向导:有利于表单的快速开发,可生成表单的大致样子• 使用表单设计器:有利于更加精细地设计表单,进行进一步的改进

生成表单的主要步骤,是在表单中添加和设计控件,这些控件完成了表单的主要功能。 通过本章的学习,主要掌握表单的创建方法,能熟练地管理表单,并能运用常用控件设计出友好的用户界面。