| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: ActiveX/СОМ/CORBA > определить закрыт Word или нет |
| Автор: Albinos_x 24.4.2005, 12:28 | ||
| Работаю с компонентами закладки Servis WordApplication1 и WordDocument1 пытаюсь определить открыт или закрыт Word, так
но эта строка всегда возвращяет - True Может, кто знает, как правильно определять запущен Word или нет? Заранее спасибо за помощь! |
| Автор: z-END 24.4.2005, 13:05 | ||
попробуй так:
|
| Автор: Albinos_x 24.4.2005, 13:12 |
| в каком модуле лежит GetActiveOleObject(); |
| Автор: z-END 24.4.2005, 13:21 |
| помоему в ComObj если нет то нажми хэлп по данной ф-ции и посмотри в описании из какого она модуля. |
| Автор: Albinos_x 24.4.2005, 13:49 |
| Аналогичная проблема... |
| Автор: z-END 24.4.2005, 15:09 | ||
всмысле? опять получается что Ворд запущен?! может он у тя в процессах висит?! |
| Автор: Albinos_x 24.4.2005, 15:46 | ||
| Я был не прав определяет... Но не совсем так как мне нужно... обнаружил следующие косяки 1. Word открыт. Запускаем программу. Документ в ней не создаём. закрываем программу. Закрывается до этого открытый документ + ещё и сохраняется 2. Word закрыт. Запускаем программу. создаём в ней документ. Закрываем документ (Word). Программа выдаёт ошибку. код
|
| Автор: z-END 24.4.2005, 16:18 | ||
несовсем понятно что написано..
Какую ошибку? |
| Автор: Albinos_x 24.4.2005, 17:02 |
| ругается, говорит что операция недоступна. думаю что WordApplication1 не разъединяется с вордом при его закрытии и пытается его закрыть... |
| Автор: Albinos_x 24.4.2005, 22:20 |
| Кто-нибудь знает как это побороть? |
| Автор: <Spawn> 25.4.2005, 05:23 | ||
Вот еще один способ:
|
| Автор: RA 25.4.2005, 13:17 |
| Можно и так if FindWindow('MsoStdCompMgr',nil)<>0 then caption:='On' else caption:='Off'; |
| Автор: Albinos_x 25.4.2005, 16:44 | ||||
подскажите в каком модуле она лежит, а то делфя не понимает её... А через WordApplication1 можно как-нибудь определить, потому что предлогаемые варианты определяют не только мою сессию, но и другие.
1. определять мне надо ворд (документ) , который создался программой 2. если пользователь закрыл ворд (документ), который создался программой, то предотвратить попытку его закрытия при уничтожении WordApplication1 Добавлено @ 16:46 прошу прощения, если немного неправильно выразился при постановки вопроса |
| Автор: <Spawn> 25.4.2005, 19:05 | ||
ActiveX |
| Автор: Albinos_x 25.4.2005, 20:40 |
| спасибо, но это - всё равно не решает мою проблему полностью... |
| Автор: Albinos_x 26.4.2005, 17:57 | ||
Решил проблему....
Только в Form1Close(), эта штука не работает. Пришлось BorderIcons отключить полностью |
| Автор: Fantasist 5.5.2005, 09:16 |
| А зачем определять, запущен Word или нет? Вообще реккомендую закладкой servers не пользоваться. Лучше брать только интерфейсы и создавать объекты в run-time - гораздо меньше происходит неожиданных вещей да и из кода очевидно, что происходит. |
| Автор: Akella 6.5.2005, 15:38 | ||
| Значит ты неправильно его закрываешь нужно так
у меня всё работает |
| Автор: Albinos_x 7.5.2005, 08:51 | ||
дело в том что в моём случае ошибка возникает ещё до закрытия и вообще при попытке оперирования с этим документом в программе |
| Автор: Girder 7.5.2005, 13:22 | ||
| Albinos_x 1. тебе Fantasist дельный совет дал. 2. Конструкцией try except end - не стоит пренебригать. 3. А если у пользователя 150 документов в Word-е? PS: Не забудь создавать(если у тебя её нет) папку "Temp" - Word - за тебя енто не сделает... Вот код:
PS2: При запуске кода из под Delphi - могут выдаваться ошибки - но не при обычном запуске проги. Особо... не отлаживал - так что теоретически... И самое главное... так как ентот код ты хочеш засунуть в OnClose - не забудь выдавать для пользователя какое-нить сообщение... типо "Подождите пожалуйста"... Удачи. |
| Автор: Fantasist 7.5.2005, 19:04 | ||||
| Girder у нас же описания интерфейсов есть - зачем нам с Dispatcheм мучаться. Я бы переписал это так:
Обработка ошибок, конечно, выглядит не очень, но пойдет. Добавлено @ 19:08
Тогда компутер у него сдохнет еще до запуска этой программы. |
| Автор: Albinos_x 7.5.2005, 21:40 | ||||||||||||
не пренебрегаю... (см. мой вариант)
Проверял на 5 одновременно открытых документах - закрывается тот который нужен. (в моём варианте)
и такое есть...
знаю, но всё равно, спасибо за предупреждение... ----------------------------------------------
PS: ваши варианты пока не проверял...
Когда это понял, уже было поздно переделывать прогу...На тот момент уже около 5 тыс. строк... Даже с коментариями очень сложно осуществлять навигацию... Сейчас прежде чем, чего-то туда вставить, приходится сначала делать оттельно и уже рабочий вариант кода туда вставлять и даже с таким подходом возникают иногда проблеммы (сегодня неожиданно одна процедура, в которую вставлял новую функцию, стала выдавать переполнение стека...) Спасибо всем за помощь!!! |
| Автор: Albinos_x 27.6.2005, 22:28 | ||||
Предложенные варианты хорошие, но работают не совсем так как я хотел... моё конечное решение:
работает на ура и никаких ошибок не возникает... еще раз всем спасибо за участие и дельные советы |
| Автор: Akella 30.6.2005, 14:24 |
| При раннем связывании всё работает быстрее и проверка типов и ошибок происходит уже на стадии компилирования Хотя при позднем связывании тоже есть свои прелести |
| Автор: Albinos_x 19.7.2005, 17:37 |
| Обнаружил, что при некоторых настройках винды, событие FormClose почему-то не обрабатывается... Поэтому приведённый выше код запихнул в событие FormDestroy(Sender: TObject). Тогда проблем не возникнет... |