powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как из fox'a узнать, открыть ли word'овский документ?????
11 сообщений из 11, страница 1 из 1
как из fox'a узнать, открыть ли word'овский документ?????
    #35621336
ilovefox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
программа сформировала word-документ и открыла его юзеру.
допустим он хочет переформировать (что-то изменилось в исходных данных).
нажимает сформировать и нарывается на ошибку "документ с таким названием уже открыт".
как проверить ?????????????????
в мануале на VBA есть пример, но там

1 For Each doc In Documents
2 IF doc.Name = "Report.doc" then
3 found = true
4 Endif
5 Next doc

как победить первую строку?
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35621416
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ilovefox
> Здравствуйте!
> программа сформировала word-документ и открыла его юзеру.
> допустим он хочет переформировать (что-то изменилось в исходных данных).
> нажимает сформировать и нарывается на ошибку "документ с таким названием уже открыт".
> как проверить ?????????????????
> в мануале на VBA есть пример, но там
>
> 1 For Each doc In Documents
> 2 IF doc.Name = "Report.doc" then
> 3 found = true
> 4 Endif
> 5 Next doc
>
> как победить первую строку?

А зачем её побеждать?
1 For Each doc In word.Documents
2 IF doc.Name = "Report.doc" then
3 found = true
4 Endif
5 Next doc
можно по другому:
Код: plaintext
1.
2.
3.
4.
5.
6.
found = .F.
try
    doc = word.Documents.Item("Report.doc")
    found = .T.
catch to oerr
    found = .F. && Но это не обязательно
endtry

Переменную word получать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Try
    word = Getobject(,'word.application')
Catch To oErr
    Try
        word = Createobject('word.application')
    Catch To oErr1
        Messagebox("Купите и установите MSOffice!",  0 + 16 + 4096 , "Программа",  30000 )
        Return
    Endtry
Endtry

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35621448
ilovefox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Премного благодарен! Всех благ!
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35622519
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более корректен будет такой синтаксис

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
found = .F.
Try
    doc = Getobject("C:\MyFolder\Report.doc")
    found = .T.
Catch To oErr
    Try
        word = Createobject('word.application')
    Catch To oErr1
        Messagebox("Купите и установите MSOffice!",  0 + 16 + 4096 , "Программа",  30000 )
        Return
    Endtry
Endtry

Дело в том, что может быть открыто несколько процессов Word. А функция Getobject() подхватывает первый попавшийся процесс, удовлетворяющий заданным критериям.

Если указано имя приложения вторым параметром, то Getobject() и подхватит первый экземпляр этого приложения. И далеко не факт, что нужный документ окажется открыт именно в этом экземпляре.

Кроме того, явное "поднятие" процесса с открытым нужным файлом избавляет от необходимости сканирования всех открытых документов в поднятом процессе.
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35622726
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ВладимирМ
> Более корректен будет такой синтаксис

Не совсем согласен, т.к. задача стояла определить открыт ли определенный файл в данный момент. И нужно это было для
избежания ошибки при (пере)формировании отчета. А я уже решал проблемы приведенного кода, а не задачи :)

> Дело в том, что может быть открыто несколько процессов Word. А функция Getobject() подхватывает первый попавшийся
> процесс, удовлетворяющий заданным критериям.

Согласен, и кроме как явно закрыть полученный процес и запросить новый, я не знаю как по другому перебрать все запущеные
процессы.

> Если указано имя приложения вторым параметром, то Getobject() и подхватит первый экземпляр этого приложения. И
> далеко не факт, что нужный документ окажется открыт именно в этом экземпляре.

Да, но для составления отчетов это не помеха, а для решения задачи ТС это не подходит


А для решения проблеммы, можно попробовать создавать отчеты на основе какого-нибудь(можно просто пустого файла) шаблона,
тогда ворд автоматически будет именовать файла, добавляя им инкремент в название. Это делается при помощи
word.Documents.Add("Здесь можно указать файл-шаблон, на основе которого и будет создаватся новый")
Кстати, а как отчет создается?

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35638175
ilovefox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отчёт создаётся из шаблона
word.Documents.Add("Здесь можно указать файл-шаблон, на основе которого и будет создаватся новый").
попробую вариант, предложенный Владимиром, видимо ньюансы, подмеченные им, решают всё.
Дело в том, что иногда код, предложенный Игорем, иногда "пропускает" уже открытый документ.
Спасибо всем огромное!
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35638368
ilovefox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
found = .F.
Try
    doc = Getobject("C:\MyFolder\Report.doc")
    found = .T.
Catch To oErr
    Try
        word = Createobject('word.application')
    Catch To oErr1
        Messagebox("Купите и установите MSOffice!", 0+16+4096, "Программа", 30000)
        Return
    Endtry
Endtry

ВладимирМ, этот код возвращает .T. в любом случае (если есть файл), вне зависимости от того, открыт этот документ или нет.
Что подкрутить?
Спасибо!
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35638708
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А смысл что-то подкручивать? Вы же получили доступ к файлу и можете его исправлять. А открыт он или нет (точнее, виден ли пользователю) - не важно.

Если хотите проверить факт его отображения, то смотрите значение свойства visible у приложения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
doc = Getobject("C:\MyFolder\Report.doc")
word = doc.application
if word.visible = .T.
    * Документ был открыт пользователем вручную
else
    * Документ был открыт командой GetObject() только что
    * Если его надо сделать видимым, то
    word.visible = .T.
endif
found = .T.
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35640759
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: ilovefox
> Здравствуйте!
> программа сформировала word-документ и открыла его юзеру.
> допустим он хочет переформировать (что-то изменилось в исходных данных).
> нажимает сформировать и нарывается на ошибку "документ с таким названием уже открыт".
> как проверить ?????????????????


Если программа сформировала ворд-документ, то сам объект ворда у программы был.
Но, если нужна возможность отслеживать изменение в файле, формированном программой, то нужно подписатся на события
ворда, в данном случае, нужно событие Document_Close сформированного объекта, в котором фиксировать, что пользователь
закрыл документ и можно переформировывать, и если это событие не произошло, то нужно сказать пользователю, что-бы
закрыл.

Хотя и это можно обойти, закрыв программу и открыв её снова. Тогда подписка на события не сработает.

Пример подписки на события офисных приложений, можно посмотреть в справке в теме Visual FoxPro and Advanced COM, раздел
Event Binding.

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

Хотя ВладимирМ предложил вариант решения ;)

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35644066
UNP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNP
Гость
ilovefox, возможно Вам имеет смысл контролировать события Word-а. Отыскал у себя древнюю процедуру, которая позволяет это делать. Текст ниже

DO Word_Event WITH "C:\Мой_Документ.DOC"

*********************************************************************************
* Процедура загружает СОМ-сервер WORD и отслеживает его события при изменении
* документа. Входной параметр cName_Word_Doc содержит путь доступа и имя доку-
* мента, если этот параметр опущен, загружается новый документ.
*********************************************************************************
PROCEDURE Word_Event
PARAMETERS cName_Word_Doc &&, lnKodTypeDogovors, nConnect, lcSelect

#DEFINE TRUE .T.
#DEFINE FALSE .F.

PUBLIC oWord as Word.Application
PUBLIC gcName_Word_Doc, glnKodTypeDogovors, gnConnect, gcSelect, oWordEvents, oWord
gcName_Word_Doc=cName_Word_Doc
*glnKodTypeDogovors=lnKodTypeDogovors
*gcSelect=lcSelect
*gnConnect=nConnect

oWordEvents = NEWOBJECT("WordEvents") && Объект событий Word
oWord = NEWOBJECT("Word.Application") && Загрузка СОМ-сервера Word
oWordEvents.oWord = oWord
*** Связать COM-сервер с методами интерфейса на объекте FoxPro.
IF !EVENTHANDLER(oWord,oWordEvents)
MESSAGEBOX("Ошибка при вызове СОМ-сервера. Операция отменена.",;
16,"Ошибка при вызове Word")
EVENTHANDLER(oWord,oWordEvents,.T.) && Разорвать соединение с СОМ-сервером
RELEASE oWordEvents, oWord
RETURN -1
ENDIF
oWord.Visible = .t. && Сделать СОМ-сервер видимым
oWord.Activate && Сделать СОМ-сервер активным

IF EMPTY(cName_Word_Doc)
oWord.Documents.Add && Создать новый документ в СОМ-сервере
ELSE
oWord.Documents.Open(cName_Word_Doc) && Открыть документ в СОМ-сервере
ENDIF

DEFINE CLASS WordEvents as Custom
IMPLEMENTS applicationevents2 IN "word.application"
oWord = .NULL.
PROCEDURE ApplicationEvents2_startup()
PROCEDURE ApplicationEvents2_quit
*Выход без сохранения (если не было изменений)
oWord.Quit
This.oWord=.NULL.
PROCEDURE ApplicationEvents2_DocumentBeforeClose(Cancel,Doc)
*Выход (если были изменения).Вызывается диалог(Сохранить изменения*?-ДА-НЕТ-ОТМЕНИТЬ
* если ДА - вызов метода ApplicationEvents2_DocumentBeforeSave
* если НЕТ - вызов метода ApplicationEvents2_quit
* если ОТМЕНИТЬ - вызов метода ApplicationEvents2_WindowActivate
PROCEDURE DocumentBeforeClose(Cancel,Doc)
PROCEDURE ApplicationEvents2_DocumentBeforePrint(Cancel,Doc)
*При печати документа
PROCEDURE ApplicationEvents2_DocumentBeforeSave(Doc,SaveAsUI,Cancel)
*Сохранить документ: SaveAsUI=.F. -сохранить, SaveAsUI=.T. - сохранить как
oWord.Documents.Save
= Save_IN_SQL (gcName_Word_Doc) &&, glnKodTypeDogovors, gnConnect, gcSelect)
PROCEDURE ApplicationEvents2_DocumentChange
*При загрузке нового документа, может означать измение в документе
PROCEDURE ApplicationEvents2_DocumentOpen(Doc)
*При открытии документа в диалоге OPEN
PROCEDURE ApplicationEvents2_NewDocument(Doc)
*При создании нового документа
PROCEDURE ApplicationEvents2_WindowActivate(Doc,Wn)
*При активации Word или документа
PROCEDURE ApplicationEvents2_WindowBeforeDoubleClick(Sel,Cancel)
*При двойном щелчке левой кнопки мыши
PROCEDURE ApplicationEvents2_WindowBeforeRightClick(Sel,Cancel)
*При вызове всплывающего меню по правой кнопке мыши
PROCEDURE ApplicationEvents2_WindowDeactivate(Doc,Wn)
*При деактивации Word
PROCEDURE ApplicationEvents2_WindowSelectionChange(Sel)
*При выделении или удалении фрагмента текста или отмены изменений.
*Возвращает выделенный фрагмент, если фрагмент не выделен - возвращает
*следующую за курсором букву
PROCEDURE Destroy
*При завершении работы СОМ-сервера
IF !ISNULL(This.oWord)
EVENTHANDLER(This.oWord,This,.T.) && Разорвать соединение с СОМ-сервером
IF TYPE('oWord')="O" &&AND !ISNULL(oWord)
This.oWord.Quit
oWord.Quit
This.oWord=.NULL.
oWord=.NULL.
ENDIF
ENDIF
oWordEvents=.Null.
RELEASE oWordEvents

RELEASE gcName_Word_Doc, glnKodTypeDogovors, gcSelect
ENDDEFINE

PROCEDURE Save_IN_SQL && Сохранить изменённый документ в БД SQL
PARAMETERS lcWordDocNew &&, lnKodTypeDogovors, lnConnect, lcSelect

WAIT "СОХРАНИТЬ ДОКУМЕНТ" WINDOW

RETURN
...
Рейтинг: 0 / 0
как из fox'a узнать, открыть ли word'овский документ?????
    #35644211
ilovefox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to UNP -cпасибо отромное! попробую.
сейчас жгёт вопрос о двусторонней печати из FOX'a в WORD.
что-то нашёл по этой теме, но немножко не то.
как выкрутиться, не знаю.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как из fox'a узнать, открыть ли word'овский документ?????
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]