从 Oracle Forms 调用 Microsoft Word 拼写检查时出现 Vista 焦点问题

发布于 2024-07-30 05:10:53 字数 3718 浏览 12 评论 0原文

朋友们,

在 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 引起的,因为如果我使用相同的 url用于在 WindowsXP 上启动 Forms 应用程序时,Microsoft Word 拼写检查器对话框窗口将按预期出现,位于前面。

在 Vista 中,我尝试将 Office 的兼容模式设置为 Windows XP SP2,但问题仍然存在。

我还尝试显式设置 ACTIVATE (如您从下面的示例代码中看到的)但没有成功。

还有其他人遇到过这个吗? 任何帮助或指出其他人遇到此问题的地方将不胜感激!

我的环境详细信息是:

环境详细信息

Oracle Forms:10.1.2.3 JRE:Sun JRE 1.6.0_14 数据库:10.2.0.3 Vista:带有 Service Pack 1 的商业版 Office: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;

编辑:10/08/2009

此链接 http://www.experts-exchange.com/Microsoft/Development/MS_Access/Q_23085081.html 详细说明了相同的问题(但是这次不是 oracle 形式控制字,而是 ms access)不幸的是我看不到答案(如果有的话!)

编辑:12/08/2009

所有到专家交换状态的链接都是这是一个vista 问题 - 就像我不知道一样!

Friends,

In testing our Oracle Forms application on Vista I have found a interesting "challenge".

The application can invoke the Microsoft Word spell checker to perform a spell check on a field. When invoked, the user is shown the standard Microsoft Word spell checker dialog window. Word itself is invisble to the user.

The Spell Checker is invoked from Forms using Automation and the method used is based on the metalink note: 295449.1 How To Integrate The MS Word Spell Checker With Forms Using WebUtil.

This has worked well when invoked using Windows XP and Office 2003.

However when this same (unchanged) functionality is run on Vista, the Microsoft Word Spell Checker dialog window appears behind the browser window so to the user it appears that nothing has happened and the functionality isn't working(There is no indication on the Vista taskbar that spell checker has been invoked)

The problem occurs on Vista with Office 2007 and Office 2003. I can see that the problem is caused by Vista because if I use the same url used to launch the Forms application on WindowsXP, the Microsoft Word Spell Checker dialog window appears as expected, which is in front.

Within Vista I have tried setting the compatability mode for Office to Windows XP SP2 but the problem remains.

I have also tried explicitly setting ACTIVATE (as you can see from the sample code below) but without success.

Has anyone else run in to this? Any help or pointers to where others have experienced this problem would be gratefully received!

My environment details are:

Environment Details

Oracle Forms: 10.1.2.3
JRE: Sun JRE 1.6.0_14
Database: 10.2.0.3
Vista: Business Edition with Service Pack 1
Office: 2003 or 2007

The code (which needs to go in a client side Oracle) used to invoke the spell checker is:

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;

EDIT: 10/08/2009

This link http://www.experts-exchange.com/Microsoft/Development/MS_Access/Q_23085081.html details the same problem (but this time instead of oracle forms controlling word, it's ms access) Unfortunately I can't see the answer(if there is one that is!)

EDIT: 12/08/2009

All the link to expert-exchange states is that this is a vista problem - like I didn't know that!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

漫雪独思 2024-08-06 05:10:53

看起来这个问题不能单独使用 Automation\OLE 来解决,这个 线程 指出 OLE\Automation 和 Vista 中的 activate 方法存在问题。

解决方法是调用 windows api 来操作窗口。

Looks like this can't be solved using Automation\OLE alone, this thread notes there is a problem with the activate method within OLE\Automation and Vista.

The way round it is to call the windows api to manipulate the windows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文