【问题标题】:Vista focus issue when invoking Microsoft Word spell check from Oracle Forms从 Oracle Forms 调用 Microsoft Word 拼写检查时出现 Vista 焦点问题
【发布时间】:2010-11-17 15:21:59
【问题描述】:

朋友们,

在 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 Spell Checker 对话框窗口显示为预期,在前面。

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

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

还有其他人遇到过这种情况吗?任何其他人遇到此问题的帮助或指示将不胜感激!

我的环境详细信息是:

环境详情

Oracle 表单:10.1.2.3 JRE:孙 JRE 1.6.0_14 数据库:10.2.0.3 Vista:带有 Service Pack 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 访问)不幸的是我看不到答案(如果有的话!)

编辑:2009 年 8 月 12 日

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

【问题讨论】:

    标签: oracle automation oracle10g ole oracleforms


    【解决方案1】:

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

    方法是调用windows api来操作windows。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多