• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Замена файла Word в поле ReachText

  • Автор темы GROMILA
  • Дата начала
G

GROMILA

Ситуация:
На форме есть поле "rtDocPreview" типа "Rich text",
где хранится файл Word, который загружается по кнопке "Выбрать".
Пользователь выдит содержимое этого прикрепленного файла (предпросмотр)

В поле него "rtDocPreview" внедряется OLE объект путем notesUIDocument.CreateObject.

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

Я пытаюсь это делать так:
1. Удалить EmbeddedObject,
2. Вставить другой на его место.

Удаление делаю так:

Код:
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Dim rtitem As NotesRichTextItem

Set doc = ws.CurrentDocument.Document 
Set rtitem = doc.GetFirstItem( "rtDocPreview" )
If ( rtitem.Type = RICHTEXT ) Then
If Not( Isempty(rtitem.EmbeddedObjects) ) Then
Forall eo In rtitem.EmbeddedObjects
Call eo.Remove
Call rtitem.Update
Call doc.Save(True , True )
End Forall
End If

End If
Удаление происходит, однако поле "rtDocPreview" не обновлятся.
Оно обновляется если только переоткрыть документ.

Вопрос:
1. Как обновить поле "Rich text" после удаления EmbeddedObject?
2. Может есть другой способ обновить объект?
 
V

Veselinka

Если я правильно поняла - то цель - открыть другой файл, а в документ приатачить этот.
Предлагаемое решение не подойдет для всех деловых прецедентов, но в ряде случаев можно:

1. Файл приатачить как ты уже делал
2. А открывать не файл с РТФ поля, а тот который выбрали с файлухи, сделать это можно так:
( просто вставляю код не чистя лишнее, но наглядно будет)
Dim MSApp As Variant, dCN As Variant
Dim ds As Variant, d As Variant

If Not Isobject (MSApp) Then
Set MSApp = CreateObject ("Word.Application")
Set ds = MSApp.Documents
Set d = ds.Add ()
End If

Set dCN = ds.Open (fileName)
Call dCN.Range ().Copy ()
Call d.Range(d.Range().End -1, d.Range().End -1).Paste ()
Call d.Range(d.Range().End -1, d.Range().End -1).InsertBreak()

Call dCN.Close ()
bool = True
Kill fileName

If Isobject (MSApp) Then
If Not MSApp.Visible Then MSApp.Visible = True
If Isobject (d) Then Call d.Range(d.Range().End -2, d.Range().End -1).Delete ()
End If

Есть вариант, который прокатит при всех деловых прецедентах:
При выборе файла - реализвать описанный атач нового объекта, далее:

unid=doc.universalid
doc.saveOptions="0"
call doc.save(true,true)
call ws.currentdocument.close

это позволит закрыть документ без вопроса о сохранении

теперь:
set doc=db.GetDocumentbyUNID(unid)
call ws.editdocument(true,doc)
call doc.RemoveItem("saveoptions")
call doc.save(true,true)

ну а потом активируй объект - скорее всего получиться все нормально. Может и не получиться... хотя должно
 
G

GROMILA

Спасибо Веселинка :)
Замечание
Код:
Call dCN.Range ().Copy ()
Call d.Range(d.Range().End -1, d.Range().End -1).Paste ()

В любом случае сие плохо! Так как затирает текущее содержимое буфера обмена.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!