Страница: 1 |
Страница: 1 |
Вопрос: Синхронизация действий с WORD
Добавлено: 12.01.06 12:13
Автор вопроса: CR
Уважаемые коллеги!
Столкнулся с такой проблемой... Работаю с WORD через OLE Automation, формирую очень большую (~400 страниц) таблицу. Понятно, что любое действие с ней требует времени, причем всегда (в зависимости от быстродействия конкретного компьютера) разного. Пытаюсь эту таблицу форматировать (выравнивание, шрифт и т.п.). Вопрос: как узнать, что моя команда выполнена? А то получается, что WORD еще не закончил форматирование, а я продолжаю пулять ему другие команды, в результате чего все виснет...
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 12.01.06 12:19
Это когда же методы Word стали асинхронными?
Чё-то я пропустил этот момент...
Номер ответа: 2
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #2
Добавлено: 12.01.06 12:45
ОК, спасибо!
Копать нужно не там... Переформулирую вопрос.
Поднимаю WORD, создаю в нем табличку, гоню в нее часть данных. Показываю табличку юзеру, чтобы он мог внести свои данные (или исправить мои). По окончании работы юзера нужно импортировать все данные из таблички обратно в мое приложение. Вопрос: как определить, что юзер закончил работу с документом? Я нашел 2 варианта: либо использовать EnumWindows по таймеру и искать в заголовках окон название документа; либо спрашивать список DDE-серверов и искать в нем то же самое. И то и другое работает нестабильно. Можно, конечно, еще спросить список процессов, но это мало что меняет...
Номер ответа: 3
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #3
Добавлено: 12.01.06 12:55
Попробуй объявить переменную для Word, примерно так:
Dim WithEvents appWord As Word.Application, тогда в разделе Declarations появятся некоторые свойства Worda’а, например Quit и т.д.. Т.е. ты сможешь в программе отслеживать некоторые действия пользователя в самом Word’е.
Номер ответа: 4
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #4
Добавлено: 12.01.06 13:04
2 Михалыч. Спасибо, не пойдет. WORD таким образом трогать нельзя - 2500 юзеров. Придется всем ставить и сопровождать... Нужно узнать извне...
Номер ответа: 5
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #5
Добавлено: 12.01.06 13:37
Ставить и сопровождать что?
Свои объектные библиотеки word ставит и сопровождает сам.
И вообще, как ты "Поднимаешь WORD", не используя их?
События на факт редактирования документа не возникают и не будут возникать. Единственный нормальный способ определить, что юзер закончил работу - дать ему кнопку "Я закончил работу".
Было бы событие document_change, как ьы ты отличал, когда он закончил работу, а когда ещё нет - просто сидит и любуется, чё бы ещё поменять в этой таблице?
Номер ответа: 6
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #6
Добавлено: 12.01.06 13:51
Dim WithEvents appWord As Word.Application,
Я так понимаю, что нужно создать макрос, объявить эту переменную и отслеживать ее из моего приложения. Или по-другому? А кнопочку "Я закончил работу" нужно сделать, распространить на всех юзеров от Калининграда до Благовещенска, кажому объяснить, как сделать так, чтобы эта кнопочка появилась в его персональном WORD'е и т.п.
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 12.01.06 14:25
А как на данный момент ведётся работа? Кто "поднимает word"?
Номер ответа: 8
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #8
Добавлено: 12.01.06 14:38
Сейчас процесс выглядит так: мое приложение поднимает WORD, или, если он уже есть, то подгружает новый документ; затем формируется табличка с данными из базы; затем показывается word и юзер начинает редактирование. В это же время по таймеру начинаю проверять наличие строки с именем файла в списке DDE-серверов. Как только это имя пропадает из списка (когда юзер закрывает окно документа или WORD), снова поднимается WORD (опять-таки из моего приложения), открывается исправленный юзером документ, из таблички забираются данные, кладутся в базу, WORD закрывается.
Номер ответа: 9
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #9
Добавлено: 12.01.06 15:48
Я фигею...
Если твоё приложение "поднимает" word, то почему в твоём приложении не реализовать всю логику?
Если твоё приложение уже есть? И если оно твоё? Вот в нём, в твоём приложении напиши предложенное выше.
sub start()
set appword=new word.application
set doc=appword.documents.open("c:\file.doc"
end sub
private sub doc_Close()
msgbox "Пользователь закрыл документ."
appword.quit
end sub
Номер ответа: 10
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #10
Добавлено: 12.01.06 15:50
И ещё...
В чём смысл использования word в данном случае? Почему не сразу, с использованием инструментов, специально предназначенных для работы с базой?
Номер ответа: 11
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #11
Добавлено: 12.01.06 16:02
На первое: это предполагает наличие в моем приложении кнопки "Закрыть WORD", против чего верещат юзеры.
На второе: смысл использования WORD состоит в том, что используются специальные, привычные юзеру, бланки. Т.е. необходимо использовать WORD в качестве формы для ввода данных в базу. К сожалению, это специфика задачи...
Бьюсь с этой фигней уже полгода...
Номер ответа: 12
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #12
Добавлено: 12.01.06 16:59
На первое: процедура doc_Close() будет вызвана сама как только пользователь закроет документ. Изучаем азы.
На второе: мои сочувствия.
Номер ответа: 13
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #13
Добавлено: 12.01.06 17:01
На первое: основное приложение написано не на VB, поэтому азы там другие...
Спасибо, буду бороться...
Номер ответа: 14
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #14
Добавлено: 12.01.06 17:16
На первое: сей факт, совершенно нетипичный для раздела VBA, надо обозначать сразу, а не в 13-м посте... Но как бы там ни было, данные азы едины для всех языков, хотя и реализуются с разной степенью понятности.
Номер ответа: 15
Автор ответа:
CR
Вопросов: 2
Ответов: 8
Профиль | | #15
Добавлено: 12.01.06 17:24
К сожалению, не всегда и не везде...
Еще раз спасибо!