第
This presentation is the property of its rightful owner.
Sponsored Links
1 / 157

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


  • 84 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


6

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

  • 设计表单

  • 在表单中添加对象

  • 处理对象

  • 管理表单

  • 控件使用要点

  • 控件使用技巧

  • 小结


6

6.1 设计表单

  • 设置数据环境

  • 创建单文档和多文档界面

  • 用表单集扩充表单


6

表单设计器

  • VFP提供了一个功能强大的“表单设计器”,使得设计表单的工作变得又快又容易。

  • 在“表单设计器”中可以处理下列内容:

    • 表单中不同类型的对象。

    • 与表单相关联的数据。

    • 顶层表单或子表单。

    • 能一起操作的多个表单。

    • 基于自定义模板的表单。


6

表单和表单集

  • 表单和表单集是拥有自己的属性、事件和方法程序的对象,在“表单设计器”中可以设置这些属性、事件和方法程序。

  • 表单集包括了一个或多个表单,可以将它们作为一个整体来操作。例如,如果在表单集中有4个表单,可以在运行时用一个命令显示或隐藏它们。

  • 可使用如下3种方法之一新建一个表单:

    • 在项目管理器中先选定“表单”,然后单击“新建”按钮。

    • 选择“文件”菜单中的“新建”命令,选定“表单”,并单击“新建文件”按钮。

    • 使用CREATE FORM命令。


6

表单设计器(续)

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

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


6 1 1

6.1.1 设置数据环境

  • 每一表单或表单集都包括一个数据环境。

  • 数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的表之间的关系。

  • 可以在“数据环境设计器”中直观地设置数据环境,并与表单一起保存。

  • 在表单运行时,数据环境可自动打开、关闭表和视图。并且,通过设置“属性”窗口中的ControlSource属性设置框,“数据环境”将帮助设置控件的ControlSource属性,在这个属性框中列出了数据环境中的所有字段。


6 1 11

6.1.1 设置数据环境

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

    (1)从“显示”菜单或快捷菜单中选择“数据环境”命令,出现如图6-2所示的窗口。

    (2)从快捷菜单中选择“添加”命令。

    (3)在“添加表或视图”对话框中选择一表或视图添加到数据环境中去。

图6-2 数据环境设计器


6

1. 常用数据环境属性

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

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


6

2. 向“数据环境设计器”中添加表或视图

  • 向“数据环境设计器”添加表或视图时,可以看到属于表或视图的字段和索引。

  • 若要向数据环境中添加表或视图时,可按如下步骤进行:

    (1)在“数据环境设计器”中,从“数据环境”菜单中选择“添加”命令。

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

  • 也可以将表或视图从打开的项目或“数据库设计器”拖放到“数据环境设计器”中。

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


6

3. 从“数据环境设计器”中移去表

  • 当从“数据环境设计器”中移去表时,与这个表有关的所有关系也随之移去。

  • 若要将表或视图从“数据环境设计器”中移去,可以:

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

    • 从“数据环境”菜单中选择“移去”命令。


6

4. 在“数据环境设计器”中设置关系

  • 如果添加进“数据环境设计器”的表具有在数据库中设置的永久关系,这些关系将自动地添加到数据环境中。

  • 如果表中没有永久的关系,可以在“数据环境设计器”中设置。

  • 要在“数据环境设计器”中设置关系,可将字段从主表拖动到相关表中的字段上。

  • 如果和主表中的字段相关的表中没有索引标识,系统将提示用户是否创建索引标识。


6

5. 在“数据环境设计器”中编辑关系

  • 在“数据环境设计器”中设置了一个关系后,在表之间将有一条连线指出这个关系。

  • 若要编辑关系的属性,可在属性窗口中从名称列表框选择要编辑的关系。

  • 关系的属性对应于SET RELATION和SET SKIP命令中的子句和关键字。

  • RelationalExpr属性的默认设置为主表中关键字字段的名称。

  • 如果相关表是以表达式作为索引的,就必须将RelationalExpr属性设置为这个表达式。

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


6

5. 在“数据环境设计器”中编辑关系(续)

  • 如果关系不是一对多关系,必须将OneToMany属性设置为“假”,这对应于使用SET RELATION命令时不发出SET SKIP命令。

  • 将关系的OneToMany属性设置为“真”,相当于发出SET SKIP命令。

  • 当浏览父表时,在记录指针浏览完子表中所有的相关记录之前,记录指针一直停留在同一父记录上。

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


6 1 2

6.1.2 创建单文档和多文档界面

  • VFP允许创建两种类型的应用程序:

    • 多文档界面(MDI):各个应用程序由单一的主窗口组成,且应用程序的窗口包含在主窗口中或浮动在主窗口顶端。

    • 单文档界面(SDI):应用程序由一个或多个独立窗口组成,这些窗口均在Windows桌面上单独显示。

  • 由单个窗口组成的应用程序通常是一个SDI应用程序,但也有一些应用程序综合了SDI和MDI的特性。

    • 例如,Visual FoxPro 将调试器显示为一SDI应用程序,而它本身又包含了自己的MDI窗口。


6 1 21

6.1.2 创建单文档和多文档界面(续)

  • 为了支持这两种类型的界面,VFP允许创建以下几种类型的表单,如图6-3所示。

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


6 1 22

6.1.2 创建单文档和多文档界面(续)

  • 子表单:包含在另一个窗口中,用于创建MDI应用程序的表单。

    • 子表单不可移至父表单(主表单)边界之外,当其最小化时将显示在父表单的底部。若父表单最小化,则子表单也一同最小化。

  • 浮动表单:属于父表单(主表单)的一部分,但并不包含在父表单中,可以被移至屏幕的任何位置,但不能在父窗口后台移动。浮动表单也可用于创建MDI应用程序。

    • 若将浮动表单最小化时,它将显示在桌面的底部。

    • 如父表单最小化,则浮动表单也一同最小化。

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


6

1. 指定表单类型

  • 创建各种类型的表单的方法大体相同,但需设置特定属性以指出表单应该如何工作。

  • 如果创建的是子表单,则不仅需要指定它应在另外一个表单中显示,而且需要指定是否是MDI类的子表单,即指出表单的最大化是如何工作的。

  • 如果子表单是MDI类的,它会包含在父表单中,并共享父表单的标题栏、标题、菜单及工具栏。

  • 非MDI类的子表单,最大化时将占据父表单的全部用户区域,但仍保留它本身的标题和标题栏。


6

1. 指定表单类型(续)

  • 若要建立一个子表单,可以:

    (1)用“表单设计器”创建或编辑表单。

    (2)可将表单ShowWindows属性设置为下列值之一:

    1)0:In Screen。子表单的父表单将为VFP主窗口。

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

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


6

1. 指定表单类型(续)

  • 浮动表单是由子表单变化而来的。若要指定为浮动表单,可以:

    (1)用“表单设计器”创建或编辑表单。

    (2)可将表单的ShowWindow属性设置为以下值之一:

    1)0:在屏幕中。浮动表单的父表单将出现在VFP主窗口。

    2)1:在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表单。

    (3)将表单的Desktop属性设置为“真”。

  • 若要指定顶层表单,可以:

    (1)用“表单设计器”创建或编辑表单。

    (2)将表单ShowWindow属性设置为“2-作为顶层表单”。


6

2. 显示位于顶层表单中的子表单

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

  • 若要显示位于顶层表单中的子表单,可以:

    (1)创建顶层表单。

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

    DO FORM Subform

    • 注意:在显示子表单时,顶层表单必须是可视的、活动的。因此,不能使用顶层表单的Init事件来显示子表单,因为此时顶层表单还未激活。

      (3)激活顶层表单,如有必要,触发用以显示子表单的事件。


3 visual foxpro

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


6

4. 在顶层表单中添加菜单

  • 若要在顶层表单中添加菜单,可以:

    (1)创建顶层表单的菜单。

    (2)将表单的shoewindow属性设置为“2-作为顶层表单”。

    (3)在表单的init事件中,运行菜单程序并传递两个参数:

    DO menuname.mpr WITH oForm, IAutoRename

    • 其中,oForm是表单的对象引用。

    • 在表单的Init事件中,THIS作为第一个参数进行传递。

    • IAutoRename指定了是否为菜单取一个新的名字。

    • 如果计划运行表单的多个实例,则将.T.传递给IAutoRename。

  • 例如,可以使用下列代码调用名为mySDImenu的菜单:

    DO mySDImenu.mpr WITH THIS, .T.


6 1 3

6.1.3 用表单集扩充表单

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

    • 可同时显示或隐藏表单集中的全部表单。

    • 可以可视地调整多个表单,以控制它们的相对位置。

    • 因为表单集中所有表单都是在单个.SCX文件中用单独的数据环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录则被更新和显示。

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


6

1. 创建表单集

  • 表单集是一个包含有一个或多个表单的父层次的容器。

  • 可在“表单设计器”中创建表单集。

  • 若要创建表单集,可从“表单”菜单中,选择“创建表单集”选项。

  • 如果不需要将多个表单处理为表单组,则不必创建表单集。

  • 创建表单集以后,就可向其中添加表单。


6

2. 添加和删除表单

  • 创建了表单集以后,可添加新表单或删除表单。

  • 若要向表单集中添加附加的表单,可从“表单”菜单中选择“添加新表单”。

  • 若要从表单集中删除表单,可以:

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

    • 从“表单”菜单中选择“移除表单”。

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


6

2. 添加和删除表单(续)

  • 表单以表的格式存储在.SCX后缀的文件中。

  • 创建表单时,.SCX表包含了一个表单的记录、一个数据环境的记录和两个内部使用记录。

  • VFP为每个添加到表单或数据环境中的对象添加一个记录。如果创建了表单集,则为表单集和每个新表单添加一个附加的记录。

  • 每个表单的父容器为表单集,每个控件的父容器为其所在的表单。

  • 注意:当运行表单时,若不想在表单集中所有表单的初始化时就设置为可视的,可以在表单集运行时:

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

    • 要显示表单,Visible属性设置为“真”(.T.)。


6

6.2 在表单中添加对象

  • 深入了解容器和控件对象

  • 添加Visual FoxPro容器

  • 向表单中添加Visual FoxPro控件

  • 在表单中添加数据绑定型控件

  • 在表单中添加用户自定义的对象

  • 确定表单中的控件数目

  • 在表单中添加属性和方法程序

  • 包含预定义常量


6 2 1

6.2.1 深入了解容器和控件对象

  • VFP中的对象根据它们所基于的类的性质可分为两类:

    (1)容器可以作为其他对象的父对象。

    • 例如,一个表单作为一个容器,是放在它上面的复选框的父对象。

      (2)控件可以包含在容器中,但不能作为其他对象的父对象。

    • 例如,复选框就不能包含任何其他的对象。

  • 在“表单设计器”中即可以设计容器,也可设计控件。


6 2 2 visual foxpro

6.2.2 添加Visual FoxPro容器

  • 除表单集和表单外,VFP还提供了4个基本容器类:命令按钮组、选项按钮组、表格和页框。

  • 在表单中添加容器对象:

    • 从“表单控件”菜单栏上选择所需要容器对象的按钮(表格、页框或按钮),并在表单中拖动,调整到所需要的大小。

  • 在表单中添加命令按钮组或选项按钮组时,按钮组默认包含两个按钮。

  • 在表单中添加页框时,页框默认包含两个页面。

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


6 2 2 visual foxpro1

6.2.2 添加Visual FoxPro容器(续)

  • 向表单中添加表格时,ColumnCount属性的默认值为-1,表示处于AutoFill状态。

    • 在运行时表格将显示与RowSource表中的字段同样数量的列。

    • 如果不想处于AutoFile状态,可以设置表格的ColumnCount属性为指定列的数目。

  • VFP中的所有容器对象都有与它们相关联的记数属性和收集属性。

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

    • 记数属性是指示其包含对象数的数值属性。


6 2 2 visual foxpro2

6.2.2 添加Visual FoxPro容器(续)

  • 每个容器的收集和记数属性根据包含在容器中的对象类型来命名,表6-2列出了容器及其相应的收集和记数属性。

  • 这些属性以编程方式循环地处理所包含的所有或指定的对象。


6 2 2 visual foxpro3

6.2.2 添加Visual FoxPro容器(续)

  • 以下几行代码设置在表格中列的backcolor属性,以实现红色与绿色交替出现的功能:

    o=THISFORM.grd1

    FOR i=1 to o.ColumnCount

    IF i % 2=0&&偶数列

    o.Columns(i).BackColor=RGB(0,255,0) &&绿色

    ELSE

    o.Columns(i).BackColor=RGB(255,0,0) &&红色

    ENDIF

    ENDFOR


6 2 3 visual foxpro

6.2.3 向表单中添加Visual FoxPro控件

  • 控件工具栏使用户很方便地在表单中添加任何一种标准的VFP控件。

  • 常用的VFP控件有:

    • 复选框、组合框、命令按钮、编辑框、文本框和列表框;

    • 图像、标签、线条、形状和微调控件;

    • 超级链接、ActiveX 绑定控件、ActiveX 控件和计时器。

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


6 2 4

6.2.4 在表单中添加数据绑定型控件

  • 通过给控件的ControlSource属性设置了字段或给表格的RecordSource设置表或视图,可使控件与表、视图、表的字段,或视图的字段中的数据相联系。

  • 也可通过直接将表和视图从项目管理器或“数据库设计器”或“数据环境设计器”拖到表单中,以创建数据绑定型控件。

  • 在“表设计器”中,“属性”选项卡的FieldMapping属性设置或“选项”对话框的FieldMapping选项卡的设置,是这种方法创建控件类的基础。


6 2 5

6.2.5 在表单中添加用户自定义的对象

  • VFP最强大的功能之一就是能创建在应用程序不同部分都可以使用和重复使用的类。

  • 若创建了类,就可以将它们添加到表单中。

  • 若要基于自定义类上添加对象,可在项目管理器中,将类拖动到容器中。当给工具栏添加类时,也可直接在“表单控件”工具栏中添加


6

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

  • 类库必须在注册后才能在“表单控件”工具栏中显示出来。

  • 若要注册类库,可以如下操作:

    (1)从“工具”菜单中选择“选项”,打开“选项”对话框。

    (2)在“选项”对话框中,选择“控件”选项卡。

    (3)选择“添加”按钮。

    (4)如图6-4,在打开的对话框中,选择一个要加到“选定”列表中的类库,并选择“打开”按钮。

    (5)重复步骤(3)和(4)。


6

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

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


6

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

  • 可以在“表单设计器”中直接注册类库。

  • 若要在表单设计器中注册一个类库,可以如下操作:

    (1)在“表单控件”工具栏中选择“查看类”按钮。

    (2)如图6-5所示,从子菜单中选择“添加”。

    (3)在“打开”对话框中选择要添加到“表单控件”工具栏上的类库,然后选择“打开”按钮。

图6-5 表单控件


6

2. 从类库中添加对象到表单

  • 从“选项”对话框的“控件”选项卡或从“查看类”子菜单添加类库,能在“表单设计器”中访问它们。

  • 从“表单控件”工具栏添加自定义对象,操作如下:

    (1)在“表单控件”工具栏中,选择“查看类”按钮。

    (2)如图6-6所示,从已注册类库的列表中选择一个类库,它包含了要加到表单中的控件。工具栏与选定库中的控件放在一起。

    (3)单击所需要的控件,并在表单中拖动到合适大小。

图6-6 查看类按钮


6 2 6

6.2.6 确定表单中的控件数目

  • 使用ControlCount属性可以确定表单中究竟有多少个控件,而Controls[n]属性允许引用表单上的任何一个控件。

  • 下面的程序用于打印出当前活动表上所有控件的NAME属性:

    ACTIVATE SCREEN

    FOR nCnt=1 TO Application.ActiveForm.ControlCount

    ? Application.ActiveForm.Controls[nCnt].Name

    ENDFOR


6 2 7

6.2.7 在表单中添加属性和方法程序

  • 可以向表单中添加任意多个新的属性和方法程序。

  • 属性拥有一个值,而方法程序拥有一个过程代码,当调用方法程序时,即运行这一过程代码。

  • 新建的属性和方法程序属于表单,可以像引用其他属性和方法程序那样引用它们。


6

1. 创建新属性

  • 如果已经有一个表单集,那么在“表单设计器”中加入的属性和方法程序就属于表单集。

  • 若没有建立表单集,则属性和方法程序属于表单。

  • 在表单或表单集中添加新属性,操作如下:

    (1)从“表单”菜单中选择“新建属性”命令。

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


6

1. 创建新属性(续)

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


6

2. 创建数组属

  • 数组属性和其他属性一样都属于表单或表单集,不同的是可用VFP的数组命令和函数处理它。

  • 若要创建一个数组属性,可以如下操作:

    (1)在表单中添加新属性。

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

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


6

3. 创建新方法程序

  • 可在表单中添加方法程序,并可用调用表单类方法程序的方式调用它。

  • 若要在表单或表单集中创建一个新方法程序,可如下操作:

    (1)从“表单”菜单中选择“新方法程序”。

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

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

    ObjectName.MethodName

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

    cVariable = ObjectName.MethodName(cParameter.nParameter)


6 2 8

6.2.8 包含预定义常量

  • 为了在方法程序中使用预定义常量,可在表单或表单集中用#INCLUDE命令包含一个头文件。

  • 头文件一般包含有#DEFINE预处理器伪指令定义的编译时的常数。

  • 若要在表单中包含文件,可以如下操作:

    (1)从“表单”菜单中选择“包含文件”。

    (2)在“包含文件”对话框的“包含文件”文本框中指定文件,或者选择对话框按钮以打开“包含”对话框并选定文件。

    (3)单击“确定”按钮。


6

6.3 处理对象

  • 在设计时设置属性

  • 定义表单行为

  • 指定表单的图标

  • 编辑事件代码和方法程序代码

  • 保存表单

  • 将表单和控件保存为类

  • 运行表单

  • 在运行时刻设置属性

  • 在运行时调用方法程序

  • 对事件作出响应


6

6.3 处理对象

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

    • 在“表单设计器”窗口中通过拖动来设置对象的大小和位置。

    • 选择“布局”工具栏上的对齐工具,或者选择“格式”菜单中的选项可以对齐控件。

    • 在“调色板”工具栏中选择前景和背景颜色来设置颜色。

    • 在“属性”窗口中设置属性。表单或表单集中对象的属性主要是在属性窗口中设置。


6 3 1

6.3.1 在设计时设置属性

  • 打开“属性”窗口,如图6-8所示,显示选定对象的属性或事件。

  • 如果选择了多个对象,这些对象共有的属性将显示在“属性”窗口中。

  • 要编辑另一个对象的属性或事件,可在“对象”框中选择这个对象,或者直接从表单中选择这个控件。

  • 若要设置属性,可首先在“属性”窗口中,从“属性和事件”列表中选择一个属性。然后在属性设置框中,为选中的属性键入或选择需要的设置。

  • 注意:那些在设计时为只读的属性,例如,对象的Class属性,在“属性”窗口的“属性和事件”列表框中以斜体显示。


6 3 11

6.3.1 在设计时设置属性(续)

  • 如果属性要求输入字符值,不必用引号将这个值括起来。

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

图6-8 “属性”窗口


6 3 12

6.3.1 在设计时设置属性(续)

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

    • 在“属性”窗口中,单击“函数”按钮打开“表达式生成器”。

    • 在“属性设置”框中输入“=”号,并在后面输入表达式。

      例如,想设置表单的caption属性,使它在运行表单时能够指示当前的活动表,可在“属性设置”框中输入=ALIAS()。

  • 在“属性”窗口中设置一个属性表达式,并在运行时刻或设计时刻初始化对象时,才对这个属性表达式进行求值。

  • 如果建立了对象,除非明确地改变它,否则属性设置都不会改变。


6 3 2

6.3.2 定义表单行为

  • 在“表单设计器”中设计表单时,表单是“活”的,除非Visiable属性设置为“假”(.F.),对表单的外观和行为的修改将立刻在表单上反映出来。

  • 如果将 WindowState 属性设置为“1-最小化”或“2-最大化”,“表单设计器”中的表单会立即体现这一设置。

  • 如果将 Movable 属性设置为“假”(.F.),那么不但用户在运行时刻不能移动表单,即使在设计时刻也不能移动它。

  • 因此应该在设置那些决定表单行为的属性之前,先完成表单的功能设计,并添加所有需要的控件。


6 3 21

6.3.2 定义表单行为(续)

  • 表6-3列出了在设计时常用的表单属性,定义表单的外观和行为。

  • 使用LockScreen属性,使控件布局属性在运行时的调整看起来更清晰。


6 3 3

6.3.3 指定表单的图标

  • 在Visual FoxPro for Windows中,可指定表单的图标;

  • 当该表单在Windows NT窗口中最小化或位于Windows 2000/XP的标题栏上时显示为这个图标。

  • 如果要指定表单的图标,将表单的Icon 属性设置为一个.ico文件的文件名。


6 3 4

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

  • 事件:

    • 用户的行为,如单击或鼠标的移动;

    • 系统行为,如系统时钟的进程。

  • 方法程序是和对象相联系的过程,只能通过程序以特定的方式激活。

  • 当触发事件或激活方法程序时,可以指定要执行的代码。

  • 若要编辑事件代码或方法程序代码,可以如下操作:

    (1)从“显示”菜单中选择“代码”命令。

    (2)在“过程”框中选择事件或方法程序。

    (3)在编辑窗口中键入代码,在触发事件或激活方法程序时将执行这些代码。


6 3 41

6.3.4 编辑事件代码和方法程序代码(续)

  • 例如,如果在表单上已有一个标题为“退出”的命令按钮,在这个按钮的Click事件中可包括这样一行代码:

    THISFORM.Release

  • 注意:若要在代码编辑窗口中查看不同过程,可按PgDn或PgUp键。

  • 用户单击该命令按钮,表单被从屏幕和内存中删除。

  • 如果不想从内存中释放表单,可在Click事件中以这样一行代码代替:

    THISFORM.Hide

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


6 3 5

6.3.5 保存表单

  • 在运行表单之前需要先将它保存。

  • 如果在未保存之前就试图运行这个表单或关闭“表单设计器”,VFP将提示是否保存已做过的修改。

  • 若要保存表单,在“表单设计器”中,从“文件”菜单中选择“保存”命令。


6 3 6

6.3.6 将表单和控件保存为类

  • 可将表单或表单上的控件子集保存为类定义。

  • 如果打算创建基于表单的子类,或在其他表单中重新使用这些控件,可将表单作为类定义来保存。

  • 若将表单或选定的控件保存为类定义,操作如下:

    (1)从“文件”菜单中选择“另存为类”。

    (2)在图6-9所示的“另存为类”对话框中,选择“当前表单”或“选定控件”。

    (3)在“类名”框中输入类的名称。

    (4)在“文件”框中输入保存类的文件名。

    (5)单击“确定”按钮。


6 3 61

6.3.6 将表单和控件保存为类(续)

  • 如果没有给出文件扩展名,保存文件时会加上默认的.VCX扩展名;如果将表单保存为类定义,可以用MODIFY CLASS命令对它进行修改。

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


6 3 7

6.3.7 运行表单

  • 可从界面直接运行表单

  • 也可在程序代码中运行表单

    1. 交互地运行表单

  • 有几种方法可以运行设计好的表单:

    • 如果在“表单设计器”中工作,可通过选择“表单”菜单中的“执行表单”测试表单;此时关闭运行表单,可在“表单设计器”中重新打开表单。

    • 也可以从项目中运行表单,或者以编程方式运行它。

  • 以交互方式运行表单,采用以下方式之一进行:

    • 在项目管理器中,选择要运行的表单,再选择“运行”按钮。

    • 在“命令”窗口中,使用DO FORM命令运行表单。

    • 从“程序”菜单中选择“运行”,在“文件类型”框中选择“表单”,选定一个表单,再单击“运行”按钮。


6

2. 从程序中运行表单

  • 在程序中运行表单,要在与事件相关联的代码、方法代码,或在程序或过程中包含DO FORM命令。

    3. 命名表单对象

  • 默认情况下,当使用DO FORM命令时,表单对象的名称与.scx文件名称一样。

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

      DO FORM Student

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

    DO FORM Student NAME frmStu1

    DO FORM Student NAME frmStu2


6

4. 处理表单对象

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

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

      DO FORM Student

      Student.Caption = "Hello"

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

    ? TYPE("Student")

  • 可在程序中发出DO FORM命令访问表单

  • 也可使用应用程序对象的ActiveForm、Forms和FormCount属性访问表单。


6

5. 将表单链接到表单对象变量

  • DO FORM命令中的LINKED关键字允许将表单和表单对象变量链接起来。

  • 如果包含了LINKED关键字,当与表单对象相关联的变量超出范围时,表单将被释放。

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

      DO FORM Student NAME frmStu2 LINKED

  • 当释放frmStu2时,表单也关闭:

    RELEASE frmStu2


6

6. 关闭活动的表单

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

  • 若允许用户关闭活动表单,可在“属性”窗口中,将Closable属性设为“真”,或用RELEASE命令。

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

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

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


6 3 8

6.3.8 在运行时刻设置属性

  • VFP 中的对象模式使得在运行时刻能对属性进行充分的控制。

    1. 在对象层次上引用对象

  • 若想操作一个对象,需确定它和容器层次的关系。

  • 在容器层次的最高级(表单集或表单)需要引用对象变量,除非使用DO FORM命令中的NAME子句,否则对象变量和.scx文件有相同的名称。

  • 通过引用由点号“.”分隔的对象变量、控件和属性,可以处理属性,例如:

    objectvariable.[form.]control.property = Setting


6

1. 在对象层次上引用对象(续)

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

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

      StuView.frmStu.cmdButton1.Caption = "Edit"

  • 可在表单或表单集中使用THIS、THISFORM和THISFORMSET引用对象。

    • 例如,要想在单击命令按钮时改变它的标题,可在命令按钮的Click事件代码中包含下面的命令:

      THIS.Caption = "Edit"


6

2. 在运行时使用表达式设置属性

  • 在运行时也可以使用表达式或函数来设置属性。

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

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

    • 首先在表单的调用程序中声明这个变量:

      PUBLIC glEditing

      glEditing =.F.

    • 然后在Caption设置中使用一个IIF表达式:

      frsSet1.frmForm1.cmdButton1.Caption = IIF(glEditing =.F.,"Edit","Save")

    • 还可以用一个用户自定义函数设置标题:

      frsSet1.frmForm1.cmdButton1.Caption = setcaption()


6

3. 设置多个属性

  • 用户可以同时设置多个属性,此时可使用WITH…ENDWITH结构。

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

      WITH THISFORM.grdGrid1.grcColumn1

      Width = 5

      .Resizable = .F.

      .ForeColor = RGB(0, 0, 0)

      .BackColor = RGB(255, 255, 255)

      .SelectOnEntry = .T.

      ENDWITH


6 3 9

6.3.9 在运行时调用方法程序

  • 调用对象的方法程序的语法是:

    Parent.Object.Method

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

    * 保存在MYF_SET.SCX中的表单集

    myf_set.frmForm1.Show

    myf_set.frmForm1.cmdButtonl.SetFocus

  • 若要隐藏表单,可以使用这个命令:

    myf_set.frmForml.Hide


6 3 10

6.3.10 对事件作出响应

  • 当事件发生时,包含在这个事件过程中的代码也被执行。

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

  • 调用与一个事件相关联的过程代码并不使事件发生。

    • 例如,下面的语句执行frmPhoneLog的Activate事件中的代码,但它并不激活表单:

      frmPhoneLog.Activate

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

    frmPhoneLog.Show


6

6.4 管理表单

  • 隐藏表单

  • 释放表单

  • 将参数传递到表单

  • 从表单返回值

  • 管理表单的多个实例

  • 为表单设置设计区

  • 在表单中使用本地和远程数据

  • 设置表单模板


6 4 1

6.4.1 隐藏表单

  • 用户可以隐藏一个表单,使它不可见。

  • 在隐藏表单后,用户不能访问表单上的控件,但仍可以用程序完全控制它们。

  • 若要隐藏表单,可以使用Hide方法程序。

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

      THISFORM.Hide

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


6 4 2

6.4.2 释放表单

  • 当用户完成对表单的操作后,可以让用户释放表单。

  • 在释放表单后,就不能再访问表单的属性和方法程序了。

  • 若要释放表单,可以使用RELEASE命令。

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

      THISFORM.Release

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


6 4 3

6.4.3 将参数传递到表单

  • 在运行表单时,为设置属性值或指定操作的默认值,有时需要将参数传递到表单。

  • 将参数传递到在“表单设计器”中创建的表单,操作如下:

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

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

    PARAMETERS cString,nNumber

    (3)在表单的Init事件代码中,将参数分配给属性:

    THIS.ItemName=cString

    THIS.ItemQuantity=nNunber

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

    DO FROM myform WITH "Bagel", 24


6 4 4

6.4.4 从表单返回值

  • 在整个应用程序中都可使用表单,让用户指定值。

  • 若要从表单返回值,可以如下操作:

    (1)将表单的WindowType属性设置为1,使表单成为有模式表单。

    (2)在与表单的UnLoad事件相关的代码中,包含一个带返回值的RETURN命令。

    (3)在运行表单的程序或方法程序中,在DO FORM命令中包含TO关键字。

    • 例如,如果FindXsXh 是一返回字符值的有模式表单,下面的一行代码将返回值返回到一名为cXsXh 的变量中。

      DO FORM FindXsXh TO cXsXh

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


6 4 5

6.4.5 管理表单的多个实例

  • 在同一时刻,可以有一个类定义的多个实例活动。

    • 例如,只设计一个选课表单,而在应用程序中有几个打开的选课单,每一个都使用相同的表单定义,但可独立地显示和操作。

  • 当管理一表单的多个实例时,必须记住以下要点:

    (1)在启动表单中创建一个数组属性,数组中的每个元素用来存放一个表单的实例变量,在事先不知道有多少个实例时,跟踪实例变量的最简便的方法就是使用数组。

    (2)对于拥有多个实例的表单,将其DataSession属性设置为2:私有数据工作期。

    • 私有数据工作期为表单的每个实例提供一个独立的工作区,因此选定的表和记录指针的位置都是独立的。


6 4 6

6.4.6 为表单设置设计区

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

    (1)从“工具”菜单中选择“选项”命令。

    (2)在“选项”对话框,选择“表单”选项卡,如图6-10所示。

    (3)在“最大设计区”框中,选择最大设计区的像素坐标。

图6-10 “表单”选项卡


6 4 7

6.4.7 在表单中使用本地和远程数据

  • 可创建这样的表单,很容易地在使用本地数据和远程数据(例如,存储在数据服务器上)之间切换。

  • 就可以使用本地或测试数据来创建应用程序的原型,然后切换到远程或实际的数据上,而不对表单做实质性的修改。

    • 例如,如果VFP应用程序是一个存储在数据服务器上的大型学生表的前端处理,则可创建一个本地.dbf文件,其中包含小型但具有代表意义的数据样本。

    • 然后在小型数据集合基础上创建、测试和调试表单。当准备发布应用程序时,再将表单链接到大型数据集合上。


6 4 71

6.4.7 在表单中使用本地和远程数据(续)

  • 能够在本地和远程数据库之间切换的关键在于使用的是视图而不是直接将表单(及其控件)与表链接。

  • 若要访问远程数据,则必须在任何事件中使用视图。

  • 为了方便本地数据与远程数据的切换,也需为本地数据创建视图。

  • 创建表单时,将这两个视图都添加到它的数据环境中,根据需要进行切换。


6 4 72

6.4.7 在表单中使用本地和远程数据(续)

  • 创建在本地和远程数据间切换的表单,操作如下:

    (1)创建数据的两个视图,一个指向远程数据,另一个指向本地数据。

    (2)新建表单。

    (3)打开表单的“数据环境设计器”,添加这两个视图。

    (4)在“数据环境设计器”中右击,选择“属性”命令。

    (5)在“属性”窗口中,为两个临时表设置同样的 Alias 属性。

    (6)将“数据环境”的OpenViews属性设置为“1-本地”或“2-远程”,取决于表单运行时使用哪个视图。

    • 注意:由于两个视图使用同样的别名,不要选择默认的“0-本地和远程”。

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


6 4 73

6.4.7 在表单中使用本地和远程数据(续)

  • 创建表单后,通过改变“数据环境”OpenView属性切换视图的别名。可在使用“表单设计器”时在“数据环境”中做此工作。

  • 如果要在运行时刻切换视图,还可写出代码并将其附加到某个事件中。

    • 例如,可将这些代码放入Activate事件中:

      THISFORM.DataEnvironment.OpenViews=2 &&使用远程视图

  • 如果要创建一个可在本地和远程数据间切换的表单,还必须设计定位代码,用以容纳两个视图,尤其是设计具有一对多关系的表单。

    • 例如,若表单只访问本地表或视图,可在Next命令按钮中使用下列代码,用来移动指针到临时表的下一记录:

      SKIP 1

      THISFORM.Refresh()


6 4 74

6.4.7 在表单中使用本地和远程数据(续)

  • 当在远程视图中定位时,此代码无效。因为代码假设临时表包含了表单需要的所有数据。

  • 通常情况下,希望从远程数据源上下载的数据越少越好。

  • 解决的办法是使用带参数的视图。

    • 例如,用来编辑学生信息的视图定义如下代码:

      SELECT * FROM xsb WHERE xsb.x = ?pX

  • 表单运行时,会在对话框中提示用户输入系名或允许用户在文本框中输入一个名称。“显示”按钮的代码可能与以下代码相似:

    pX = THISFORM.txtX.Value

    REQUERY("xsb")

    THISFORM.Refresh()


6 4 8

6.4.8 设置表单模板

  • 可以用模板为所有的新表单创建自己的表单类,也可以利用VFP的示例类来设置表单模板。

  • 当创建一个新表单时,它基于在“选项”对话框设置的模板表单。

  • 如果没有指定模板,新表单将基于VFP表单基类。


6

1. 使用表单模板的优点

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

    • 例如,可以在表单上包含各系的徽标,可以用有关属性设计模板表单类,以便在所有的表单中使用一致的配色方案。

    • 如果系的徽标有变化,只需修改模板表单中的图画,创建在这个模板上的所有的表单将自动继承新的徽标。

  • 可在VFP表单中加入自定义的属性和方法程序,使这些属性和方法程序对应用程序中的每一个表单都有效。

  • 如果习惯于创建属于表单的变量和用户自定义过程,使用自定义属性和方法程序不但提供了这个功能,还能拥有一个整洁的封装模型。


6

2. 指定默认的表单模板

  • 可以为表单模板从注册的类库中指定一个表单类。

  • 指定默认的表单模板,操作如下:

    (1)从“工具”菜单中选择“选项”命令。

    (2)在“选项”对话框中,选择“表单”选项卡。

    (3)如图6-10所示,在“模板类”区域选择“表单”复选框。

    • 如果没有选定表单模板,会出现“表单模板”对话框,这样可以选择一个表单类;

    • 如已选定表单模板,可选择对话按钮来选择其他的类。

      (4)如果想在以后的VFP工作期中使用这个模板,选择“设置为默认值”按钮。

      (5)单击“确定”按钮。


6

3. 使用表单模板

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

    (1)表单集模板和表单模板都被指定

    (2)只有表单集模板被指定

    (3)只有表单模板被指定

    (4)没有模板被指定


6

6.5 控件使用要点

  • 设置控件的数据源

  • 根据任务选择合适的控件

  • 预先设定选择的控件

  • 接受预先不能确定的输入

  • 接受给定范围的数值输入

  • 允许特定操作

  • 使用计时器控件

  • 显示信息

  • 使用表格控件


6

“表单控件”工具栏

  • 控件是实现GUI用户界面的一个重要组成部分,也是最直观、最能体现友好用户界面的构件,可以提高人机交互能力。

  • 通过在表单的控件上输入、单击及在控件之间移动,用户可以操作数据,完成自己的任务。

  • 在“表单设计器”中,打开“表单控件”工具栏,如图6-11所示。

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


6 5 1

6.5.1 设置控件的数据源

  • 在用户的表单中可以有两类控件:与表中数据绑定的控件和不与数据绑定的控件。

  • 当用户使用绑定型控件时,所输入或选择的值将保存在数据源中(数据源可以是表的字段、临时表的字段或变量)。

  • 要想把控件和数据绑在一起,可以设置控件的ControlSource属性。

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

  • 如果没有设置控件的ControlSource属性,用户在控件中输入或选择的值只作为属性设置保存。

  • 在控件生存期之后,这个值并不保存在磁盘上,也不保存到内存变量中。


6 5 11

6.5.1 设置控件的数据源(续)

  • 不同控件的ControlSource属性设置的作用如表6-5所示。


6 5 2

6.5.2 根据任务选择合适的控件

  • VFP的控件具有良好的灵活性和通用性。

  • 可以用多种控件来完成某个特定的任务,但最好保持控件的使用方法的一致性。

    • 例如,标签和命令按钮都具有Click事件,但熟悉图形界面的用户更习惯单击命令按钮来执行指令。

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

    • 为用户提供一组预先设定的选择。

    • 接受不能预先设定的用户输入。

    • 在给定范围内接受用户输入。

    • 允许用户执行特定的命令。

    • 在给定的时间间隔内执行特定的命令。

    • 显示信息。


6 5 3

6.5.3 预先设定选择的控件

  • 确保数据库有效性的最直接方法之一,就是为用户提供一组预先设定的选项。

  • 控制用户的选择,可以保证在数据中不存储无效数据。

  • 可以用选项按钮组、列表框和下拉列表,或复选框为用户提供一组预先设定的选择。


6

1. 使用选项按钮组

  • 选项按钮组是包含选项按钮的容器。

  • 通常,选项按钮允许用户指定对话框中几个操作选项中的一个,而不是输入数据。

    • 例如,选项按钮可以指定是向文件或打印机输出结果还是进行打印预览。

      (1)设置选项按钮组中的选项按钮数目。

      (2)设置选项按钮的属性。

      (3)判断当前选定的按钮。

      (4)使用选项按钮将用户的选择存储到表中。


6

2. 使用列表框和下拉列表框

  • 列表框和下拉列表框(即Style属性为2的组合框控件-下拉列表)为用户提供了包含一些选项和信息的可滚动列表。

  • 列表框中,任何时候都能看到多个项;而在下拉列表中,只能看到一个项,用户可单击向下按钮来显示可滚动的下拉列表框。

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


6

(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属性修改为等宽字体。


6

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

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

  • 若要选择列表中的多项,可将列表的MultiSelect属性设置为“真”(.T.)。

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


6

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

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

  • 若要以交互方式向列表添加项,可使用AddItem方法程序。

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

      LPARAMETERS nKeyCode, nShiftAltCtrl

      IF nKeyCode = 13 && Enter 键

      THISFORM.lstAdd.AddItem(This.Value)

      THIS.Value = ""

      ENDIF


6

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

  • 有时程序开发人员也许想让用户自己选择所要查看或编辑的记录。

    • 例如,可能为用户提供了一个学生姓名列表,当用户从列表中选择一个学生时,需要同时选择表中那个学生的记录,并在表单的文本框中显示该学生的有关信息。

  • 可以有很多方法做到这一点,采用何种方法取决于表单中的数据源,如表6-6所示。


6

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

  • 当用户通过选择列表中的一个值来转到某个记录时,可能需要一个一对多关系反映父表中记录指针的变化。

  • 利用本地表以及本地视图或远程视图可以实现这一功能。

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

    • 视图:在“视图设计器”中创建视图时,将SELECT语句的参数设置为列表的Value属性,例如:

      SELECT * FROM xk WHERE xk.xh=?THISFORM.Istxh.Value


6

(5)根据列表值刷新一对多显示(续)

  • 按本地视图或远程视图设计一个一对多列表,操作如下:

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

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

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

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

    • 在列表InteractiveChange事件代码中,将列表的值保存在变量中,然后重新查询视图。


6

(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


6

(7)将图片添加到列表项中

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

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

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


6

3. 使用复选框

  • 使用复选框让用户指定一个布尔状态:“真”、“假”;“开”、“关”;“是”、“否”。

  • 有时不能将问题准确地归为“真”或“假”,此时可使用复选框的Value属性,它使得复选框有三种可能的状态:0或.F.、1或.T.、2或.NULL.。

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

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

    • 注意:当用户按Ctrl+0(零)键,在复选框中显示null值。


6 5 4

6.5.4 接受预先不能确定的输入

  • 并不是总能预先确定用户向控件输入的所有可能的值。

  • 文本框、编辑框或组合框允许接收不能预先确定的用户输入。

    1. 使用文本框

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

  • 通过设置或引用Value属性,可以在程序中引用或更改文本框中显示的文本。


6

1. 使用文本框(续)

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

    (1)检验文本框中的数据是否有效。

    • 若要检验文本框中的值,可在与Valid事件相关的方法程序中写进相应代码。

      (2)当文本框得到焦点后选择文本。

      (3)在文本框中接收用户密码。

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


6

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)


6

3. 使用组合框

  • 组合框兼有列表框和文本框的功能。

  • 有两种形式的组合框,即下拉组合框和下拉列表框,通过更改控件的Style属性可选择想要的形式。

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

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

    THIS.AddItem(THIS.Text)

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


6 5 5

6.5.5 接受给定范围的数值输入

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

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

  • 微调控件的KeyboardHighValue和SpinnerHighValue属性设置为用户可在微调控件中输入的最大值,KeyboardLowValue和SpinnerLowValue属性设置为用户在微调控件中输入的最小值。

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

  • 微调控件值一般为数值型,也可以使用微调控件和文本框来微调多种类型的数值。


6 5 6

6.5.6 允许特定操作

  • 有时,想让用户完成一些和操作值无关的特定动作。

  • 例如,让用户关闭一个表单、打开另一个表单、在表中浏览、保存或取消编辑、运行报表或查询、跳至Internet或Intranet上的目标地址以及任何其他的操作,可以采用以下方式之一。


6

1. 使用命令按钮或命令按钮组

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

  • 将命令按钮的Default属性设置为“真”(.T.),可使该命令按钮成为默认选择。

  • 默认选择的按钮比其他命令按钮多一个粗的边框。

  • 如果一个命令按钮是默认选择,那么按回车键后,将执行这个命令按钮的Click事件。


6

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

  • 要让组中所有命令按钮的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


6

3. 使用“超级链接”对象

  • 可以使用“超级链接”对象跳转到Internet或Intranet的一个目标地址上。

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

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

      THISFORM.Hyperlink1.NavigateTo('www.microsoft.com')

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


6 5 7

6.5.7 使用计时器控件

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

  • 它与用户的操作独立,并对时间作出反应。

  • 可以让计时器以一定的间隔重复地执行某种操作。

  • 计时器通常用来检查系统时钟,确定是否到了应该执行某一任务的时间。对于其他一些后台处理,计时器也很有用。

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

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


6 5 8

6.5.8 显示信息

  • 完美设计的原则之一就是使有关信息可视化。

  • 可以用图像、标签、文本框、编辑框或形状来显示用户需要的信息。

    1. 使用图像

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


6 5 81

6.5.8 显示信息(续)

2. 使用标签

  • 标签和文本框的不同之处在于:标签没有数据源,不能直接编辑,也不能用Tab键选择。在程序中可以改变标签的Caption和Visible属性,便于标签显示不同的内容。

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

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

    4. 使用形状和线条

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


6 5 82

6.5.8 显示信息(续)

5. 使用表单图形显示信息

  • 表6-7列出的表单方法程序可在表单中使显示信息图形化。

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


6 5 83

6.5.8 显示信息(续)

6. 增强控件显示

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

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

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


6

6. 增强控件显示(续)

  • 通常,.bmp图片会带有白色空白,但又不希望这些空白出现在控件中,不规则形状图像周围的白边会使控件很难看。

  • 为解决这个问题,VFP为图片创建了一个临时的默认掩码,赋予白色区域透明属性,这样按钮下面的颜色或背景色就能显示出来。

  • 若想保留.bmp图片中的白色区域,可为.bmp图片创建一个自定义的掩码,创建掩码的步骤如下:

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

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

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


6

6. 增强控件显示(续)

  • 当VFP加载一个由命令按钮、选项按钮或复选框的Picture属性指定的.bmp文件时,它在相同的目录下寻找相匹配的.msk文件。

  • 如果这个目录中存在与这个.bmp文件同名的.msk文件,VFP把它作为这个.bmp文件的掩码,.msk图片中所有白色区域在.bmp图片中都为透明,而.msk 图片中的黑色区域则照.bmp图片中的内容显示。

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


6 5 9

6.5.9 使用表格控件

  • VFP用一个强有力的工具——表格对象,显示和操作多行数据。

  • 表格是一个容器对象,和表单集包含表单一样,表格也能包含列。

  • 这些列除了包含标头和控件外,每一个列还拥有自己的一组属性、事件和方法程序,从而为表格单元提供了大量的控件。

  • 表格对象能在表单或页面中显示,并操作行和列中的数据。


6

1. 将表格控件添加到表单

  • 在“表单控件”工具栏中选择“表格”按钮,并在“表单”窗口中调整为期望的大小,可将表格添加到表单。

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


6

2. 设置表格列数

  • 首先需要设置的表格控件属性是列数,这可通过在“属性”窗口中选择ColumnCount属性来进行。

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


6

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

  • 在表格中加入列后将改变列的宽度和行的高度。

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

  • 若要切换到表格设计方式,可从表格的快捷菜单中选择“编辑”命令,或在“属性”窗口的“对象”框中,选择表格的一列。 在表格设计方式下,表格周围将显示一个粗框。若要退出表格设计方式,只需选择表单或其他控件。

  • 若要调整表格中列的宽度,可首先在表格设计方式下,将鼠标指针置于表格列的标头之间,这时指针变为带有左右两个方向箭头的竖条,然后将列拖动到需要的宽度;或者在“属性”窗口中设置列的Width属性。

  • 若要调整表格中行的高度,可先在表格设计方式下,将鼠标指针置于“表格”控件左侧的第一个按钮和第二个按钮之间,这时指针将变成带有向上和向下箭头的横条,然后将行拖动到需要的宽度;或者在“属性”窗口中设置列的Height属性。


6

4. 设置表格中显示的数据源

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

  • 若要为整个表格设置数据源,可以如下操作:

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

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

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

    (4)输入作为表格数据源的别名或表名。

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


6

5. 向表格添加记录

  • 将表格的AllowAddNew属性设置为“真”(.T.),可以允许用户向表格中显示的表中添加新的记录。

  • 如果将AllowAddNew属性设置为真,当用户选中了最后一个记录,并且按下“↓”键时,就向表中添加了新记录。

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


6

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

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

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

  • 若要设置具有数据环境的一对多表单,可以将需要的字段从“数据环境”中的父表拖动到表单中,并将相关的表拖动到表单中。


6

6. 使用表格控件创建一对多表单(续)

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

  • 创建没有数据环境的一对多表单,操作如下:

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

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

    (3)在表单中添加一个表格。

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

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

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

    (7)将表格的RelationalExpr属性设置为连接相关表和主表的表达式。


6

7. 在表格列中显示控件

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

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


6

7. 在表格列中显示控件(续)

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

  • 交互地在表格列中添加控件,操作如下:

    (1)在表单中添加一个表格。

    (2)在“属性”窗口中,将表格的ColumnCount属性设置为需要的列数。例如,如果需要一个两列的表格则输入2。

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

    (4)在“表单控件”工具栏中选择所要的控件,然后单击父列。在“表单设计器”中,新控件不在表格列中显示,但运行时刻会显示出来。

    (5)在“属性”窗口中,要确保该控件缩进显示在“对象”框中父列的下面。如果新控件是一个复选框,应将复选框的Caption属性设置为“”,并将列的Sparse属性设置为“假”(.F.)。

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

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

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


6

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

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


6

9. 通过代码将控件添加到表格列

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


6

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

  • 表格中的特定格式能让用户更容易浏览表格记录,并找出想要的信息。

  • 如果想进行有条件的格式设置,可使用列的动态字体和颜色属性。


6

6.6 控件使用技巧

  • 使控件更容易使用的方法

  • 允许用户拖放

  • 扩展表单


6 6 1

6.6.1 使控件更容易使用的方法

1. 设置访问键

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

  • 若要为控件指定访问键,可到控件的Caption属性中,在想作为访问键的字母前输入一个反斜杠和一个小于符号(\<)。

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


6

1. 设置访问键(续)

  • 若要为文本框或编辑框指定访问键,可以如下操作:

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

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


2 tab

2. 设置控件的Tab键次序

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

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

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

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

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

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


2 tab1

2. 设置控件的Tab键次序(续)

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

  • 若要更改一个控件组中按钮的选择顺序,可以如下操作:

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

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

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

    (4)选择合适的Tab键次序。


6

3. 设置工具提示文本

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

  • 若要指定工具提示文本,可在“属性”窗口中选择ToolTipText属性,并键入需要的文本。

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


6

4. 启用和废止组中的控件

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

    frmForm1.cmgCommandGroup1.Enabled = .T.

  • 将选项按钮组或命令按钮组的Enabled属性设置为“假”(.F.)时,组中所有按钮都将废止,但不会显示出禁用的前景色和背景色。

  • 设置组的Enabled属性不会影响组中单个按钮的Enabled属性,这就允许废止其中有些按钮已经失效的按钮组。

  • 当重新启用该按钮组时,原来失效的按钮仍然失效。

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

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


6 6 2

6.6.2 允许用户拖放

  • 在设计VFP应用程序时,可以将对象从“项目管理器”、“数据库设计器”和“数据环境”中拖动到表单或报表上合适的位置。

  • 可在运行时刻扩展VFP的这一拖放功能。拖放功能可以扩展为多表单操作:将文本、文件和控件拖动到屏幕的任何位置,包括其他的表单上。

  • VFP支持两种类型的拖放:OLE拖放和控件拖放。

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

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


6

1. 启用自动拖动方式

  • 如果允许用户无论何时单击控件时都能拖动控件,可将DragMode属性设置为1,这能启用控件的自动拖动方式。

  • 当拖动设置为“自动”时,拖动功能总是打开的。

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


6

2. 在用户释放对象时的响应

  • 拖动控件之后释放鼠标按钮时,VFP会产生一个DragDrop事件,对这一事件有多种响应方法。

  • 可将控件重新定位在新的位置(由灰色外框的最后位置来指明)。

  • 控件不会自动移到新的位置。

  • 两个重要术语:即“源”和“目标”。

    • 源:指被拖动的控件

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

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


6

2. 在用户释放对象时的响应(续)

  • DragDrop事件接受三个参数:oSource、nXCoord和nYCoord。

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

      LPARAMETERS oSource, nXCoord, nYCoord

      IF oSource.Name != THIS.Name

      * 执行某些动作

      ELSE

      * 控件在自己上面停放

      * 执行其他动作

      ENDIF

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

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

      LPARAMETERS oSource, nXCoord, nYCoord

      oSource.Visible = .F.


6

3. 指示有效的释放区

  • 当启用拖放功能时,可提示用户哪些地方可以释放控件,哪些地方不能释放控件。

  • 完成这个功能最好的方法是在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


6

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时类似。


6

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

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

    • 例如,下面列出的表单的DragDrop事件代码就将被拖动的控件移动到释放位置:

      LPARAMETERS oSource, nXCoord, nYCoord

      oSource.Move(nXCoord, nYCoord)

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

  • 下面的代码将控件中心置于鼠标的位置上:

    LPARAMETERS oSource, nXCoord, nYCoord

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


6

5. 在拖放操作中引起控件移动(续)

  • 只有将DragIcon属性设置为非默认值(灰色矩形框)时,上述代码才能获得最好的效果。

  • 如果使用的是灰色矩形框,用户通常根据灰色矩形框的最后位置来精确确定控件的位置。

  • 要做到这点,应记录下鼠标在源控件中的最初位置,然后用这个位置作为计算控件移动偏移量的基准。

  • 若要记录最初的鼠标位置,可首先指定控件为人工拖动方式,声明两个表单级的变量nDragX和nDragY;当MouseDown事件发生时启用拖动,同时在这个事件中将nXCoord和nYCoord值保存在表单级变量中;最后,当MouseUp事件发生时,关闭拖动功能。


6 6 3

6.6.3 扩展表单

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

  • 页框是包含页面的容器对象,页面又可包含控件。

  • 可以在页框、页面或控件级上设置属性。

  • 如图6-13所示,可以把页框想象为有多层页面的三维容器,只有最上层页面(或在页框的顶部)中的控件才是可见和活动的。表单上一个页框可有多个页面。

页框

Page1

Page2

Page3

位于页面上

但在页框中

不可见

Page4

图6-13 页框示意图


6

1. 将页框添加到表单中

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

  • 若要将页框添加到表单,可以如下操作:

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

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

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

    (4)用向表单中添加控件的方法,向页框中添加控件。


6

2. 在页框中选择一个不同的页面

  • 若要在页框中选择一个不同的页面,可将页框作为容器激活,并选择要使用的页面选项卡;或者在“属性”窗口的“对象”框中选择这一页面;也可以在“表单设计器”底部的“页”框中选择这一页面。

  • VFP包括很多选项卡式对话框,例如,“项目管理器”和“选项”对话框。

  • 若要创建选项卡式对话框,可以如下操作:

    (1)打开适当的表单。

    (2)在表单控件工具栏中,单击“页框”按钮并在表单中把它拖到一定大小。Visual FoxPro 创建具有两个页框,每页上有一个选项卡。

    (3)如果想使选项卡多于两页,可以使用属性窗口将页框的PageCount属性设置为适当的数目。图6-14表示的是有5个页面的页框。


6

2. 在页框中选择一个不同的页面(续)

(4)如果要为每一页加上标题,可以设置对应的Caption属性。图6-14中第一页的标题为“基本情况”。

(5)保存表单。

  • 要想更容易地区分不同页,可以通过设置每一页的BackColor属性来为每一页指定不同的颜色。

图6-14 有5个页面的页框


6

3. 将控件添加到页面上

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

  • 若要将控件添加到页面上,可以首先在“属性”窗口的“对象”框中选择页面,页框的周围出现边框,表明可以操作其中包含的对象;然后在“表单控件”工具栏中,选择想要的控件按钮,并在页面中调整到想要的大小。


6

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

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

    • 将TabStretch属性设置为“1-单行”,这样只显示能放入选项卡中的标题字符,“单行”是默认设置。

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


6

5. 在程序中换页面

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

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

      THISFORM.pgfOptions.ActivePage = 3


6 activex

6.ActiveX控件

  • 单击“ActiveX控件”按钮,并在“表单”窗口中将其拖至期望的大小,可以将OLE对象添加到表单,这个工具可以处理诸如Microsoft Excel或Microsoft Word服务程序对象。

  • 另外,如果Windows SYSTEM目录上包含ActiveX控件(带有.ocx扩展名的文件),它也可以表示一个ActiveX控件。


7 activex

7.ActiveX绑定控件

  • 单击“ActiveX绑定控件”按钮,并在“表单”窗口中拖至期望的大小,可以在表单中创建一个绑定型OLE控件对象。

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

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

  • 若要创建一个绑定型OLE对象,可以如下操作:

    (1)创建或打开一个表单。

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

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


6

6.7 小结

  • 本章详细介绍了表单的创建方法和管理,介绍了常用控件的使用要点和技巧。

  • 表单是应用程序的主要界面,在应用程序的运行过程中,表单为用户和数据库管理系统提供了一个交换信息的接口,通过这个界面,可以实现对数据库的可视化的交互式操作。

  • 创建表单的方法有两种:

    • 使用表单向导:有利于表单的快速开发,可生成表单的大致样子

    • 使用表单设计器:有利于更加精细地设计表单,进行进一步的改进

  • 生成表单的主要步骤,是在表单中添加和设计控件,这些控件完成了表单的主要功能。

  • 通过本章的学习,主要掌握表单的创建方法,能熟练地管理表单,并能运用常用控件设计出友好的用户界面。


  • Login