можно ли открыть документ скрытно?

deeeman

Well-Known Member
04.12.2007
383
0
#1
Привет всем!

может как нибудь можно открыть документ, чтобы получить у него uiDoc, но чтобы его не было видно...

PS
и это нужно делать в цикле... =)
 
A

allex

Гость
#2
Идейно вот так


coll=getalldocbykey(key)
set doc = coll.getfirstdoccument
while not doc is nothing
uind = doc.universalid
wend
set doc = coll.getnextdoccument(doc)
 

deeeman

Well-Known Member
04.12.2007
383
0
#4
мне нужно в виде перебирать все документы, откывать их, копировать содержимое в буфер обмена, потом буфер вставлять в word документ - отправлять на печать... и т далее

именно через буфер (потому что так более красиво), через заполнение полей на форме word не устаривает.
 
D

Darker

Гость
#5
копировать содержимое документа в UI в буфер без отображения самого дока не получится, ИМХО.
 

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#6
deeeman

После открытия документа в UI и копирования его в буфер обмена сразу же закрывате его Call NotesUIDocument.Close(True). Если машины мощные, то даже моргать почти не будет :happy:

Свойства Visible у NotesUIDocument'а к сожалению нет...
 

deeeman

Well-Known Member
04.12.2007
383
0
#7
ну с морганием должно устроить...
накатал код, подскажите в чем ошибка:

вываливается на строке: Call uiDoc.Copy
команда не может быть выполнена...

Код:
Sub Click(Source As Button)
On Error Goto ErrLabel

Dim wObj As Variant
Dim ws As New NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Set wObj = CreateObject("Word.Application")
Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument
While Not doc Is Nothing 
With wObj
.Documents.Add
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
.Selection.Paste
'.printOut
.ActiveDocument.Close(False)
Call uiDoc.Close
End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 

deeeman

Well-Known Member
04.12.2007
383
0
#10
Call uidoc.SelectAll

если ставлю эту строку то на ней сваливается

Добавлено: Причем, если такой же код повесить на кнопку на форме, и при открытом документе, то все работает.
может как то нужно фокусировать что открыт документ
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#11
deeeman
Может документ просто не успевает открыться? Можно попробовать Sleep, но кмк это не поможет.

Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
 

deeeman

Well-Known Member
04.12.2007
383
0
#12
попробовал с паузой, все равно....

ошибка на строке Call uiDoc.Copy
Document command is not available

Если ли еще способы в буфер загнать содержимое UiDoc?
 
#13
Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
+1. Юзать события формы. Тока не надо трогать код формы. Достаточно on event
Код:
Function copyDocContent( i_doc As NotesDocument )
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.EditDocument(False, i_doc , False , , True )
On Event queryclose From uidoc Call myQueryClose ' кармообразующее дейстиве 
Call uidoc.Close
End Function
Sub myQueryClose(source As NotesUIDocument , continue )
Dim ws As New NotesUIWorkspace ' использование source у меня не заработало ( 7.0.3 )
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy
End Sub
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#14
Если ли еще способы в буфер загнать содержимое UiDoc?
В цикле перед
Код:
 Set uidoc = ws.EditDocument(False, doc)
пишем
Код:
 doc.ReplaceItemValue("$$CopyAll", "1").SaveToDisk = False
В PostOpen формы пишем:
Код:
Sub Postopen(Source As Notesuidocument)
If Source.Document.HasItem("$$CopyAll") Then
Source.SelectAll
Source.Copy
'вставляем в ворд и печатаем
Source.Close
End If
End Sub
Если будет работать, очень удивлюсь :happy:
Добавлено: Пока писал turumbay уже всё решил ;).
 

deeeman

Well-Known Member
04.12.2007
383
0
#16
turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll

код:

Код:
Dim wObj As Variant

'как глобальные
Dim ws As NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Sub Click(Source As Button)
On Error Goto ErrLabel

Set ws = New NotesUIWorkspace
Set wObj = CreateObject("Word.Application")


Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument

While Not doc Is Nothing 
With wObj
.Documents.Add

Set uidoc = ws.EditDocument(False, doc , False , , True )
On Event queryclose From uidoc Call myQueryClose
Call uidoc.Close

End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов3' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub

Sub myQueryClose(source As NotesUIDocument , continue )
On Error Goto ErrLabel

'тут сваливается...
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy

wObj.Selection.Paste
wObj.printOut
wObj.ActiveDocument.Close(False)

EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! myQueryClose' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#17
turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll
Попробуй мой вариант.
Добавлено: В принципе в постопене можно с вордом ничего не делать, документ мы уже скопировали, пастить в ворд и печать можно и в теле цикла.
 
D

Darker

Гость
#18
Попробуй пройтись по полям.
uidoc.GotoField("Нужное поле")
uidoc.selectall
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#19
Это что, проверка на документ в режиме редактирования?
GotoField
This method is valid only when the document is in Edit mode.
 
#20
turumbay, сделал как ты велел ))
не. я не так велел :)
я велел ws инстанцировать внутре myQueryClose. и уж точно не велел юзать глобальные переменные, и тем более сувать в мой пушистый кроссплатформенный код какие-то wObj :)
P.S. возьми код из этого поста http://codeby.net/ipb.html?s=&sh...st&p=168705
и замени
Код:
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
на
Код:
copyDocContent( doc )
P.S. На пальцах: глобальный ws.currentDocument не указывает куда следует... Т.о. нужно принудительно пересоздать ws, чтобы подсосался uidoc.