Проблема с фокусировкой в ​​Vista при вызове проверки орфографии в Microsoft Word из Oracle Forms - PullRequest
2 голосов
/ 07 августа 2009

Друзья,

При тестировании нашего приложения Oracle Forms в Vista я обнаружил интересную "проблему".

Приложение может вызвать средство проверки правописания Microsoft Word для проверки правописания в поле. При вызове пользователю отображается стандартное диалоговое окно проверки орфографии Microsoft Word. Само слово невидимо для пользователя.

Проверка орфографии вызывается из форм с использованием автоматизации, а используемый метод основан на примечании металинка: 295449.1 Как интегрировать средство проверки правописания MS Word с формами с помощью WebUtil.

Это хорошо работало, когда вызывалось с использованием Windows XP и Office 2003.

Однако, когда те же (неизмененные) функциональные возможности выполняются в Vista, диалоговое окно Microsoft Word Spell Checker появляется за окном браузера, поэтому пользователю кажется, что ничего не произошло, и функциональность не работает (нет индикации на панели задач Vista эта проверка орфографии была вызвана)

Проблема возникает в Vista с Office 2007 и Office 2003. Я вижу, что проблема вызвана Vista, потому что, если я использую тот же URL-адрес, который использовался для запуска приложения Forms в WindowsXP, диалоговое окно проверки правописания Microsoft Word выглядит как ожидается, что впереди.

В Vista я пытался установить режим совместимости для Office на Windows XP SP2, но проблема остается.

Я также попытался явно установить ACTIVATE (как видно из примера кода ниже), но безуспешно.

Кто-нибудь еще сталкивался с этим? Любая помощь или указатели, где другие столкнулись с этой проблемой, будут с благодарностью приняты!

Детали моего окружения:

Сведения об окружающей среде

Oracle Forms: 10.1.2.3 JRE: вс 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;

РЕДАКТИРОВАТЬ: 10/08/2009

Эта ссылка http://www.experts -exchange.com / Microsoft / Development / MS_Access / Q_23085081.html подробно описывает ту же проблему (но на этот раз вместо слов оракула, управляющих словом, это мс доступ) К сожалению, я могу не вижу ответа (если он есть!)

РЕДАКТИРОВАТЬ: 12/08/2009

Вся ссылка на обмен экспертами гласит, что это проблема перспективы - как будто я этого не знал!

1 Ответ

2 голосов
/ 12 августа 2009

Похоже, что это не может быть решено с помощью Automation \ OLE, этот поток отмечает, что существует проблема с методом активации в OLE \ Automation и Vista.

Обходной путь - вызывать api для управления окнами.

...