Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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
Попробуй объявить переменную для Word, примерно так:
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, то почему в твоём приложении не реализовать всю логику?
Если твоё приложение уже есть? И если оно твоё? Вот в нём, в твоём приложении напиши предложенное выше.

private appWord As Word.Application, withevents doc as word.document

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
К сожалению, не всегда и не везде...
Еще раз спасибо!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам