Lotus Notes FAQ Visit Our Sponsor!

Why don't my changes to a Rich Text field show up immediately?

Unlike text or time fields, you need to close and reopen the uidoc to see changes that are made on rich text fields. You have to do something like:
  Dim ws As New NotesUIWorkspace
  Dim uidoc As NotesUIDocument

  Set uidoc = ws.CurrentDocument

  Dim doc As NotesDocument
  Set doc = uidoc.Document
  ' make changes to back-end document's Rich Text fields here
  Call uidoc.Close
  Set uidoc = ws.EditDocument(True, doc)

Here is this code applied to place a graphical logo from a central database onto a form:

Sub Postopen(Source As Notesuidocument)
'From Rich_Collette@siemon.com
'This routine copies a logo from a ListMaintenance form to this newly created LetterHead.
  Dim ListDoc As NotesDocument
  Dim doc As notesDocument
  Dim db As NotesDatabase
  Dim ListItem As notesRichTextItem
  Dim docItem As NotesRichTextItem
  Dim view As notesview
  Dim workspace As New NotesUIWorkspace
  'get the doc behind the new UIDoc
  Set doc=source.document
  'get the handle to the item that holds the Logo
  Set docItem=doc.GetFirstItem("LogoRTF")
  'check if Logo is already there from previous call to this routine
  If (docItem.ValueLength > 10) Then ' For some reason the value is > 0 even if the item is empty.
    Exit Sub
  End If
  'get handle to this database
  Set db=doc.ParentDatabase
  'form name isn't set on newly created docs, must set the value
  'get the "List" document that contains a logo in the RTFItems field
  Set view = db.GetView( "List Maintainence" )
  Set ListDoc = view.GetDocumentByKey( "LetterLogo", True )
  'if you don't remove the item prior to seting its value, you get an error message about the types not being equivalent
  Call doc.RemoveItem ("LogoRTF")
  Set ListItem = ListDoc.GetFirstItem("RTFItems")
  Set docItem = doc.CopyItem( ListItem, "LogoRTF" )
  'close the uidocument that is currently open on the user's screen
  Call source.close
  'reopen the document
  Set source = workspace.EditDocument( True, doc )
End Sub

When composing a UIDocument, RTF fields are stored on the backend NotesDocument as NotesItems rather than as NotesRichText items. They are not converted to a true RichTextItem on the backend Notesdocument until the Notesdocument is saved. Therefore, if you try to do:
Set rtfItem2 = doc.CopyItem( RTFItem1, "LogoRTF" )
after getting rtfItem1 from an existing RTF field prior to saving the notesdocument it is on, you are actually trying to copy an RTF field into a regular NotesItem and it gives you a data type error.

Rich sent in another example that creates and displays a rich text field without requiring that the back-end doc get saved first:

Sub Initialize
  'How to populate a new rich text field via backend classes and display without having to save the backend document
  'If this is an existing saved document, then most of this is not needed, you just append to the existing RTF, close the UIDOC and edit the document
  'similar to what is done at the very end of this code
  'Created by Richard Collette, CLP Principal Developer
  'This demo needs a single form called "DemoDoc" - on the form place a field called "myRTF"
  'Please note an actual application would test for "is Nothing" prior to using objects to insure they were instantiated.
  'This was eliminated here to provide a more concise example
  'Caveat:   When closing and reopening a uidoc via its backend NotesDocument, the uidoc loses all notion that it is a response document and will save
  'as a regular document.  If you need a response document, you must capture the parent documentUNID (the selected document) and make the new
  'document a response using the MakeResponse method.
  Dim session As New NotesSession
  Dim doc As NotesDocument
  Dim tmpRTItem As NotesRichTextItem
  Dim RTItem As NotesRichTextItem
  Dim uiws As New NotesUIWorkspace
  Dim uidoc As NotesUIDocument
  Dim styleHeadline As NotesRichTextStyle
  Dim styleNormal  As NotesRichTextStyle
  Dim item As NotesItem

  'compose the new document, or you can grab the current document that is on the workspace
  Set uidoc=uiws.composeDocument("", "" , "DemoDoc")
  If uidoc Is Nothing Then Exit Sub
  Set uidoc=uiws.currentDocument
  'get the backend document
  Set doc=uidoc.document
  'Create a temporary Rich Text Field that won't be saved
  Set tmpRTItem= New NotesRichTextItem( doc , "RTFTemp")
  'create the style objects for setting text properties
  Set styleHeadline=session.createRichTextStyle()
  Set styleHeadline=session.createRichTextStyle()
  Set styleNormal=session.createRichTextStyle()
  'Add text, images, etc to the temporary rich text field
  Call tmpRTItem.appendStyle(styleHeadline)
  Call tmpRTItem.AppendText( "Headline" )
  Call tmpRTItem.appendStyle(styleNormal)
  Call tmpRTItem.AddNewLine(1)
  Call tmpRTItem.AppendText( "Normal Text")
  '**********************************The meat and potatoes of this demo starts here**********************************************************
  'form name isn't stored on the composed NotesDocument until it is saved.  Set the form name so we can re-edit the document and it will know what form to use.
  'don't prompt the user to save the document, set this back to "1" at the end of the code if you want the user to be able to save the document
  'this causes two RTItems of the same name (RTFTemp) to be created on the back end document, they get combined into one only when the NotesDocument is saved, this makes RTF's difficult to work with
  Call uidoc.close
  'remove the RTF field to be displayed becuase it really isn't an RTF until the document is saved, another reason why RTFs are so difficult to work with
  If (doc.isNewNote) Then
    Call doc.removeItem("myRTF")
  End If
  'get the first of the two RTItems that were created during the close event, the second one is empty
  Set tmpRTItem=doc.getFirstItem("RTFTemp")
  'because the temporary RTF item was formated during UIDOC close process, we can now copy it to our actual document field.
  'this code will not work without using a temporary RTFItem
  Set RTItem = doc.CopyItem( tmpRTItem, "myRTF" )
  'remove the temporary RTF Item from the backend document
  Call doc.removeItem("RTFTemp")
  'open the document in read mode and don't allow change to edit mode   (any other mode possible)
  Set uidoc=uiws.editDocument(True,doc)
  Set doc=uidoc.document
  'allow the user to save the document
  'prevent SaveOptions from saving on the document
  Set item=doc.getFirstItem("saveOptions")
End Sub

Applies to Notes Versions: 4 4.5 4.6 5
Last Modified: November 25, 1999