(изменено: Slava.Coder.Vrn, 29 марта 2007г. 22:11:06)

Тема: Вопрос по работе с TDMS из MSWord

Вопрос больше относится к VBA4Word.
Задача следующая: нужен расширеный редактор шаблонов документов, наподобие "штатного" из 2-й версии TDMS.
Надо:
1. Обеспечить возможность просмотра/редактирования нескольких документов (соотв, каждый документ должен работать со "своим" объектом TDMS), причем необходимо выбирать объект TDMS из меню документа (а не так, как это сделано в "штатном" шаблоне TDMS2Word - по GUIDу объекта, из которого открыт данный документ)
2. Избавиться от проблемы "штатного" шаблона TDMS - невозможность автозагрузки шаблона TDMS, при наличии открытого Outlook, который для своей работы подгружает Word, но при этом не загружает шаблоны, лежащие в папке Startup.

Собственно, выход я вижу один - не запихивать шаблон в папку Startup, а размещить его, например, в папке с установленным TDMS, а для запоминания информации о выбранном объекте TDMS для данного документа использовать ActiveDocument.Variables("TDMSObjGUID").
Но при этом возникают следующие проблемы:
1. При изменении документа Word настоятельно рекомендует записать изменения и в шаблон. Что это он хочет туда записать - непонятно. Вроде ничего с ActiveDocument.AttachedTemplate не делаю...
2. Очень странно ведут себя события OnWindowActivate и OnWindowDeactivate. Почему-то иногда после вызова ActiveDocument.Fields.Update возникает событие OnWindowDeactivate, что приводит к удалению меню TDMS.

Если шаблон лежит в папке Startup - этой бредятины не происходит.
Собственно, меня бы устроило расположение шаблона в папке Startup, если бы не необходимость каждый раз выгружать Outlook для открытия документа на основе шаблона WordTDMS.
Мож есть какой способ "попросить" Outlook загружать шаблоны Word из папки startup или просто создавать свой "личный" Word-сервер, который не будет использоваться другими документами Word, открытыми "вживую" пользователем (правда, подозреваю, что архитектура Word последнее просто не позволяет)?

Заранее благодарю за хорошие идеи  :)

Re: Вопрос по работе с TDMS из MSWord

1. В Outlook есть настройка, которая позволяет отключить использование MSWord, как редактора по-умолчанию - так что проблема с outlook решена  :)

2. Можно, переписать команду "редактировать", чтобы вручную открывать MSWord. Если я не ошибаюсь, то можно надстройки загружать и через api ворда.

3. Кстати, можно попробовать изменить normat.dot, чтобы в нём анализировать тот или иной документ и стартовать кастомные надстройки.

4. Использование событий WindowActivate и WindowDeactivate в паре с FieldsUpdate - крайне не рекомендуемо. Связано это с тем, что при открытии большого файла (от 5-10 МБ) данная функция просто вешает ворд (ворд пытается найти все поля). Поэтому мы в интерфейсе под 3-ю версию и избавились от "автообновления." В предыдущей версии интерфейсов именно так всё и использовалось - тормоза жуткие.
Выход - апдейтить поля тока по кнопке (вроде сейчас так и сделано).

5. Можно попробовать использовать тот же контрол для дерева TDMS, что и в интерфейсе к автокаду.

P.S. как Вы уже догадались, интерфейсы бесплатные, откуда следует некоторые ограничения по функционалу  ;)

(изменено: Slava.Coder.Vrn, 2 апреля 2007г. 10:52:20)

Re: Вопрос по работе с TDMS из MSWord

1. В Outlook есть настройка, которая позволяет отключить использование MSWord, как редактора по-умолчанию

120% среди юзверей страшный вой поднимется  :)

2. ... Если я не ошибаюсь, то можно надстройки загружать и через api ворда

Я пока не нашел, как это сделать. Неплохой вариант был бы. В идеале хотелось бы загружать VBA модули в открытый документ. Было бы красиво. Как это сделать не нашел.

3. Кстати, можно попробовать изменить normat.dot, чтобы в нём анализировать тот или иной документ и стартовать кастомные надстройки

Гы. А это, пожалуй, оптимальный вариант. Аутглюк ведь загружает normal.dot?

4. Использование событий WindowActivate и WindowDeactivate в паре с FieldsUpdate - крайне не рекомендуемо

Да я тоже сначала сделал пункт меню "Обновить данные". Поднялся шум со стороны юзерей. Им, видете ли, безразлично, что при переключении в Ворд комп зависает на пол-минуты, но они не хотят жать никаких лишних кнопочек  :)

ЗЫ: Нового интерфейса не видел. Вместе с 3-ой в папку TDMS/samples закидывается старый шаблон для Ворда. В этом шаблоне почему-то по-дефолту ссылка аж еще на TDMS 1.0 TLB!!!

Re: Вопрос по работе с TDMS из MSWord

Им, видете ли, безразлично, что при переключении в Ворд комп зависает на пол-минуты, но они не хотят жать никаких лишних кнопочек

Ну пол-минуты это еще нормуль  :) - бывает и побольше.  :)

120% среди юзверей страшный вой поднимется

Дык им то какая разница - они ж даже разницы не почувствуют  :)) Более того, если поддерживается серверное обновление, то наверняка можно msi-ку написать, которая всем всё автомато сделает.

Гы. А это, пожалуй, оптимальный вариант. Аутглюк ведь загружает normal.dot?

Да, конечно. Если посмотришь в taskmanager-e, то там увидишь winword.exe - он просто в инвизибле.

P.S. вариант с подгрузкой надо смотреть/тестировать, т.к. если я не ошибаюсь, то ворд, при запуске надстройки, использует её для всего приложения (всех инстансов), а не для конкретного документа.

(изменено: Slava.Coder.Vrn, 2 апреля 2007г. 11:21:04)

Re: Вопрос по работе с TDMS из MSWord

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

Надстройка - это имеется ввиду word template? 100% шаблон загржается на Word-сервер (т.е. сразу и автоматически становится доступен из всех документов). А еще у этой заразы меню создается тоже на весь ворд-сервер, но при этом меню сохраняется в каждый документ. Поэтому если не убирать меню TDMS по WindowDeactivate, это меню сохранится во всех открытых документах и никак его потом не уберешь... Только программно или убивать normal.dot надо.

Re: Вопрос по работе с TDMS из MSWord

А еще у этой заразы меню создается тоже на весь ворд-сервер, но при этом меню сохраняется в каждый документ. Поэтому если не убирать меню TDMS по WindowDeactivate, это меню сохранится во всех открытых документах и никак его потом не уберешь... Только программно или убивать normal.dot надо.

Хех, дык не надо его убирать то  :)
Смотри - в меню же должны быть команды "сохранить как новый объект", или "добавить в существующий объект".

ИМХО надо просто в команде сделать проверку и выдавать сообщение типа "открытый/активный документ не сохранён в ТДМС! Сохранить?"  :)

Re: Вопрос по работе с TDMS из MSWord

Если меню не убирать - оно появляется во всех открытых документах и в итоге сохраняется в normal.dot. Каким образом это происходит я не совсем понимаю, но этот факт несколько раз наблюдал, когда при тестировании отключал удаление меню в методе WindowDeactivate.

Re: Вопрос по работе с TDMS из MSWord

всё правильно. В normal.dot хранится текущее представление ворда.
Если не ошибаюсь, то если, к примеру, ты уберёшь с экрана какую-нить панель, то при следующем запуске она не отобразится.
Точно также и с созданием меню через api.

Не обязательно его убирать из меню - пусть меню TDMS остаётся. Пусть оно будет во всех документах- просто делай проверку - документ ТДМС - да/нет  :)

P.S. можно порыскать в ворде событие типа menu_before_show - не знаю, есть такое или нет. И если есть, то просто проверять, что если документ не ТДМС, то просто дисейблить пункты меню.

(изменено: Slava.Coder.Vrn, 5 апреля 2007г. 13:53:45)

Re: Вопрос по работе с TDMS из MSWord

Воспользовался вашей подсказкой и запихал весь код шаблона в файл Normal.dot. Спасибо  :)
Пока полет нормальный  :)
Только вот outlook все равно не грузит никаких шаблонов. Даже normal.dot   :wacko: После запуска аутглюка даже адд-оновские панельки из ворда исчезают (если при этом запустить ворд отдельно, а потом закрыть его) ...
Кстати, для уменьшения времени обновления сделал "регистрацию" используемых атрибутов. Теперь из объектов TDMS тянутся только те атрибуты, которые были вставлены в документ.
И циклическую подгрузку атрибутов объекта, на который указывает атрибут типа "ссылка на объект" без ограничений вложенности (разве что при обнаружении зацикливания формирование дерева атрибутов останавливается)  :)
А с аутглюком... Видимо, все же придется запретить ворд как редактор для почты...