从 Oracle Forms 调用 Microsoft Word 拼写检查时出现 Vista 焦点问题
-
12-09-2019 - |
题
朋友们,
在 Vista 上测试我们的 Oracle Forms 应用程序时,我发现了一个有趣的“挑战”。
应用程序可以调用 Microsoft Word 拼写检查器对字段执行拼写检查。调用时,用户将看到标准的 Microsoft Word 拼写检查对话框窗口。Word 本身对用户来说是不可见的。
拼写检查器是使用自动化从表单调用的,所使用的方法基于metalink注释:295449.1 如何使用 WebUtil 将 MS Word 拼写检查器与表单集成。
使用 Windows XP 和 Office 2003 调用时效果很好。
然而,当在 Vista 上运行相同的(未更改的)功能时,Microsoft Word 拼写检查器对话框窗口会出现在浏览器窗口后面,因此对于用户来说,似乎没有发生任何事情并且该功能不起作用(Vista 上没有任何指示)已调用拼写检查器的任务栏)
在装有 Office 2007 和 Office 2003 的 Vista 上会出现此问题。我可以看到该问题是由 Vista 引起的,因为如果我使用与在 WindowsXP 上启动 Forms 应用程序相同的 url,Microsoft Word 拼写检查器对话框窗口将按预期出现,位于前面。
在 Vista 中,我尝试将 Office 的兼容模式设置为 Windows XP SP2,但问题仍然存在。
我还尝试显式设置 ACTIVATE (正如您可以从下面的示例代码中看到的)但没有成功。
还有其他人遇到过这个吗?任何帮助或指出其他人遇到此问题的地方将不胜感激!
我的环境详细信息是:
环境详情
甲骨文表格:10.1.2.3 JRE:Sun JRE 1.6.0_14数据库:10.2.0.3 Vista:服务包1办公室的商业版:2003年或2007年
用于调用拼写检查器的代码(需要进入客户端 Oracle)是:
PROCEDURE SPELL_CHECK (ITEM_NAME IN VARCHAR2) IS
MY_APPLICATION CLIENT_OLE2.OBJ_TYPE;
MY_DOCUMENTS CLIENT_OLE2.OBJ_TYPE;
MY_DOCUMENT CLIENT_OLE2.OBJ_TYPE;
MY_SELECTION CLIENT_OLE2.OBJ_TYPE;
GET_SPELL CLIENT_OLE2.OBJ_TYPE;
MY_SPELL CLIENT_OLE2.OBJ_TYPE;
ARGS CLIENT_OLE2.LIST_TYPE;
SPELL_CHECKED VARCHAR2(4000);
ORIG_TEXT VARCHAR2(4000);
BEGIN
ORIG_TEXT := ITEM_NAME;
-- CREATE WORD.APPLICATION OBJECT
MY_APPLICATION := CLIENT_OLE2.CREATE_OBJ('WORD.APPLICATION');
--CLIENT_OLE2.SET_PROPERTY(MY_APPLICATION, 'VISIBLE', FALSE);
CLIENT_OLE2.SET_PROPERTY(MY_APPLICATION, 'VISIBLE', TRUE);
--CLIENT_OLE2.INVOKE(MY_APPLICATION, 'ACTIVATE');
-- GET HANDLE FOR DOCUMENTS COLLECTION
MY_DOCUMENTS := CLIENT_OLE2.GET_OBJ_PROPERTY(MY_APPLICATION, 'DOCUMENTS');
-- ADD A NEW DOCUMENT TO THE DOCUMENTS COLLECTION
MY_DOCUMENT := CLIENT_OLE2.INVOKE_OBJ(MY_DOCUMENTS, 'ADD');
-- GET HANDLE FOR SELECTION OBJECT
MY_SELECTION := CLIENT_OLE2.GET_OBJ_PROPERTY(MY_APPLICATION, 'SELECTION');
-- INSERT THE TEXT FIELD INTO DOCUMENT
CLIENT_OLE2.SET_PROPERTY(MY_SELECTION, 'TEXT', ORIG_TEXT);
-- GET HANDLE FOR ACTIVE DOCUMENT
GET_SPELL := CLIENT_OLE2.GET_OBJ_PROPERTY(MY_APPLICATION, 'ACTIVEDOCUMENT');
-- INVOKE SPELL CHECKER
CLIENT_OLE2.INVOKE(GET_SPELL, 'CHECKSPELLING');
CLIENT_OLE2.INVOKE(MY_APPLICATION, 'ACTIVATE');
-- Added to handle a cancel request.
CLIENT_OLE2.INVOKE(MY_SELECTION,'WholeStory');
CLIENT_OLE2.INVOKE(MY_SELECTION,'Copy');
-- GET CHECKED TEXT FROM DOCUMENT
SPELL_CHECKED := CLIENT_OLE2.GET_CHAR_PROPERTY(MY_SELECTION, 'TEXT');
-- REFORMAT RETURN TEXT TO DISPLAY CORRECTLY IN FORMS
SPELL_CHECKED := substr(replace(SPELL_CHECKED,chr(13),chr(10)), 1, length(SPELL_CHECKED));
-- COPY NEW TEXT IN THE FORM
COPY(SPELL_CHECKED,ITEM_NAME);
-- CLOSE THE DOCUMENT WITHOUT SAVING
ARGS := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG(ARGS, 0);
CLIENT_OLE2.INVOKE(MY_DOCUMENT, 'CLOSE',ARGS);
CLIENT_OLE2.DESTROY_ARGLIST(ARGS);
-- RELEASE THE OLE OBJECTS
CLIENT_OLE2.RELEASE_OBJ(MY_SELECTION);
CLIENT_OLE2.RELEASE_OBJ(GET_SPELL);
CLIENT_OLE2.RELEASE_OBJ(MY_DOCUMENT);
CLIENT_OLE2.RELEASE_OBJ(MY_DOCUMENTS);
CLIENT_OLE2.INVOKE(MY_APPLICATION, 'QUIT');
CLIENT_OLE2.RELEASE_OBJ(MY_APPLICATION);
END;
编辑:2009年10月8日
这个链接 http://www.experts-exchange.com/Microsoft/Development/MS_Access/Q_23085081.html 详细说明了同样的问题(但这次不是控制单词的oracle形式,而是ms access)不幸的是我看不到答案(如果有的话!)
编辑:2009年12月8日
所有与专家交换状态的链接都是这是一个 Vista 问题 - 就像我不知道一样!
解决方案
看起来这个问题不能单独使用 Automation\OLE 来解决,这个 线 注意到 OLE\Automation 和 Vista 中的激活方法存在问题。
解决方法是调用 windows api 来操作窗口。