Просмотр файлов в документе

morpheus

скриптописец
07.08.2006
3 915
1
#1
Возникла необходимость просматривать файлы ( doc / xls / gif / jpg / pdf ) "не отходя от кассы", тоесть в самом документе.
Решение с использованием "сторонних" для нотеса, а точнее родных контролов windows.

Пример
Я использовал контрол браузера. Описание его найдёте в C:\Windows\system32\shdocvw.dll. В реестре обзываетсья как Shell.Explorer.2

В нужное место на форме я через меню Create -> object... выбираю Control и в списке отмечаю "Обозреватель веб-страниц (Microsoft)" (название зависит от локализации). Если в списке контролов такового не оказалось - Вы можете сами добавить через кнопку Add Control To list... по указанному выше пути.

Теперь у Вас на форме есть контрол. Можете задать ему некоторые параметы. Такие как:
  • На всю страницу
  • До первого региона
  • -
  • Автивироваться при просмотре
  • и т.д.

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

Теперь добавляем рт-поле Body в котором будут храниться нужные файлы и пишем кнопку для обработки.

Name обьекта мы заменим на "Browser"

Краткое описание алгоритма
  • составить список всех атачментов
  • выбрать один который хотим просмотреть
  • скидываеться выбраный атачмент в тэмповую папку на машине пользователя
  • обращаемся к контролу0-просмотрщику
  • открываем нужный нам атачмент с диска


[codebox]Sub Click(Source As Button)
On Error Goto errorHandler

Dim ws As New NotesUIWorkspace
Dim mWebBrowser As Variant , varAttachmentNames As Variant, vPrompt As Variant, vFile As Variant
Dim strTempPath As String
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim rtitem As NotesRichTextItem

Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set rtitem = doc.GetFirstItem( "Body" )

'If Not (uidoc.IsNewDoc) Then Exit Sub
If rtitem Is Nothing Then Exit Sub
If Isempty( rtitem.EmbeddedObjects ) Then Exit Sub

varAttachmentNames = ""
Forall x In rtitem.EmbeddedObjects ' пробегаемся по атачментам в поле Боди
If Len( varAttachmentNames ) > 0 Then varAttachmentNames = varAttachmentNames +Chr(10)
varAttachmentNames = varAttachmentNames + x.Name
End Forall
If Len( varAttachmentNames ) = 0 Then Exit Sub
Let strTempPath = Environ$("TEMP") ' путь во временную папку


varAttachmentNames = Split( varAttachmentNames, Chr(10) ) ' список всех имен атачментов
vPrompt = ws.Prompt( 4, "titile", "prompt", varAttachmentNames(0), varAttachmentNames ) ' выбираем кактой-то один
If Isempty(vPrompt) Then Exit Sub
Kill strTempPath + "\" + vPrompt ' удаляем на всякий случай

Set vFile = rtitem.GetEmbeddedObject(vPrompt)
Call vFile.ExtractFile(strTempPath + "\" + vPrompt) ' скидываем файл на диск

Set mWebBrowser =uidoc.GetObject("Browser") ' обращаемся к нашему контролу-просмотрщику
If mWebBrowser Is Nothing Then Exit Sub

mWebBrowser.navigate strTempPath + "/" + vPrompt ' собственно открываем на просмотр
Exit Sub

errorHandler:
Select Case Err
Case 75
'попытка удалить с ошибкой
Resume Next
Case Else
Msgbox "Error " & Err & " in line: " & Erl & ": " & Error$
Exit Sub
End Select
Resume Next
End Sub[/codebox]

За помощ благодарен EHT за то что натолкнул на идею

з.ы. Для любых рисунков лучше использовать контрол PreView C:\Windows\system32\shimgvw.dll. Но у меня так и не получилось изменить размеры самого контрола (192х192 как я не старался). Хотя контрол очень удобный, можно зумить и переворачивать фото. разница лишь в Class контрола "Preview.Preview.1" и в том как происходит просмотр: через метод ShowFile( "File_path", 1 )

з.з.ы. Замечания, пожалуйста, излагайте в этой теме http://codeby.net/forum/threads/25430.html