第三十一章:互操作性和 Internet

Microsoft Visual FoxPro 6.0 现在支持 OLE 拖放,您可以在 Visual FoxPro 和其他应用程序之间、以及在 Visual FoxPro 应用程序内部移动数据。

使用 Visual FoxPro 6.0 可以很容易地创建与 Internet 一起使用的应用程序,也使得创建与其他基于 Windows 应用程序(如 Microsoft Excel 和 Microsoft Visual Basic)一起使用的应用程序变得很容易。使用 Visual FoxPro 6.0 可以创建由 Active Document 宿主程序(如 Internet 浏览器)所包容的 Active Document

在Visual FoxPro 6.0 中,自动服务程序(Automation Server)的功能得到了改进,使得同 Internet、Microsoft Transaction Server 和 Active Desktop 的工作更加协调有效。

本章的主要内容∶

OLE 拖放

Visual FoxPro 现在支持 OLE 拖放,使用这种强大且实用的工具,可以在其他支持 OLE 拖放的应用程序之间移动数据(例如 Visual FoxPro、Visual Basic、Windows Explorer、Microsoft Word 和 Excel,等等)。在被发布的 Visual FoxPro 应用程序中,可以在应用程序的控件之间、或在控件与其他支持 OLE 拖放的应用程序之间移动数据。

请注意,早期版本的 Visual FoxPro 支持编程方式的控件拖放功能,这样可以在表单上移动控件。Visual FoxPro 6.0 仍然支持这种形式的拖放。但是,如果需要在应用程序中支持拖放,只能选择编程方式的控件拖放,或者 OLE 拖放,但不支持混合使用这两种拖放。

深入了解一些 OLE 拖放应用程序的基本知识,可以充分利用其功能。

拖放数据

使用鼠标可以在应用程序和控件之间拖放数据。例如,可以在 Windows Explorer 中选择一组文件,然后按住鼠标按键拖动这些文件,并在 Visual FoxPro“项目管理器”上释放鼠标放落这些文件,或者可以在 Word 文档中选中一些文本,并将这些文本放落到 Visual FoxPro 表单的一个文本框中。在 OLE 拖放操作过程中,鼠标指针将改变以表明正在进行 OLE 拖放操作。

拖动源

从其中移动数据的应用程序或控件统称为拖动源

拖动源属性、事件和方法程序

下表列出了一个 OLE 拖动源可用的属性、事件和方法程序。

属性、事件或方法程序 说明
OLECompleteDrag 事件 在数据放落到目标上或取消 OLE 拖放操作时发生。
OLEDrag 方法程序 开始一次 OLE 拖放操作。
OLEDragPicture 属性 指定在 OLE 拖放操作过程中,在鼠标指针下显示的图片。可以指定 .bmp、.dib、.jpg、.gif、.ani、.cur 和 .ico 等图片文件类型。
OLEDragMode 属性 指定拖动源管理 OLE 拖动操作的方式。
OLEGiveFeedBack 事件 在每次 OLEDragOver 事件之后发生。允许拖动源指定 OLE 拖放操作和可视化反馈的类型。
OLESetData 事件 在放落目标调用 GetData 方法程序,而 OLE 拖放 DataObject 中没有指定格式的数据时发生。
OLEStartDrag 事件 在调用 OLEDrag 方法程序时发生。

放落目标

拖放操作可以将数据移动到的应用程序或控件,该应用程序或控件称为放落目标

放落目标的属性和事件

下表列出了一个 OLE 放落目标可用的属性、事件和方法程序。

属性或事件 说明
OLEDragDrop 事件 当数据放落到目标,并且放落目标的 OLEDropMode 属性设置为 1 – 启用 时发生。
OLEDragOver 事件 当数据拖动到放落目标,并且放落目标的 OLEDropMode 属性设置为 1 – 启用 时发生。
OLEDropEffects 属性 指定 OLE 放落目标支持的放落操作类型。
OLEDropHasData 属性 指定如何管理放落操作。
OLEDropMode 属性 指定放落目标管理 OLE 放落操作的方式。

移动数据

使用默认鼠标(左)键进行拖放操作来移动数据,请首先在拖动源中选中需要移动的数据。选中数据后,在将鼠标指针移动到放落目标的过程中按住鼠标键,然后在放落目标上释放鼠标键,将数据放落到目标上。在 OLE 拖放操作过程中,鼠标指针将改变以表明正在进行 OLE 拖放操作。

也可以在拖动源的数据上单击非默认鼠标(右)键,并将数据拖动到某个放落目标上执行数据的拖放操作。根据放落目标的不同,在放落目标上放落数据时将显示一个相关菜单,该相关菜单包含一组选项,用来选择放落目标处理数据的方式。

复制数据

也可以在拖动源中复制数据,并将数据粘贴到放落目标中。在拖动源中选中的数据上拖动鼠标时,按住 Ctrl 键,鼠标指针显示为一个加号 (+),表明正在进行一次复制操作。

放落目标和拖动源不支持 OLE 拖放

只有当拖动源和放落目标都支持 OLE 拖放时,才能从拖动源移动或复制数据。请注意,有时虽然放落目标支持 OLE 拖放,但不一定接受试图放落的数据,例如,放落目标可能不支持移动或复制的数据格式。在拖放操作过程中,如果鼠标指针变成“不允许放落”的符号(一个带横线的圈),表明鼠标正位于应用程序或控件中不能放落数据的区域。

取消操作

在操作过程中按 ESC 键可取消 OLE 拖放操作。

对设计时刻的 OLE 拖放的支持

Visual FoxPro 支持设计时刻的 OLE 拖放,这使得用户可以比早期版本更快捷地开发应用程序。使用 OLE 拖放可以很容易地将文件从 Windows“资源管理器”放落到“项目管理器”和 Visual FoxPro 设计器中。同样,也可以很容易地将文本从其他应用程序移动或复制到“命令”窗口、Visual FoxPro 文本编辑器以及“属性”窗口中。

下表列出了 Visual FoxPro 支持的设计时刻的 OLE 拖放功能以及对这种支持的说明。

界面项 说明
“命令”窗口 文件的放落目标,文本的拖动源和放落目标。

如果将在 Visual FoxPro 中创建的文件放落到“命令”窗口,将使用相应的 Visual FoxPro 命令打开该文件。例如,如果将一个数据库放落到“命令”窗口,Visual FoxPro 将发出 OPEN DATABASE 和 MODIFY DATABASE 命令打开该文件以对其进行修改。如果将一张表放落到“命令”窗口中,将使用 USE … AGAIN 和 BROWSE 命令打开该表。如果 SET EXCLUSIVE 为 ON,该表为独占使用打开。如果 SET EXCLUSIVE 为 OFF,该表为共享使用打开。

拖放可以使用相应的 MODIFY 命令打开其他 Visual FoxPro 文件 — 使用 MODIFY FORM 命令打开表单,使用 MODIFY QUERY 命令打开查询,使用 MODIFY FILE 命令打开文本和表头 (.H) 文件,等等。

如果将一个在其他应用程序中创建的文件放落到“命令”窗口,将使用相关的应用程序打开该文件。例如,将一个 Microsoft Excel 电子表格放落到“命令”窗口中,将启动 Excel 并打开该电子表格。

项目管理器 文件的放落目标。

根据文件扩展名的不同,文件将被添加到相应的“项目管理器”分类中。如果将一个文件放落到“项目管理器”中,而 Visual FoxPro 不能识别该文件的扩展名,则该文件将被添加到“其他”分类中。

如果将数据库中的一张表放落到“项目管理器”中,该数据库将被添加到“数据”项的“数据库”分类中,并且被标记为“排除”。如果将一张自由表放落到“项目管理器”中,该表将被添加到“数据”项的“自由表”分类中,并且标记为“排除”。如果将一个数据库放落到“项目管理器”中,该数据库添加到“数据”项的“数据库”分类中,并且标记为“排除”。

虽然 OLE 拖放功能可以较容易地将文件添加到“项目管理器”中,但请记住在连编项目时,“项目管理器”将自动向项目中添加任何与其相关的文件。例如,如果添加到项目中的一个程序需要执行另一个程序,在连编项目时,系统将自动向项目中添加该程序,因此没有必要人工地向项目中添加第二个程序。

文本编辑器 文本的拖动源和放落目标。

文本编辑器包括使用 MODIFY COMMAND、MODIFY FILE 和 MODIFY MEMO 命令打开的编辑窗口、“命令”窗口,表单、类、菜单和“数据环境设计器”中的代码片段编辑窗口以及“数据库设计器”中的存储过程编辑器。

Visual Foxpro调试器 文本的拖动源和放落目标。

“监视”窗口的文本框和“名称”列表是文本的拖动源和放落目标。“跟踪”窗口和“调试输出”窗口是文本的拖动源。

数据库设计器 文件的放落目标。

向“数据库设计器”放落一张表,会将该表添加到当前数据库中。

类设计器 文本和文件的放落目标。

默认情况下,向“类设计器”中的一个容器对象中放落文本,将创建标签,并使用该文本作为其 Caption 的属性值。在“选项”对话框的“字段映象”选项卡中,可以改变向“表单设计器”中放落文本时创建的默认控件。

如果向非容器控件(复选框、命令按钮、标头、标签或选项按钮控件)中放落文本,则该控件的 Caption 属性将被设置为该文本。

向“类设计器”中放落一个图形文件(.ani、.bmp、.cur、.gif、.ico 或 .jpg),将创建图象控件,其 Picture 属性值设置为该图形文件名。

数据环境设计器 文件的放落目标。

将表放落到“数据环境设计器”中,会将该表添加到数据环境中。将数据库放落到“数据环境设计器”中,将显示“添加表或视图”对话框,在此可以向数据环境中添加表或视图。

查询设计器 文件的放落目标。

将表放落到“查询设计器”中,会将该表添加到查询中。将数据库放落到“查询设计器”中,会显示“添加表或视图”对话框,在此可以向查询中添加表或视图。

视图设计器 文件的放落目标。

将表放落“视图设计器”中,会将该表添加到视图中。将数据库放落到“视图设计器”中,会显示“添加表或视图”对话框,在此可以向视图中添加表或视图。

“属性”窗口 文本的拖动源和放落目标。

如果选择设计时刻属性,可以在“属性”窗口上部的文本框中放落文本。

组件管理库 文件的拖动源和放落目标。

可以从“组件管理库”中将对象拖走,将其放落到“表单设计器”中。也可以从“组件管理库”中将文件拖走,并将其放落到“项目管理器”中。

也可以将文件放落到“组件管理库”中。


对运行时刻的 OLE 拖放的支持

Visual FoxPro 控件和文本编辑器支持运行时刻的 OLE 拖放。控件和文本编辑器在运行时刻交互地支持 OLE 拖放,并且控件提供运行时刻的编程支持。DataObject 对象 为控件提供了编程的 OLE 拖放支持。

Visual FoxPro 控件有两种 OLE 拖放模式∶固有模式(Intrinsic mode)和人工模式。在固有模式中,Visual FoxPro 按照固有方式处理 OLE 拖放操作。在人工模式中,可以通过编程来处理 OLE 拖放操作。发生的事件由 OLE 拖放模式决定。详细内容,请参阅“固有和人工 OLE 拖放模式”部分。

早期版本 Visual FoxPro 中的拖放

早期版本的 Visual FoxPro 支持控件的编程拖放,这样可以在表单上移动控件。当前的版本仍然支持这种拖放形式。如果使用 OLEDragMode 和 OLEDropMode 属性的默认设置,现有应用程序可以不经过任何变动而象以前一样运行。

DataObject 对象

DataObject 对象是一个数据的容器,该容器内的数据从 OLE 拖动源转移到 OLE 放落目标,并且该对象只在 OLE 拖放操作过程中存在。不能通过编程来创建 DataObject 对象,当 OLE 拖放操作结束后,对它的引用将无效。在 OLEStartDrag、OLEDragOver、OLEDragDrop 和 OLESetData 事件中,DataObject 作为 oDataObject 参数进行传递。

DataObject 可以保存多组数据,每组数据可以有不同的格式。可使用 GetFormat 方法程序确定 DataObject 中数据存在的具体格式。有关 DataObject 所支持的格式的列表,请参阅 GetFormat 方法程序

DataObject 对象方法程序

使用 DataObject 对象的方法程序可以通过编程来管理拖放的数据。下表列出了 DataObject 运行时刻可用的方法程序。

方法程序 说明
ClearData 清除 OLE 拖放的 DataObject 对象中的所有数据和数据格式。
GetData 从 OLE 拖放的 DataObject 对象中获取数据。
GetFormat 确定 OLE 拖放的 DataObject 对象中数据的指定格式是否有效。
SetData 将数据及其格式放入 OLE 拖放的 DataObject 对象中。
SetFormat 仅将数据格式(没有数据)放入 OLE 拖放的 DataObject 对象中。

固有和人工 OLE 拖放模式

Visual FoxPro 支持控件的两种 OLE 拖放模式∶固有模式和人工模式。在固有模式中,Visual FoxPro 处理 OLE 拖放操作。而在人工模式中,可通过编程来处理 OLE 拖放操作。

固有的 OLE 拖放模式

可以在应用程序中使用固有的 OLE 拖放模式,以提供标准的 OLE 拖放支持,而无须另外编程。

若要对控件进行固有的 OLE 拖放支持

  1. 将控件的 OLEDragMode 属性设置为 1 – 自动,则该控件可以作为 OLE 拖动源。

  2. 将控件的 OLEDropMode 属性设置为 1 – 启用,则该控件可以作为 OLE 放落目标。

对于固有的 OLE 拖放操作,Visual FoxPro 确定放落目标是否支持将要放落在上面的数据格式;如果放落目标支持该格式,则可以放落,否则不允许放落。

下表列出了在固有模式下可以作为拖动源的 Visual FoxPro 控件及所支持的数据格式。请注意,CF_TEXT 是文本,就如向文本框中输入的文本,而 CFSTR_VFPSOURCEOBJECT 是对 Visual FoxPro 控件或对象的对象类型引用。对于下列支持 CF_TEXT 数据格式的控件,可以从控件的文本部分拖动文本。

拖动源的数据格式

控件 数据格式(在 Foxpro.h 文件中定义)
容器、图象、线条、页框和形状 CFSTR_VFPSOURCEOBJECT
命令按钮和标签 CFSTR_VFPSOURCEOBJECT 和 CF_TEXT
复选框、组合框、编辑框、列表框、微调控件和文本框 CFSTR_VFPSOURCEOBJECT、CF_TEXT 和 CFSTR_OLEVARIANT

下表列出了在固有模式中可以作为放落目标的 Visual FoxPro 控件及所支持的数据格式。对于下表中列出的控件,可以向控件的文本部分放落文本。文本将在插入点插入。

放落目标的数据格式

控件 数据格式
编辑框和组合框(当组合框的 Style 属性设置为 0 - 下拉组合框) CF_TEXT
微调控件和文本框 CFSTR_OLEVARIANT

人工 OLE 拖放模式

有时,可能需要控制放落目标上能够放落的数据类型,或者为拖放操作提供附加功能。例如,将数据转换成放落目标所支持的格式,或者显示一个对话框,询问用户是否确认将数据放落到目标上。这些情况下,需要覆盖固有的 OLE 拖放支持以更好地控制拖放操作。

为了实现对控件的人工 OLE 拖放支持,需要编写自己的事件或方法程序代码,来覆盖需要进行控制的拖放事件或方法程序。在事件或方法程序代码中包含 NODEFAULT 关键字,可以覆盖固有的 Visual FoxPro 拖放行为。

如果将 OLEDragMode 设置为 0(默认)、并且不另外编写 OLE 拖放代码时,将向后兼容现有的应用程序(不支持 OLE 拖动)。

Active Document

使用 Visual FoxPro 6.0 可以创建 Active Document,利用 Active Document 则可以在 Web 浏览器宿主程序、如 Microsoft Internet Explorer 中查看非 HTML 文档。因此,应用 Active Document 技术可以在一个 Active Document 宿主程序中查看多种类型的文档。

Active Document 是一种特别类型的 OLE 可嵌入文档,显示在 Active Document 宿主程序的整个客户区中,并且与宿主程序合并菜单。Active Document 具有完整的结构,并且总在现场激活。

下面是 Active Document 提供的一些功能∶

创建 Active Document

创建 Visual FoxPro Active Document 很容易。与其他任何 Visual FoxPro 应用程序一样,Visual FoxPro Active Document 可以管理数据、运行表单、报表和标签、实例化类,以及运行代码。

Visual FoxPro Active Document 是从 Visual FoxPro 项目中创建的应用程序 (.app)。使用早期版本的 Visual FoxPro 可以创建应用程序,所以用户对于如何创建应用程序应该很熟悉。有关创建应用程序的详细内容,请参阅《程序员指南》的第十三章“编译应用程序”

任何应用程序都可以在 Internet Explorer 中运行。但是,只有下述的基于 ActiveDoc 基类的应用程序,才支持那些提供与 Active Document 宿主程序进行通讯的属性、事件和方法程序。

ActiveDoc 基类

Visual FoxPro Active Document 与其他应用程序 (.app) 略有差别。最明显的差别是 Active Document 的“主文件("main" file)”,必须设置为一个基于 ActiveDoc 基类的类,而其他种类的应用程序则需要一个程序或表单作为主文件。

使用“类设计器”创建基于 ActiveDoc 基类的类,并且将其作为所有 Visual FoxPro Active Document 的基础。ActiveDoc 基类为 Active Document 提供属性、事件和方法程序,并且提供与 Active Document 宿主程序的通讯能力。例如,当 Active Document 被其宿主程序释放时,将发生 ContainerRelease 事件。可以在 ContainerRelease 事件中添加代码,以便在释放 Active Document 之前关闭文件、完成事务处理,并进行其他的清理工作。

若要将主文件设置为一个基于 ActiveDoc 基类的类

  1. 向项目中添加可视类库 (.vcx),该可视类库包含基于 ActiveDoc 基类的类。

  2. 单击可视类库 (.vcx) 名称左边的加号 (+),展开该类库。也可以在该库上单击鼠标右键,然后从快捷菜单中选择“全部展开”命令。

  3. 选中基于 ActiveDoc 基类的类。在该类上单击鼠标右键,然后从快捷菜单中选择“设置主文件”命令。

ActiveDoc 对象

当 Visual FoxPro Active Document 运行在 Internet Explorer 中时,将从 ActiveDoc 基类中创建 ActiveDoc 对象。该 ActiveDoc 对象响应调用 ActiveDoc 基类的事件和方法程序。

ActiveDoc 对象属性、事件和方法程序

下表列出了ActiveDoc 对象支持的属性、事件和方法程序。

属性

BaseClass Caption Class
ClassLibrary Comment ContainerReleaseType
Name Parent ParentClass
Tag

事件

CommandTargetExec CommandTargetQuery ContainerRelease
Destroy Error HideDoc
Init Run ShowDoc

方法程序

AddProperty ReadExpression ReadMethod
ResetToDefault SaveAsClass WriteExpression

Active Document 事件序列

在 Internet Explorer 中打开 Active Document 应用程序时,Active Document 将运行并且该 Active Document 的 Init 事件将发生,然后产生 Active Document 的 ShowDoc 事件。如果 Internet Explorer 成功地包容 Active Document,将产生 Active Document 的 Run 事件。一般情况下,Active Document 程序代码应该放在这个事件中。因此通常 Run 事件中包含有代码用来执行菜单代码、执行应用程序中的主表单,并包含 READ EVENTS 以启动事件进程,如标准的 Visual FoxPro 应用程序一样。

可以将初始化代码放在 Active Document 的 Init 事件中,但如果该代码需要很长的时间来执行,Active Document 容器可能会产生超时错误。因此,如果将初始化代码放在Init 事件中,则代码不能要求用户交互或者创建用户界面。

如果从 Active Document 离开,将生成 HideDoc 事件,当回到 Active Document 时,将生成 ShowDoc 事件。

如果在 Active Document 已被包容时关闭 Internet Explorer,将生成 HideDoc 事件,然后生成 ContainerRelease 事件。如果 Active Document 超出 Internet Explorer 3.0 的高速缓存,也将生成 ContainerRelease 事件。

生成 ContainerRelease 事件时,该事件中的程序代码将产生如下动作∶

注释 在 Internet Explorer 4.0 将要关闭或者离开 Active Document 时,将生成 CommandTargetExec 事件。在这种情况下,CommandTargetExec 事件的 nCommandID 参数被设置为 37,可以将 eArgOut 参数设置为假 (.F.),以防止 Internet Explorer 关闭 Active Document。Internet Explorer 3.0 不支持 CommandTargetExec 事件。

新的 Active Document 函数

在 Visual FoxPro 中,添加了两个新函数 GETHOST( )ISHOSTED( ),以提供有关 Active Document 宿主程序的信息。GETHOST( ) 返回 Active Document 宿主程序的对象引用;ISHOSTED( ) 返回一个逻辑值,表明 Active Document 是否被包容。

对表单对象的更改

Visual FoxPro Active Document 的用户界面由程序代码定义。通常情况下,Visual FoxPro 表单应该使用初始的用户界面。在 Visual FoxPro 中,添加了以下的表单属性、事件和方法程序,以使表单可以更好地与 Active Document 一起使用。

属性
AlwaysOnBottom ContinuousScroll HscrollSmallChange
Scrollbars TitleBar ViewPortHeight
ViewPortLeft ViewPortTop ViewPortWidth
VScrollSmallChange

事件
Scrolled

方法程序
SetViewPort

Active Document 中的表单

Active Document 中的表单显示在 Internet Explorer 提供的客户区。如果需要让表单充满 Internet Explorer 的客户区,可设置表单的下列属性∶

BorderStyle = 0 (无边框)
TitleBar = 0 (无)
WindowState = 2 (最大化)

另外,如果 Internet Explorer 的客户区比 Active Document 视口(View Point)(包含表单上所有控件的方块区域)小,必须显示滚动条时,Scrollbars 属性应该设置为下列值∶

ScrollBars = 3 (水平和垂直滚动条都有)

Active Document 中的菜单

在 Visual FoxPro Active Document 中运行菜单代码时,该菜单将按照具体的菜单合并规则与 Internet Explorer 的菜单合并。Active Document 菜单与 Internet Explorer 的菜单合并后,Active Document 菜单就象传统的 Visual FoxPro 应用程序中的菜单一样。

菜单融合

在 Visual FoxPro 6.0 和早期版本中,对 Visual FoxPro 表单中的 ActiveX 控件进行 OLE 可视化编辑时,可以指定菜单的融合方式。在 Visual FoxPro 6.0 中,改进了这种菜单融合方式,以控制 Active Document 的菜单在 Internet Explorer 中的出现位置。

当在 Internet Explorer 中打开 Active Document 时,它和 Internet Explorer 共享菜单区域并将各自的菜单合并在一起,即来自 Internet Explorer 的菜单与来自 Active Document 的菜单合并在一起。合并后的菜单分成六个组,每个组由 Internet Explorer 或 Active Document 分别拥有,或者共同拥有。

拥有者
文件组 Internet Explorer
编辑组 Active Document
容器组 Internet Explorer
对象组 Active Document
窗口组 Internet Explorer
帮助组 Active Document 或 Internet Explorer

帮助菜单的合并

Active Document 与 Internet Explorer 共享“帮助”菜单。如果 Internet Explorer 有一个“帮助”菜单,则 Active Document 可以将自己的“帮助”菜单添加到 Internet Explorer 的“帮助”菜单的末尾。

对于菜单融合的语言改进

已经增强了 DEFINE PAD NEGOTIATE 子句以指定如何融合 Active Document 中的菜单。新的第二选项 cObjectPosition 可以指定菜单标题在 Internet Explorer 菜单栏中的位置。

详细内容,请参阅《Language Reference》中的 DEFINE PAD

菜单融合和“菜单设计器”

经过改进的“菜单设计器”的“提示选项”对话框,可以对在“菜单设计器”中创建的菜单和 Active Document 中包含的菜单指定其菜单融合方式。同时,添加了一个“对象”下拉列表,该下拉列表可以指定 Internet Explorer 包容 Visual FoxPro Active Document 时菜单标题的融合方式。

菜单融合信息

菜单融合信息保存在 .mnx 菜单文件中的 Location 字段中。下表列出了该字段中的值,以及每个值对应的菜单融合类型。有关 cContainerPositioncObjectPosition 的详细内容,请参阅 DEFINE PAD

cContainerPosition cObjectPosition
0 None None
1 Left None
2 Middle None
3 Right None
4 None Left
5 Left Left
6 Middle Left
7 Right Left
8 None Middle
9 Left Middle
10 Middle Middle
11 Right Middle
12 None Right
13 Left Right
14 Middle Right
15 Right Right

请注意,在 Visual FoxPro 6.0 中,Location 字段的大小由一位数字增加到两位数字,这是在 Visual FoxPro 6.0 中对表文件的结构的唯一改动,包括数据库 (.dbc)、表单 (.scx)、标签 (.lbx)、项目 (.pjx)、报表 (.frx) 和可视类库 (.vcx) 中的表。

CommandTargetExec 和 CommandTargetQuery 事件

使用 Active Document 的CommandTargetExec 和 CommandTargetQuery 两个事件可以管理 Active Document 中 Internet Explorer 菜单的选择(以及其他 Internet Explorer 事件)。当 Internet Explorer 通知 Active Document 即将执行一个命令时(包括菜单命令)时,将产生 CommandTargetExec 事件。当 Internet Explorer 更新自身的用户界面时,将产生 CommandTargetQuery 事件。有关各事件的详细内容,请参阅《Language Reference》中的“CommandTargetExec Event”“CommandTargetQuery Event”

运行 Active Document

运行 Visual FoxPro Active Document 时,需要同时运行 Vfp6.exe 和 Vfp6run.exe 或 Vfp6run.exe、Vfp6r.dll 和 Vfp6renu.dll (enu 表明是英文版)。在安装了 Internet Explorer 的计算机上,必须安装和注册这些文件。安装 Visual FoxPro 时,Vfp6.exe 将安装在 Visual FoxPro 的目录下,其余文件则安装在 Windows 95 的 Windows\System 目录或 Windows NT 的 WinNT\System32 目录下。

通过“工具”菜单运行 Active Document

Visual FoxPro 的“工具”菜单包含“运行 Active Document”命令,选择该命令将显示“运行 Active Document”对话框。在这个对话框中,可以指定运行 Active Document 方式。有下列选项可用∶

选项 说明
在浏览器中(默认) 使用运行时刻的 Visual FoxPro,在 Internet Explorer 中运行 Active Document。
单独执行 使用运行时刻的 Visual FoxPro,将 Active Document 作为独立的应用程序运行。
在浏览器中(调试) 使用可执行的 Visual FoxPro (Vfp6.exe),在 Internet Explorer 中运行 Active Document。调试能力、“命令”窗口和 Visual FoxPro 开发环境的所有功能都可用。
单独执行(调试) 使用可执行的 Visual FoxPro (Vfp6.exe),将 Active Document 作为一个独立的应用程序运行。调试能力、命令窗口和 Visual FoxPro 开发环境的所有功能都可用。

选择这个选项与在“命令”窗口中发出 DO <Active Doc Name> 命令相同。


也可以通过 Internet Explorer 的“打开文件”对话框中打开 Active Document,或者从其他带有该 Active Document 的超级链接的网页定位,以运行 Active Document。

Visual FoxPro 运行时刻和 Active Document

在 Windows “资源管理器”中双击 Active Document 的图标将在 Visual FoxPro 中运行该 Active Document,也可以从 Visual FoxPro 运行时刻应用程序运行 Active Document。Visual FoxPro 运行时刻包含两个文件∶Vfp6run.exe 和 Vfp6r.dll。这两个文件都必须安装并且注册才能运行 Active Document。Visual FoxPro 运行时刻也可以用来运行其他 Visual FoxPro 可发布文件,如已编译好的 Visual FoxPro 程序(.fxp 文件)。

注册 Vfp6run.exe 之后,就可以用它来直接运行 Active Document(以及其他 Visual FoxPro 可发布文件)。

Vfp6run.exe 的语法

VFP6RUN [/embedding] [/regserver] [/unregserver] [/security]
[/s] [/version] [FileName]

参数

/embedding

将 Vfp6run.exe 加载为 Active Document 的服务程序。在这种模式下,Vfp6run.exe 注册为 COM 服务程序,能够创建 Visual FoxPro Active Document 对象 ("Visual.FoxPro.Application.6")。没有这个参数,Vfp6run.exe 将不能作为 COM 服务程序。

/regserver

注册 Vfp6run.exe。

/unregserver

撤消注册 Vfp6run.exe。

/security

显示“应用程序安全设置”对话框,可以为 Active Document 和其他应用程序 (.app) 文件指定安全设置。详细内容,请参阅下节的“Active Document 安全性”。

/s

信号不通。如果 Vfp6run.exe 不能加载 Vfp6r.dll 运行时刻组件,将产生错误。

/version

显示 Vfp6run.exe 和 Vfp6r.dll 的版本信息。

FileName

指定运行的 Visual FoxPro 文件。

Vfp6run.exe 需要安装和注册动态链接库 Vfp6r.dll 以提供运行时刻支持。注册 Vfp6r.dll,请运行如下命令∶

Regsvr32 Vfp6r.dll

Active Document 安全性

使用 Visual FoxPro 运行时刻 Vfp6run.exe 的 /security 选项可以为 Active Document 和其他应用程序 (.app) 文件设置安全等级。执行 Vfp6run.exe /security 将显示“应用程序安全性设置”对话框,在该对话框中可以为 Active Document 和其他 (.app) 文件设置安全等级。

在“应用程序安全性设置”对话框中可用以下选项∶

包容

可以为在诸如 Internet Explorer 等 Active Document 容器中运行的 Active Document 或应用程序 (.app) 选择这种应用程序模式设置来为其指定一个安全等级。

不包容

可以为在 Window“资源管理器”中通过双击图标、或用 Visual FoxPro 运行时刻 Vfp6run.exe 运行的 Active Document 或应用程序 (.app) 选择此应用程序模式设置,来为其指定一个安全等级。

高(最安全)

选择这种设置可以防止 Active Document 或应用程序 (.app) 的运行。

中(比较安全)

选择这种设置可以在运行 Active Document 或应用程序 (.app) 之前显示一个警告消息。对于非包容的 Active Document 和应用程序,“中”是默认设置。

低(不安全)

选择这种设置在运行 Active Document 或应用程序 (.app) 时,将不显示警告消息。对于包容的 Active Document 和应用程序,“低”是默认设置。

重置

将当前选定的应用程序模式(包容或不包容)重新设置为默认的安全等级。

确定

保存在对话框中选定的设置。

Internet Explorer 注意事项

为了提高性能,Internet Explorer 3.0 在内存中缓存了最后访问的四个网页。这意味着,一个 Active Document 可能会超出 Internet Explorer 3.0 的缓存,导致 ContainerRelease 事件的发生。而 Internet Explorer 4.0 没有对网页进行缓存,所以在离开 Active Document 时,将立即产生 ContainerRelease 事件。

Active Document 示例

Visual FoxPro Solution 示例应用程序中包括一个名为“Create Active Document for web”的示例,演示了许多 Active Document 特性。

若要运行 Solution 示例应用程序

  1. 从“程序”菜单中,选择“运行”。

  2. 选择 Samples\Vfp98\Solution 文件夹。

  3. 双击 Solution.app。

若要运行“Create Active Document for web”示例

  1. 启动 Solution.app 之后,双击“New Features for Visual FoxPro 6.0”。

  2. 单击“Create Active Document for web”,然后单击“Run Sample”按钮。

使用“Create Active Document for web”示例可以打开一个项目,其中包含在该项目中创建 Active Document 所需的所有文件。项目打开后,可以检查 Actdoc 类中的代码,以了解如何管理 Active Document 事件、以及如何运行表单。请注意,Actdoc 是基于 ActiveDoc 基类的类,是项目的主文件。一个 Active Document 必须有一个基于 ActiveDoc 基类的类作为主文件。

也可以通过在“项目管理器”中选择“连编”来连编一个 Active Document。Active Document 连编完成后,即可从“工具”菜单中选择“运行 Active Document”来运行该 Active Document。

自动服务程序的改进

本节描述对 Visual FoxPro 6.0 自动服务程序的改进,并且讨论 Visual FoxPro 自动服务程序如何与 Microsoft Transaction Server 和 Microsoft Visual Basic 等产品一起工作。

使用 Visual FoxPro 可以创建自动服务程序。自动服务程序是一个组件应用程序,一些功能以供其它应用程序通过自动服务程序的使用和重用例如,使用 Visual FoxPro 可以创建自动服务程序来显示可重复使用的表单、或将一个复杂例程打包进一个简单组件中以供其他程序员使用。另外,还可以创建一个或多个处理企业级商务规则的类,使用商务规则对象的客户应用程序将在方法程序调用中传递数据参数,然后自动服务程序即可做很多事情,如在返回答案之前,可以从各种源获取或存储数据并进行复杂的计算。

在 Visual FoxPro 中,可以创建一个进程外进程内的自动服务程序。进程外组件是一个有独立进程的可执行 (.exe) 文件。因此,客户应用程序和进程外服务程序之间的通讯被称为进程间通讯。进程内组件是一个动态链接库 (.dll) 文件,与调用的客户程序运行在相同的进程地址空间或运行在一个 Microsoft Transaction Server 进程中。

有关创建 Visual FoxPro 自动服务程序的详细内容,请参阅《程序员指南》第十六章的“创建自动服务程序”

Visual FoxPro 6.0 自动服务程序的改进

下面各节描述 Visual FoxPro 6.0 自动服务程序功能的改进。

套件模型线程

Visual FoxPro 自动服务程序现在支持套件模型线程。Microsoft Transaction Server 利用标记成线程化套件的服务程序提供了更好的线程保护和可测量性。

每个套件模型对象(如一个 Visual FoxPro 自动服务程序)只能通过一个线程进入,即创建了该对象的线程(如 Microsoft Visual C++ 中的 CoCreateInstance)。但是,一个对象服务程序(例如 Microsoft Transaction Server)可以支持多个对象,每个对象可以通过不同的线程同时进入。必须保护对象服务程序拥有的公有数据,以避免线程冲突造成的破坏。对象服务程序在被称为 CoCreateInstance 的同一个线程中创建一个套件模型对象。从套件线程中对该对象的调用是不按顺序进行的。

有关套件模型线程的详细内容,请在 MSDN Library 中搜索“Visual Basic 中的套件模型线程”。

用户界面和进程内服务程序

新的套件模型线程支持要求没有用户界面的进程内 .dll 自动服务程序。在 Visual FoxPro 5.0 中,可以创建(虽然不建议这样做)一个带有用户界面(例如表单)的进程内 .dll 自动服务程序,但因为不支持表单事件,该表单只能用于显示。而在 Visual FoxPro 6.0 中,在进程内 .dll 自动服务程序中创建用户界面时将产生错误。

进程外 .exe 自动服务程序可以有用户界面。Visual FoxPro 6.0 添加了一个新的函数 SYS(2335),可以用来关闭远程执行、无须用户干涉的进程外 .exe 自动服务程序的模型事件。模型事件由用户定义的模式表单、系统对话框、MESSAGEBOX( ) 函数和 WAIT 命令等创建。

早期 (vtable) 绑定

Visual FoxPro 6.0 现在支持早期 (vtable) 绑定和现有的 IDispatch 接口(称为双接口支持)。早期 (vtable) 绑定将提高对早期 (vtable) 绑定支持的自动服务控制器(如 Visual Basic 和 Microsoft Transaction Server)的性能,。

Visual FoxPro 运行时刻 Vfp6r.dll

一个 Visual FoxPro 6.0 运行时刻 Vfp6r.dll 不再为多种进程内 .dll 自动服务程序提供服务。每个进程内 .dll 现使用运行时刻 Vfp6r.dll 的独立实例。下列规则将决定进程内 .dll 如何使用运行时刻 Vfp6r.dll∶

类型库(Type Library)

现在,Visual FoxPro 6.0 在自动服务程序的类型库中支持固有的 (Visual FoxPro) 属性、事件和方法程序。类型库中只包含声明为 Public 的属性,没有保护和隐藏的属性。请注意,类型库中不包含 Visual FoxPro 的 Release 方法程序,因其已经是一个 COM 方法程序。

如果被标记为 PUBLIC,PUBLIC 的用户自定义属性和方法程序都可以出现在 Visual FoxPro 的类型库中。对于方法程序,Visual FoxPro 还包含一个基于原始的方法程序定义返回值类型(变量)和参数列表(变量)。

请注意,在 Visual FoxPro 6.0 中,类型库可以指定有单独的帮助文件。

异常处理

Visual FoxPro 自动服务程序现在更加强壮,因此当发生异常时,将可以使服务平稳地中止。如果 Visual FoxPro 6.0 的自动服务程序发生异常,自动服务程序将设置 COM ErrorInfo 对象(通过 IErrorInfo),并取消当前的方法程序。根据 COM ErrorInfo 对象中的信息(客户程序可以访问 COM ErrorInfo 对象),自动服务客户程序可以选择是释放 Visual FoxPro 自动服务程序,还是对异常情况进行处理。

Visual FoxPro 6.0 添加了一个新的函数 COMRETURNERROR( ),用来处理自动服务程序中发生的错误。COMRETURNERROR( ) 可以用在 Error 方法程序中,向在 COM 异常结构中加入信息,供自动服务客户程序确定自动服务程序中错误的来源。详细内容,请参阅《Language Reference》中的 COMRETURNERROR( )

传递数组

Visual FoxPro 5.0 按值向 COM 对象(例如在 Visual FoxPro、Visual Basic 或 Visual C 中创建的自动服务程序)传递数组;在调用一个方法程序之后,数组元素保持不变,并且 COM 对象的改动将不会传递到客户程序的元素中。这种限制妨碍了在 Visual FoxPro 5.0 和 COM 对象之间来回大量传递数据。

另外,传递到 COM 对象的数组假定为是从 1 开始记数的数组,也就是说,数组中的第一个元素、第一行和第一列是用 1 引用的(例如,Myarray[1])。但是,有些 COM 对象需要传递的数组是从 0 开始记数的(数组中的第一个元素、第一行和第一列是用 0 引用的,例如,Myarray[0])。

使用 Visual FoxPro 6.0 的新函数 COMARRAY( ) 可以指定如何向一个 COM 对象传递数组,并且可以指定该数组是基于 0 的还是基于 1 的。详细内容,请参阅《Language Reference》中的 COMARRAY( )

请注意,只有向 COM 对象传递数组时,才能按下列语法使用 COMARRAY( ) 函数∶

oComObject.method(@MyArray)

如果省略 @ 符号,只向 COM 对象传递数组的第一个元素,且 COMARRAY( ) 函数不起作用。这与早期版本的 Visual FoxPro 一样。

从项目中连编 .dll 和 .exe 文件

由于进程内 .dll 和进程外 .exe 自动服务程序是通过类的实例来激活的,因此没有必要为其指定主文件。在 Visual FoxPro 6.0 中,可以不必先在“项目管理器”中指定主文件,即能连编进程内 .dll 或进程外 .exe 自动服务程序。

语言

下表列出了 Visual FoxPro 6.0 新增的属性和函数,这些属性和函数使得管理自动服务客户程序和服务程序变得更容易。详细内容,请查看各个主题。

服务程序语言的改进 说明
COMARRAY( ) 函数 指定如何向 COM 对象传递数组。
COMCLASSINFO( ) 函数 返回 COM 对象(例如一个 Visual FoxPro 自动服务程序)的注册信息。
CREATEOBJECTEX( ) 函数 在远程计算机上创建已注册的 COM 对象(例如一个 Visual FoxPro 自动服务程序)的一个实例。对于一个 Visual FoxPro 进程内 .dll,可以使用 Microsoft Transaction Server 在远程计算机上创建其实例。
COMRETURNERROR( ) 函数 在 COM 异常结构中加入信息,自动服务客户程序可以利用该信息确定自动服务程序中错误的来源。
ServerName 属性 包含自动服务程序的完整路径和文件名。ServerName 属性是该应用程序对象的一个属性。
StartMode 属性 包含一个数字,表明如何启动 Visual FoxPro 的实例。
SYS(2334) – 自动服务程序激活模式 返回一个值,表明 Visual FoxPro 自动服务程序的方法程序激活的方式。
SYS(2335) – 无人照管服务模式 启动或终止对一个可发布的 Visual FoxPro .exe 自动服务程序模式状态的支持。

自动服务程序编程的注意事项

下面提供了有关自动服务程序附加的编程信息。

Application 对象

在自动服务程序的类型库中,没有 Application 对象。这将妨碍对 Application 对象 DoCmdEval 方法程序的访问,而这两个方法程序可以提供对整个 Visual FoxPro 语言的访问。如果需要访问 Application 对象,可以创建一个自定义属性,将属性的值设为 Application 对象,也可以提供一个访问 Application 对象的方法程序。

自动服务程序示例

Visual FoxPro 6.0 包含了两个 ISAPI 自动服务程序示例∶FoxWeb 和 FoxIS。这些示例可以将选中的 Visual FoxPro 记录作为 HTML 发送到一个 Internet 浏览器。有关这些示例的详细内容,请参阅“FoxISAPI 自动服务程序示例”