Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];




Вниз

TOleContainer + MS Word. (Оле! Оле! Спартак - чемпион!...) 


VLAD-MAL   (2004-03-23 14:32) [0]

Вопрос по использованию связки TOleContainer + MS Word.
После создания внедренного документа все вроде аботает OK, пока не переключу фокус на что-нибудь иное (другой TWinControl или вообще, другое приложение). После этого внедренный документ становится недостуным для редактирования (только просмотр и т.п.)...

 Как лечить?

 Delphi7 +
 Windows2000/MS Office 2000
 Windows XP/MS Office XP

PS Всякие там MS Excel etc работают без проблем...



Yermek   (2004-03-23 14:46) [1]

В смысли, ты связываешь с OLE щелкаешь на нем два раза у тебя у вылезает word в твоей форме, так или word открывается в "своём" окне?



VLAD-MAL   (2004-03-23 14:50) [2]

Word - в моей форме. (См. пример с Delphi:
C:\Program Files\Borland\Delphi7\Demos\ActiveX\OleCtnrs\olesdi.dpr - создаем MS Word, потом переключаемся на ранее запущенный Word, потом - обратно - и - кирдык...
)

Второй день маюсь...



Yermek   (2004-03-23 14:58) [3]

Постать 2 переключателя в компоненте OLE на false, не помню как называется но они одни из первых в списке и Word откроентся в "своем" окне, может тогда виснуть не будет.
если что пиши на мыло, я там поподробнее напишу, я сам его сейчас юзаю - диплом :)



VLAD-MAL   (2004-03-23 15:14) [4]

Если в отдельном окне, то весь смысл теряется...

Дополнительные заморочки - когда переключаюсь в Delphi, например, то обратное переключение в контейнер - без проблем, а вот переход в другой экхемпляр Word-а - потом обратно - фиг.

Еще помучаюсь чуть-чуть, и брошу.



Yermek   (2004-03-23 15:20) [5]

может он у тебя в памяти остается, пошли его на три клавиши посмотри



VLAD-MAL   (2004-03-23 15:22) [6]

Ну конечно, остается, я ж продалжаю сеанс редактирования...



VLAD-MAL   (2004-03-23 16:09) [7]

В общем, трабла такая:

- в базе данных собираюсь хранить документ (MS Word), для чего требуется запускать его в модальном окне (чтобы глупый юзер в контейнер - приложении не перешел на другую запись базы данных, а потом не попытался бы сохранить документ, ранее извлеченный из со-о-всем другой записи).

Поискал по этому поводу в Сети, все, что наше - это пара аналогичных мне случаев (без решения :( )

Возникла дурацкая мысль
1. Отказываюсь от TOleContainer
2. Для описанной задачи создам специальный пул объектов, представляющий собой ссылки на TWordApplication, и информацию - откуда он взялся (типа, ID записи). Назначать документу обработчики на события OnDocumentBeforeSave, OnDocumentBeforeQuit etc, и, используя ID, обновлять/изменять данные базы.

Или я слишком рано сдался?

Все-таки OleOntainer, встроенный в порогу, выглядит "солидно"...

Помогите!!!



Курдль ©   (2004-03-23 16:27) [8]

Поиграйся со свойствами ObjectVerbs.
У меня точно была такая промблема, но склероз не позволяет вспомнить ее точное решение :)



Курдль ©   (2004-03-23 16:32) [9]

А может быть надо что-то сделать со свойством AutoActivate
8-/



VLAD-MAL   (2004-03-23 16:33) [10]

Текущее состояние (при создании документа) списка ObjectVerbs:

Изменить
Открыть

Что можно изменить?



VLAD-MAL   (2004-03-23 16:34) [11]

AutoActivate - менял по-всякому. Никак.



Курдль ©   (2004-03-23 17:19) [12]

А так не пойдет?
AllowActiveDoc := False



VLAD-MAL   (2004-03-23 17:25) [13]

Нет, только картинка при редактировании другая, а глюк тот же.

В сети надыбал несколько вопросов, аналогичных моему, в т.ч. на английском, испанском, немецком, и кажется, на китайском. Траблы у всех - решения нет.



Курдль ©   (2004-03-23 17:35) [14]

Сдается мне, что это вина TOleContainer - он не принимает на себя фокус в полной мере.
Т.е. дает нажимать на кнопки Ворда, находящегося в нем, менять размеры таблиц, полей и т.п. А вот с текстом работать не дает...



VLAD-MAL   (2004-03-23 17:40) [15]

А вот с Excel - все OK...

Абыдна, да...



Курдль ©   (2004-03-23 17:42) [16]

Вот хоть корявое, но решение:


OleContainer1.AutoActivate := aaGetFocus;

procedure TForm1.OleContainer1Exit(Sender: TObject);
begin
 OleContainer1.Close;
end;

Можешь ретранслировать на английском, испанском, немецком, и на китайском. :)



VLAD-MAL   (2004-03-23 17:51) [17]

Проходили.

procedure TMainForm.OleContainer1Exit(Sender: TObject);
begin
if OleContainer1.State <> osEmpty then
  OleContainer1.Close;

end;

Событие не стреляет, когда в другое приложение (MS Word - другую копию) переключаемся.



Курдль ©   (2004-03-23 17:57) [18]

Тарды жалуйся Борланду! :)
Может обрабатывать на нижнем уровне WM_MOUSEMOVE и самому отлавливать фокус/не_фокус...



VLAD-MAL   (2004-03-23 17:59) [19]

Ага, а он про номер моего экземпляра Delphi Enterprise спросит...




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.076 c
4-1079351543      Talla2k               2004-03-15 14:52  2004.04.11  
аналог SelLength на WinApi


3-1078992781      Janbolat              2004-03-11 11:13  2004.04.11  
Application path &amp; Вычисляемые поля


1-1082374017      cort33                2004-04-19 15:26  2004.04.11  
Разбитие текста


14-1082127074     nikitos               2004-04-16 18:51  2004.04.11  
Протестите прогу


3-1081847949      Rych                  2004-04-13 13:19  2004.04.11  
Как проверить присутствует-ли занчение в TDataSet ?