第十三章:编译应用程序

使用 Visual FoxPro 创建面向对象的事件驱动应用程序时,可以每次只建立一部分模块。这种模块化构造应用程序的方法可以使您在每完成一个组件后,就对其进行检验。在完成了所有的功能组件之后,就可以进行应用程序的编译了。

为了快速建立一个应用程序及其项目,即一个具有完整“应用程序框架”的项目,可以使用“应用程序向导”。在项目建立之后,此版本新增加的“应用程序生成器”就打开了,您可以使用它添加数据库、表、报表和表单。

本章将介绍如何建立一个典型的 Visual FoxPro 应用程序。关于开发 Visual FoxPro 应用程序过程的详细信息,请参阅第二章“开发应用程序”和第十四章“测试和调试应用程序”。如果要发布自己的应用程序,请参阅第八部分“发布应用程序”

一般来讲,应用程序的建立需要以下步骤:

构造应用程序框架

一个典型的数据库应用程序由数据结构、用户界面、查询选项和报表等组成。在设计应用程序时,应仔细考虑每个组件将提供的功能以及与其他组件之间的关系。

一个经过良好组织的 Visual FoxPro 应用程序一般需要为用户提供菜单;提供一个或多个表单,供数据输入并显示。同时还需要添加某些事件响应代码,提供特定的功能,保证数据的完整性和安全性。此外,还需要提供查询和报表,允许用户从数据库中选取信息。

一个典型 Visual FoxPro 应用程序的结构

在建立应用程序时,需要考虑如下的任务:

下面将具体讨论这些任务。典型的情况是,可以建立一个应用程序对象来完成如上任务。请参阅在 Visual Studio …\Samples\Vfp98\Tastrade 目录下的 Tasmanian Traders 示例应用程序来了解详细的技术细节。同时,假设使用“应用程序向导”来编译应用程序,那么它会建立一个应用程序对象。如果需要的话,可以使用程序作为主文件来完成如上任务。有关详细内容,请参阅“将一个程序结构化为主文件”

设置起始点

将各个组件链接在一起,然后使用主文件为应用程序设置一个起始点。主文件作为应用程序执行的起始点,可以包含一个程序或者表单。当用户运行应用程序时,Visual FoxPro 将为应用程序启动主文件,然后主文件再依次调用所需要的应用程序其他组件。所有应用程序必须包含一个主文件。一般来讲,最好的方法是为应用程序建立一个主程序。但是,使用一个表单作为主程序,可以将主程序的功能和初始的用户界面集成在一起。

如果使用应用程序向导建立应用程序,可让向导替您建立一个主文件程序。您无须自己专门来做,除非在向导完成之后,自己想改变主文件。

若要设置应用程序的起始点

  1. “项目管理器”中,选择要设置为主文件的文件。

  2. 从“项目”菜单中选择“设置主文件”命令。

    注意 应用程序的主文件自动设置为“包含”。这样,在编译完应用程序之后,该文件作为只读文件处理。

项目中仅有一个文件可以设置为主文件。主文件用下图所示的符号表示。

在“项目管理器”中设置一个主文件

初始化环境

主文件或者主应用程序对象必须做的第一件事情就是对应用程序的环境进行初始化。在打开 Visual FoxPro 时,默认的 Visual FoxPro 开发环境将建立 SET 命令和系统变量的值。但是,对应用程序来说,这些值并非最合适。

提示 如果要查看 Visual FoxPro 开发环境的默认值,在没有配置文件的情况下键入 VFP -C 命令启动 Visual FoxPro,再执行 DISPLAY STATUS 命令。

对于您的应用程序来说,初始化环境的理想方法是将初始的环境设置保存起来,在启动代码中为程序建立特定的环境设置。

若要从当前环境中截取命令

  1. 从“工具”菜单中,选择“选项”。

  2. 按下 Shift 键并选择“确定”,在“命令”窗口中显示环境的 SET 命令。

  3. 从“命令”窗口中,将命令复制和粘贴到程序中。

在一个应用程序特定的环境下,可能需要使用代码以执行以下操作:

例如,如果要测试 SET TALK 命令的默认值,同时保存该值,并将应用程序的 TALK 设为 OFF,可以在启动过程中包含如下的代码:

IF SET('TALK') = "ON"
   SET TALK OFF
   cTalkVal = "ON"
ELSE
   cTalkVal = "OFF"
ENDIF

如果要在应用程序退出时恢复默认的设置值,一个好的方法是把这些值保存在公有变量、用户自定义类或者应用程序对象的属性中。

SET TALK &cTalkVal

显示初始的用户界面

初始的用户界面可以是个菜单,也可以是一个表单或其他的用户组件。通常,在显示已打开的菜单或表单之前,应用程序会出现一个启动屏幕或注册对话框。

在主程序中,可以使用 DO 命令运行一个菜单,或者使用 DO FORM 命令运行一个表单以初始化用户界面。

控制事件循环

应用程序的环境建立之后,将显示出初始的用户界面,这时,需要建立一个事件循环来等待用户的交互动作。

若要控制事件循环

从执行 READ EVENTS 命令开始,到相应的 CLEAR EVENTS 命令执行期间,由于主文件中所有的处理过程全部挂起,因此将 READ EVENTS 命令正确地放在主文件中十分重要。例如,在一个初始过程中,可以将 READ EVENTS 作为最后一个命令,在初始化环境并显示了用户界面后执行。如果在初始过程中没有 READ EVENTS 命令,应用程序运行后将返回到操作系统中。

在启动了事件循环之后,应用程序将处在所有最后显示的用户界面元素控制之下。例如,如果在主文件中执行下面的两个命令,应用程序将显示表单 Startup.scx:

DO FORM STARTUP.SCX
READ EVENTS

如果在主文件中没有包含 READ EVENTS 或等价的命令,在开发环境的“命令”窗口中,可以正确地运行应用程序。但是,如果要在菜单或者主屏幕中运行应用程序,程序将显示片刻,然后退出。

应用程序必须提供一种方法来结束事件循环。

若要结束事件循环

典型情况下,可以使用一个菜单项或表单上的按钮执行 CLEAR EVENTS 命令。CLEAR EVENTS 命令将挂起 Visual FoxPro 的事件处理过程,同时将控制权返回给执行 READ EVENTS 命令并开始事件循环的程序。

如果要查看一个简单的程序示例,请参阅本章稍后的“将一个程序结构化为主文件”

注意 在启动事件循环之前,需要建立一个方法来退出事件循环。必须确认在界面中存在一个可执行 CLEAR EVENTS 命令的机制(例如一个“退出”按钮或者菜单命令)。

恢复初始的开发环境

如要恢复储存的变量的初始值,可以将它们宏替换为原始的 SET 命令。例如,如要在公有变量 cTalkVal 中保存 SET TALK 设置,请执行下面的命令:

SET TALK &cTalkval

注释 用宏替换时使用的变量名不要以“m.”作为前缀,因为句号会被理解为变量连接,并产生一个语法错误。

如果初始化时使用的程序和恢复时使用的程序不同(例如,如果调用了一个过程进行初始化,而调用另外一个过程恢复环境),这时,确保可以对存储的值进行访问。例如,在公有变量、用户自定义类或应用程序对象的属性中保存值,以便恢复环境时使用。

将程序组织为一个主文件

如果在应用程序中使用一个程序文件 (.prg) 作为主文件,必须保证该程序中包含一些必要的命令,这些命令可控制与应用程序的主要任务相关的任务。在主文件中,没有必要直接包含执行所有任务的命令。例如,常用的一些方法是调用过程或者函数来控制某些任务,例如环境初始化和清除等。

注释 如果使用了“应用程序向导”,同时让它建立了程序 MAIN.PRG,那么就没有必要再建立一个新程序,只须对该程序做些修改即可。该向导使用了一个特殊的类为该应用程序定义一个对象,主程序中包括对对象进行示例和对象配置的部分。

若要建立一个简单的主程序

  1. 通过打开数据库、变量声明等初始化环境。

  2. 调用一个菜单或表单来建立初始的用户界面。

  3. 执行 READ EVENTS 命令来建立事件循环。

  4. 从一个菜单中(如;退出)执行 CLEAR EVENTS 命令,或者执行一个表单按钮(如“退出”命令按钮)。主程序不应执行此命令。

  5. 应用程序退出时,恢复环境。

例如,您的主程序可以如下所示:

代码 注释
DO SETUP.PRG
调用程序建立环境设置(在公有变量中保存值)
DO MAINMENU.MPR
将菜单作为初始的用户界面显示
READ EVENTS
建立事件循环。另外一个程序(如 Mainmenu.mpr)必须可执行一个 CLEAR EVENTS 命令
DO CLEANUP.PRG
在退出之前,恢复环境设置

将文件加入到项目中

一个 Visual FoxPro 项目包含若干独立的组件,这些组件作为单独的文件保存。例如,一个简单的项目可以包括表单(.scx 文件)、报表(.frx 文件)和程序(.prg 和 .fxp 文件)。除此之外,一个项目经常包含一个或者多个数据库(.dbc 文件)、表(保存在 .dbf 和 .fpf 文件中)及索引(.cdx 和 .idx 文件)。一个文件若要被包含在一个应用程序中,必须添加到项目中。这样,在编译应用程序时,Visual FoxPro 会在最终的产品中将该文件作为组件包含进来。

下面的几种方法,可以很方便地向一个项目添加文件:

如果使用的是“应用程序向导”或者“项目管理器”新建文件,可以省略许多的工作:文件会自动添加到项目中。但是有一个例外,如果应用程序中包含将被用户修改的文件,必须将该文件标为“排除”,因为“包含”文件是只读的。详细内容,请参阅本章稍后的“引用可修改的文件”

提示 有关 Visual FoxPro 中文件类型和扩展名的详细内容,请参阅“文件扩展名与文件类型”

如果某个现有文件不是项目的一部分,可以人工添加它。

若要人工添加文件到某一项目中

  1. “项目管理器”中,选择“添加”按钮。

  2. 在“添加”对话框中,选择要添加的文件。

如果在一个程序中或者表单中引用了某些文件,那么 Visual FoxPro 会将它们添加到项目中。例如,在一个项目中,如果某程序包含了如下的命令,那么 Visual FoxPro 会将 Orders.scx 文件添加到项目中:

DO FORM ORDERS.SCX

如果使用这种方法引用一个文件,该文件不会马上包含在项目中。当连编此项目时,Visual FoxPro 将分析对所有文件的引用,并自动把所有的隐式文件包含在项目中。此外在一个新的文件中,如果通过用户自定义的代码引用任何一个其他文件,项目连编也会分析所有包含及引用的文件。在下一次查看该项目时,引用的文件会出现在“项目管理器”中。

重要内容 “项目管理器”可能解决不了对图片(.bmp 或 .msk)文件的引用,这取决于在代码中如何使用图片文件。可能需要将这些文件手工添加到项目中。而且也不能自动包含那些用“宏替换”进行引用的文件,因为在应用程序运行之前,不知道该文件的名字。如果应用程序要引用“宏替换”的文件,请手工包含这些引用文件。

引用可修改的文件

当要将一个项目编译成一个应用程序时,所有项目包含的文件将组合为一个单一的应用程序文件。在项目连编之后,那些在项目中标记为“包含”的文件变为只读。

那些作为项目一部分的文件(如表)可能经常会被用户修改。在这种情况下,应该将这些文件添加到项目中,并将文件标为“排除”。排除文件仍然是应用程序的一部分,因此 Visual FoxPro 仍可跟踪,将它们看成项目的一部分。但是这些文件没有在应用程序的文件中编译,所以用户可以更新它们。

注释 Visual FoxPro 假设表在应用程序中可以被修改,所以默认表为“排除”。

作为通用的准则,包含可执行程序(如表单、报表、查询、菜单和程序)的文件应该在应用程序文件中为“包含”,而数据文件则为“排除”。但是,可以根据应用程序的需要包含或排除文件。例如,一个文件如果包含敏感的系统信息或者包含只用来查询的信息,那么该文件可以在应用程序文件中设为“包含”,以免不留心进行更改。反过来,如果应用程序允许用户动态更改一个报表,那么可将该报表设为“排除”。

如果将一个文件设为排除,必须保证 Visual FoxPro 在运行应用程序时能够找到该文件。例如,当一个表单引用了一个可视的类库,表单会存储此类库的相对路径。如果在项目中包含该库,则该库将成为项目的一部分,而且表单总能找到该库。但是,如果在项目中将该库排除,表单会使用相对路径或者 Visual FoxPro 的搜索路径(使用 SET PATH 命令来设置的路径)查找该库。如果此库不在期望的位置时(例如,如果在建立表单之后把类库移动了),Visual FoxPro 会显示一个对话框来询问用户指定库的位置(也许您不想让用户看到该对话框),为安全起见,可以将所有不需要用户更新的文件设为包含。

注释 应用程序文件(.app)不能设为包含,对于类库文件(.ocx、.fll 和 .dll)可以有选择的设为排除。

若要排除可修改文件

  1. “项目管理器”中,选择可修改文件。

  2. 从“项目”菜单中,选择“排除”选项。

    如果已经排除了该文件,“排除”选项将不可用,“包含”选项将取而代之。

排除的文件在其文件名左边有排除符号。

注释 标记为主文件的文件不能排除。有关主文件的详细内容,请参阅本章前面的“设置起始点”

项目中有排除标志的表

提示 若要一次性查看所有的项目文件,可从“项目”菜单中选择“项目信息”,然后选取“文件”选项卡。

为一个项目创建应用程序

编译一个项目的最后一步是连编它。此过程的最终结果是将所有在项目中引用的文件(除了那些标记为排除的文件)合成为一个应用程序文件。可以将应用程序文件和数据文件(以及其他排除的项目文件)一起发布给用户,用户可运行该应用程序。

从项目建立应用程序的具体步骤如下:

测试项目

为了对程序中的引用进行校验,同时检查所有的程序组件是否可用,可以对项目进行测试。要想这样做,需要重新连编项目,这样 Visual FoxPro 会分析文件的引用,然后重新编译过期的文件。

若要测试一个项目

  1. “项目管理器”中,选择“连编”。

  2. “连编选项”对话框中,选择“重新连编项目”。

  3. 选择任意所需的其他选项,选择“确定”。

    – 或者 –

例如,为了连编一个名字为 MYPROJ.PJX 的项目,请键入:

BUILD PROJECT myproj

如果在连编过程中发生错误,这些错误会集中收集在当前目录的一个文件中,名字为项目的名称,扩展名为 .err。编译错误的数量显示在状态栏中,也可以立刻查看错误文件。

若要立刻显示错误文件

当成功地连编项目之后,在建立应用程序之前应该试着运行该项目。

若要运行应用程序

如果程序运行正确,可以开始连编成一个应用程序文件,该文件会包括项目中所有“包含”文件。

当向项目中添加组件时,应该重复项目的连编和运行。如果没有在“连编选项”对话框中选择“重新编译全部文件”,那么只重新编译上次连编后修改过的文件。

从项目中连编应用程序

若要从应用程序建立一个最终的文件,需要将它连编为一个应用程序文件,该文件带有 .app 的扩展名。若要运行该应用程序,用户需首先启动 Visual FoxPro,然后加载该 .app 文件。

从一个项目中,可以建立应用程序文件 (.app) 或者可执行文件 (.exe)。如果用户有一个完整的 Visual FoxPro 副本,则可以运行一个 .app 文件。另外一个选择方案是建立一个可执行文件。该可执行文件需要和两个 Visual FoxPro 动态连接库 (Vfp6r.dll 和 Vfp6enu.dll) 连接,这两个库和应用程序一起构成了 Visual FoxPro 所需的完整运行环境。VFPxxx.DLL指定用于应用程序开发的地区版本。有关详细内容,请参阅第八部分“发布应用程序”

若要连编一个应用程序

  1. 在“项目管理器”中,选择“连编”按钮。

  2. “连编选项”对话框中,选择“连编应用程序”,生成 .app 文件;或者“连编可执行文件”以建立一个 .exe 文件。

  3. 选择所需的其他选项并选择“确定”按钮。

    - 或者 -

例如,若要从项目 Myproj.pjx 连编得到一个应用程序 Myapp.app,可键入:

BUILD APP myapp FROM myproj

如果要从一个名字为 MYPROJ.PJX 的项目文件中建立一个可执行的应用程序 MYAPP.EXE,请键入:

BUILD EXE myapp FROM myproj

注释 使用“连编”对话框,可以从您的 Visual FoxPro 应用程序中建立一个自动服务程序(Automation Server)。有关详细内容,请参阅十六章“添加 OLE”中的“创建自动服务程序”部分。

当为项目建立了一个最终的应用程序文件之后,用户就可运行它了。

若要运行 .app 应用程序

如果从应用程序中建立了一个 .exe 文件,用户可以使用如下几种方法运行该文件:

若要运行一个 .exe 应用程序文件