VFP绑定word事件,让自动化处理更容易

VFP绑定word事件,让自动化处理更容易_第1张图片

与 VFPCOM 通信事件

书中,我们专注于告诉服务器该怎么做。与服务器的通信采用调用方法和设置属性的形式;来自服务器的通信采用 VFP 的形式,启动属性查询或从方法调用获取返回值。沟通似乎有点不平衡,需要 VFP 开始所有对话。与 COM (ActiveX) 控件相比,这似乎很奇怪,后者可以通过事件代码与 VFP 通信。

虽然 FoxPro 可以查看和处理 ActiveX 控件引发的事件,但它看不到使用 CreateObject() 函数创建的对象引发的任何事件。 这可能会导致一些尴尬的问题,例如让 VFP 处于循环中等待服务器的状态更改,或者调用服务器并离开 VFP 屏幕并显示一条消息,“完成后按此按钮”。相比之下,Visual Basic 有一个 WITH EVENTS 构造,该构造允许 VB 调用的服务器中的事件在 VB 中触发代码。在 VFP 6.0 发布后不久,Microsoft的向导们想出了一个名为 VFPCOM 的 COM 控件来解决这个问题。VFPCOM 将服务器的事件绑定到您创建的事件处理程序对象,该对象具有与服务器对象的事件同名的方法。当 Word 引发其 DocumentBeforeClose 事件时,VFPCOM 会在您创建的事件处理程序对象中查找 DocumentBeforeClose 方法。

正在获取 VFPCOM.DLL

你需要从Microsoft的网站获取VFPCOM,在 msdn.microsoft.com/vfoxpro。点击指向“产品更新”页面的链接(在撰写本文时,该页面位于主页上的“示例和下载”下)。然后选择要下载的 VFPCOM 实用程序。它大约是156KB。将 VFPCOM.EXE 文件保存到磁盘。当您在网站上时,请确保保存或打印自述文件,该文件不包括在 EXE 中。

当您运行 VFPCOM .EXE 进行安装时,它会将 DLL 及其示例文件放在 VFP 主目录下的 \VFPCOM 目录中(除非您另行指定)。它还注册 DLL。

使用VFPCOM.DLL

使用 VFPCOM 的第一步是创建对象引用。在 CreateObject() 函数中使用类名,如下所示:

oVFPCOM = CreateObject(“vfpcom.comutil”)

要使用 VFPCOM,您还需要对 Office 服务器的引用。对于示例,我们将使用 Word(如果您正在以交互方式尝试此操作,请帮自己一个忙并使其可见,这样您就不会孤立服务器的不可见实例):

oWord = CreateObject(“Word.Application”)

oWord.Visible = .T.

VFPCOM 服务器有五种方法,但只有两种对我们很重要:ExportEvents 和 BindEvents。ExportEvents 方法为以下问题提供了答案:“但是,如何找到要写入该事件处理程序对象的事件的所有名称?ExportEvents 不仅提取事件的名称,还创建一个保存整个类定义的程序文件!哇!该方法采用两个参数:第一个是要导出其事件的对象引用,第二个是要将所有这些写入的文件名。假设您已经创建了 oVFPCOM 和 oWord(如前所示),请像这样创建文件 WordEvents.PRG:

oVFPCOM.ExportEvents(oWord, “WordEvents.PRG”)

然后,像魔术一样,文件WordEvents.PRG包含以下内容:

DEFINE CLASS ApplicationEvents2 AS custom


PROCEDURE DocumentBeforeClose(Doc,Cancel)


* Add user code here


ENDPROC


PROCEDURE DocumentBeforePrint(Doc,Cancel)


* Add user code here


ENDPROC


PROCEDURE DocumentBeforeSave(Doc,SaveAsUI,Cancel)


* Add user code here


ENDPROC


PROCEDURE DocumentChange


* Add user code here


ENDPROC


PROCEDURE DocumentOpen(Doc)


* Add user code here


ENDPROC


PROCEDURE NewDocument(Doc)


* Add user code here


ENDPROC


PROCEDURE Quit


* Add user code here


ENDPROC


PROCEDURE WindowActivate(Doc,Wn)


* Add user code here


ENDPROC


PROCEDURE WindowBeforeDoubleClick(Sel,Cancel)


* Add user code here


ENDPROC


PROCEDURE WindowBeforeRightClick(Sel,Cancel)


* Add user code here


ENDPROC


PROCEDURE WindowDeactivate(Doc,Wn)


* Add user code here


ENDPROC


PROCEDURE WindowSelectionChange(Sel)


* Add user code here


ENDPROC


ENDDEFINE

很酷,不是吗?只需将类的名称从 ApplicationEvents2 更改为 WordEvents,将参数变量名称更改为您自己的命名约定,然后添加代码,即可获得类定义。

下一步是使用 BindEvents 方法告知 VFPCOM 哪个对象是服务器,哪个对象包含映射到事件的方法。第一个参数是对 Office 应用程序的对象引用;第二个是对对象的对象引用(其框架可能是 ExportEvents 的输出)。

oWordEvents = CreateObject(“WordEvents”)

oVFPCOM.BindEvents(oWord, oWordEvents)

请确保已限定 VFPCOM 实用工具和事件处理程序对象(oVFPCOM 和 oWordEvents)的变量范围,以便在 Office 应用程序引用可用时它们可用。

我们检查一个小例子,展示 VFPCOM 的工作原理。清单 4 显示了处理 Word 事件所需的一个非常精简的版本。清单 4 在 www.hentzenwerke.com 提供的开发人员下载文件中以 VFPCOMandWord.PRG 的形式提供。

清单 4.VFPCOM 如何处理 Word 事件的简单示例。此交互式示例说明了 VFPCOM 如何处理 Word 的 BeforeClose 事件。

* Clean out any existing references to servers.* This prevents memory loss to leftover instances.RELEASE ALL LIKE o** Make the following variables public for demonstration* purposes, so they are available after this PRG has run* to demonstrate the VFPCOM functionality.PUBLIC oWord, oWordEvents, oVFPCom* Create the server applicationoWord = CreateObject("Word.Application")* Make it visibleoWord.Visible = .T.oWord.Documents.Add()oWord.Documents[1].Range.Text = "This is a test."* Create the VFPCOM objectoVFPCom = CreateObject("vfpcom.comutil")* Create the event handleroWordEvents = CreateObject("WordEvents")* Bind the server to the event handleroVFPCom.BindEvents(oWord, oWordEvents)* Bring VFP to the top and tell the user what to do next_SCREEN.AlwaysOnTop = .T._SCREEN.AlwaysOnTop = .F.MessageBox("When you close this box, you'll be put in Word." + CHR(13) + ;"Close down Word to see how VFPCOM handles it." + CHR(13) + ;"VFP should give 'BeforeClose' MessageBox, " + CHR(13) + ;"then Word should give its Save dialog." )oWord.Activate() && Activate Word* The definition for the pared-down event handlerDEFINE CLASS WordEvents AS CustomPROCEDURE DocumentBeforeClose(lCancel, oDoc)* Cheap way to bring VFP to the front._SCREEN.AlwaysOnTop = .T._SCREEN.AlwaysOnTop = .F.MessageBox("BeforeClose")* Go back to Word to see what it presents (prevent Alt-Tab)oWord.Activate()ENDPROCENDDEFINE

如您所见,事件处理程序已被修剪为仅处理一个事件;这只是为了节省书中的空间,运行 ExportEvents 方法以获取完整的代码。运行的代码是一个简单的 MessageBox,用于显示代码的运行位置。它还处理在顶部移动适当的窗口,因此您不必在应用程序之间使用 Alt-Tab。

运行此代码后,PUBLIC 变量仍在作用域中,因此事件处理程序仍然有效。关闭消息框时,VFP 将激活 Word 窗口。关闭文档或应用程序(两者都触发 DocumentBeforeClose 事件)。当 WordEvents 对象中触发 DocumentBeforeClose 事件时,VFP 将出现,给出一个简单的“BeforeClose”消息框,然后将您放回 Word 中,以查看 Word 继续其“保存”对话框。

想象一下有很多事件要捕获的可能性,并且通过完全访问文档,您有很多可能性。想象一下,让用户编辑 Word 文档,然后将文档的内容传递回 VFP,以便在保存文档时放入文本控件。您可以捕获以进行右键单击,并根据用户在文档中右键单击的位置运行代码。您可以捕获退出 Word,并提醒用户在自动化代码运行时无法关闭 Word。凉。太酷了。

VFPCOM with Excel

VFPCOM 可与 Excel 很好地配合使用,但有一个细微的区别:应用程序对象、工作簿对象和工作表对象有不同的事件。使用 oExcel、oBook 和 oSheet 运行导出事件并比较结果。为每种对象创建一个事件处理程序,然后使用 BindEvents 将每种对象绑定到其事件处理程序。

带有PowerPoint的VFPCOM

VFPCOM与PowerPoint的工作方式完全不同。VFPCOM 和/或 PowerPoint 对象模型中的不一致意味着 VFPCOM 无法按广告形式工作。第一个指标是 VFPCOM 的导出事件导致空文件;没有一个事件看起来好像是暴露的。此外,如果您尝试 BindEvents,您将收到一个错误:“OLE 错误代码 0x80070002:系统找不到指定的文件。

幸运的是,有一个解决方法。我们感谢John V. Petersen,他用Visual Basic编写了一个DLL,它解决了这个问题。DLL 及其源代码在 www.hentzenwerke.com 上提供的开发人员下载文件中以一系列 vbPowerPoint 文件(DLL、VBP、LIB 和 EXP)的形式提供。DLL 使用 VB 创建一个类,该类是 PowerPoint 的实例。此 VB 实例公开事件接口。您需要先注册 DLL,然后才能使用它。从“开始”按钮的“运行”菜单选项运行以下命令:

REGSVR32 C:\YourDriveAndPathHere\vbPowerpoint.dll

确保路径适合您的计算机。若要卸载此 DLL,请发出相同的命令,并在末尾添加“/u”。

清单 5 作为 VFPCOMandPPT.PRG 存储在 www.hentzenwerke.com 提供的开发人员下载文件中,显示了如何使用 DLL 使 VFP 正常工作。主要区别在于 oVBPowerPoint 是从 VB 类创建的,并在 oPowerPoint 属性中包含 PowerPoint 应用程序。

清单 5.将 VFPCOM 与 PowerPoint 配合使用。这里需要一个涉及 vbPowerPoint.DLL 的解决方法。

* Clean out any existing references to servers.


* This prevents memory loss to leftover instances.


RELEASE ALL LIKE o*


* Make the following variables public for demonstration


* purposes, so they are available after this PRG has run


* to demonstrate the VFPCOM functionality.


PUBLIC oVFPCom, oVBPowerPoint, oVFPPowerPoint


#DEFINE ppLayoutTitle 1


* Create an instance of VFPCOM


oVFPCom = CreateObject("vfpcom.comutil")


* Create the VB class, which, in turn, creates PowerPoint


oVBPowerPoint = CreateObject("vbPowerPoint.Class1")


* Add a small presentation


oVBPowerPoint.oPowerPoint.Visible = .T.


oPres = oVBPowerPoint.oPowerPoint.Presentations.Add()


oSlide = oPres.Slides.Add(1, ppLayoutTitle)


oSlide.Shapes[1].TextFrame.TextRange.Text = "This is a Test"


oSlide.Shapes[2].TextFrame.TextRange.Text = "It is ONLY a Test."


* Create an instance of the event handler object


oVFPPowerPoint = CreateObject("vfpPowerPoint")


* Bind PowerPoint to the error handler object


oVFPCom.BindEvents(oVBPowerPoint, oVFPPowerPoint)


* Let the user in on what to do


_SCREEN.AlwaysOnTop = .T.


_SCREEN.AlwaysOnTop = .F.


MessageBox("When you close this box, you'll be put in PowerPoint." + CHR(13) +;


"Close down PowerPoint to see how VFPCOM handles it." + CHR(13) + ;


"VFP should give 'BeforeClose' MessageBox, " + CHR(13) + ;


"then PowerPoint should give its Save dialog." )


oVBPowerPoint.oPowerPoint.Activate() && Activate PowerPoint


DEFINE CLASS vfpPowerPoint AS custom


PROCEDURE PresentationClose(Pres)


* Cheap way to bring VFP to the front.


_SCREEN.AlwaysOnTop = .T.


_SCREEN.AlwaysOnTop = .F.


MessageBox("PresentationClose")


* Activate PowerPoint


oVBPowerPoint.oPowerPoint.Activate()


ENDPROC


ENDDEFINE

原文来自

https://flylib.com/books/en/1.19.1.109/1/

版权所有 2000 Tamar E. Granor 和 Della Martin 保留所有权利

源码下载

https://cloud.189.cn/t/jI73ueABVZVr (访问码:q5tq)

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2023年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

VFP绑定word事件,让自动化处理更容易_第2张图片

VFP绑定word事件,让自动化处理更容易_第3张图片

926b0274842c51f17a58fd786312a657.gif

你可能感兴趣的:(word,自动化,c#,运维,开发语言)