Spannendes Problem, spannende Lösung

Yanick Zeder  26 May 2016 15:57:50
Notes DialogBox mit Richtext-Feld

Beim Entwickeln von Notes-Applikationen gibt es häufig Situationen, in welchen es gewünscht ist, dass man dem Benutzer mittels einer DialogBox die Möglichkeit gibt Daten einzugeben oder anzupassen. Wenn man sich dabei aber nicht nur auf Text-Felder beschränken und auch Richtext-Felder benutzen möchte, stösst dabei bei Notes an seine Grenzen. Denn die Lotusscript-Funktion DialogBox() unterstützt das Rückschreiben von Richtext-Feldern in ein Dokument nicht. Das Field-Sharing funktioniert leider nicht für RichText, wie in der Lotusscript Referenz ersichtlich:

Image:Spannendes Problem, spannende Lösungen

Nach Recherche im Netz konnte ich keine Lösung finden welche zuverlässig funktioniert. Deswegen entwickelte ich eine eigene Lösung resp. einen Workaround..


Der Workaround


Der hier beschriebene Workaround nutzt die Zwischenablage um den Inhalt des Feldes in das Dokument zu übertragen. Er besteht grundsätzlich aus zwei Teilen:
1. Vor dem Schliessen der DialogBox muss der Inhalt des benötigten Feldes kopiert werden.
2. Das entsprechende Dokument wird mittels UI-Dokument geöffnet, der Feldinhalt eingefügt und gespeichert.


Code im der Dialog-Maske


Wir wollen vor dem Schliessen des Dokuments den Richtext-Content kopieren. Hierzu muss der Code im QueryClose angepasst werden:

Sub Queryclose(Source As Notesuidocument, Continue As Variant)
      Set sourceUiDocument = Source
     
      ‘navigiere zum gewollten Feld
      Call sourceUiDocument.GotoField("Body")
     
      ‘kopiere den gesamten Inhalt in die Zwischenablage
      Call sourceUiDocument.SelectAll()
      Call sourceUiDocument.Copy()
End Sub


Lotusscript im Agent


sendOk = ui.Dialogbox("DialogInstantMailingEdit", True, True, False, False, False, False, "Instant Mail Editor", email, True, False, True)
'falls der User den Dialog mittels „OK“ geschlossen hat, muss der Inhalt übertragen werden
If sendOk then
      ‚Reload the docment
      Set memoView = datenbank.Getview(„")
      Set dokument = memoView.Getdocumentbykey(objKey(0), True)
     
      ‘zuerst muss das Dokument im UI geöfnet werden
      Call ui.EditDocument(True, dokument)
‘dann wird der inhalt des Feldes gelöscht. Dies verhindert einen Prompt vom Notes welches darauf hinweist dass diese aktion nicht rükgängig gemacht werden kann.
      Call ui.Currentdocument.Fieldclear("Body")'Prevents the dialog:"This operation cannot be undone"
      Call ui.CurrentDocument.GotoField("Body")
      Call ui.Currentdocument.Selectall()
      Call ui.CurrentDocument.Paste()
      Call ui.CurrentDocument.Save()
      Call ui.CurrentDocument.Close()
End If

Comments Disabled