|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
Здравствуйте! программа сформировала word-документ и открыла его юзеру. допустим он хочет переформировать (что-то изменилось в исходных данных). нажимает сформировать и нарывается на ошибку "документ с таким названием уже открыт". как проверить ????????????????? в мануале на VBA есть пример, но там 1 For Each doc In Documents 2 IF doc.Name = "Report.doc" then 3 found = true 4 Endif 5 Next doc как победить первую строку? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 18:17 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
> Автор: 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.
Переменную word получать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
-- С уважением Горбонос Игорь Леонидович Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 19:02 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
Премного благодарен! Всех благ! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 19:20 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
Более корректен будет такой синтаксис Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Дело в том, что может быть открыто несколько процессов Word. А функция Getobject() подхватывает первый попавшийся процесс, удовлетворяющий заданным критериям. Если указано имя приложения вторым параметром, то Getobject() и подхватит первый экземпляр этого приложения. И далеко не факт, что нужный документ окажется открыт именно в этом экземпляре. Кроме того, явное "поднятие" процесса с открытым нужным файлом избавляет от необходимости сканирования всех открытых документов в поднятом процессе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2008, 12:15 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
> Автор: ВладимирМ > Более корректен будет такой синтаксис Не совсем согласен, т.к. задача стояла определить открыт ли определенный файл в данный момент. И нужно это было для избежания ошибки при (пере)формировании отчета. А я уже решал проблемы приведенного кода, а не задачи :) > Дело в том, что может быть открыто несколько процессов Word. А функция Getobject() подхватывает первый попавшийся > процесс, удовлетворяющий заданным критериям. Согласен, и кроме как явно закрыть полученный процес и запросить новый, я не знаю как по другому перебрать все запущеные процессы. > Если указано имя приложения вторым параметром, то Getobject() и подхватит первый экземпляр этого приложения. И > далеко не факт, что нужный документ окажется открыт именно в этом экземпляре. Да, но для составления отчетов это не помеха, а для решения задачи ТС это не подходит А для решения проблеммы, можно попробовать создавать отчеты на основе какого-нибудь(можно просто пустого файла) шаблона, тогда ворд автоматически будет именовать файла, добавляя им инкремент в название. Это делается при помощи word.Documents.Add("Здесь можно указать файл-шаблон, на основе которого и будет создаватся новый") Кстати, а как отчет создается? -- С уважением Горбонос Игорь Леонидович Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2008, 13:11 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
Отчёт создаётся из шаблона word.Documents.Add("Здесь можно указать файл-шаблон, на основе которого и будет создаватся новый"). попробую вариант, предложенный Владимиром, видимо ньюансы, подмеченные им, решают всё. Дело в том, что иногда код, предложенный Игорем, иногда "пропускает" уже открытый документ. Спасибо всем огромное! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2008, 16:46 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
ВладимирМ, этот код возвращает .T. в любом случае (если есть файл), вне зависимости от того, открыт этот документ или нет. Что подкрутить? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2008, 17:37 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
А смысл что-то подкручивать? Вы же получили доступ к файлу и можете его исправлять. А открыт он или нет (точнее, виден ли пользователю) - не важно. Если хотите проверить факт его отображения, то смотрите значение свойства visible у приложения. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2008, 20:18 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
> Автор: ilovefox > Здравствуйте! > программа сформировала word-документ и открыла его юзеру. > допустим он хочет переформировать (что-то изменилось в исходных данных). > нажимает сформировать и нарывается на ошибку "документ с таким названием уже открыт". > как проверить ????????????????? Если программа сформировала ворд-документ, то сам объект ворда у программы был. Но, если нужна возможность отслеживать изменение в файле, формированном программой, то нужно подписатся на события ворда, в данном случае, нужно событие Document_Close сформированного объекта, в котором фиксировать, что пользователь закрыл документ и можно переформировывать, и если это событие не произошло, то нужно сказать пользователю, что-бы закрыл. Хотя и это можно обойти, закрыв программу и открыв её снова. Тогда подписка на события не сработает. Пример подписки на события офисных приложений, можно посмотреть в справке в теме Visual FoxPro and Advanced COM, раздел Event Binding. Вобщем случае, можно проверить не занят ли файл попытавшись удалить его, если не даст, говорить пользователю, что-бы закрыл его Хотя ВладимирМ предложил вариант решения ;) -- С уважением Горбонос Игорь Леонидович Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2008, 17:19 |
|
как из fox'a узнать, открыть ли word'овский документ?????
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2008, 14:30 |
|
|
start [/forum/topic.php?fid=41&msg=35638708&tid=1587097]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 497ms |
0 / 0 |