文書を保存せずに閉じて再び開く

コードサンプルは、ユーザーが編集している文書内のリッチテキストフィールドに変更を加え、変更内容を保存せずに直ちに画面に表示する LotusScript® コードの記述方法を示しています。これは、文書が開かれるときにのみ実行されるその他の操作 (セクション編集者式や計算結果サブフォーム式の評価など) を繰り返す必要がある場合にも便利です。

NotesUIDocument メソッドを使用してリッチテキストの変更を加えることはできますが、段落区切り、表の行、添付ファイルの追加など、重要な操作を行うことはできません。

使用法

この方法は、文書を開いて保存せずに閉じる必要があるその他のアプリケーション (パススルー HTML を Notes クライアントで再ペイントする、サブフォーム式を再計算するなど) にも使用できます。

この方法では、文書ウィンドウを閉じて再び開きます。このため、Queryclose、Queryopen、Postopen などに含まれる任意のフォームイベントコードがトリガーして、最終的にカーソルがデフォルトのフィールドに置かれます。回避策を取ることが可能です。

文書を既に編集していて、フォーム上にリッチテキストフィールドがある場合、そのリッチテキストフィールドは空の場合でも既に Notes のメモリー内に存在します。同じ名前の別のアイテムを作成する場合は、CreateRichTextItem または New NotesRichTextItem を使用しないでください。代わりに、既存のアイテムを見つけてください。

既存のリッチテキストフィールドは、NotesUIDocument.Document の取得時に自動的にバックエンド文書にロードされません。これは、NotesUIDocument.Refresh(True) を呼び出して明示的に要求する必要があります。これにより、計算結果フィールド、入力変換関数、入力確認関数もすべてトリガーされます。入力確認では確認失敗ダイアログが表示されますが、実際にまだ文書を保存していない場合、これは不適切です。これを解決するには、入力変換に @If(@IsDocBeingRecalculated; @Success; ...) を使用します。こうすると、ユーザーが F9 キーを押したときや、キーワードの変更時に更新するように設定されているキーワードフィールドがある場合にエラーメッセージが返されなくなるため、必ず実行してください。

次にコードを示します。このコードは Notes 5.0.2 以降で動作します。

Dim wksp As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument, uidocNew As NotesUIDocument
Dim doc As NotesDocument
Dim rti As NotesRichTextItem
Dim strFieldname As String
Set uidoc = wksp.CurrentDocument
uidoc.Refresh True ' do this if the rich text field is editable, to get the current contents in case user has modified them.
Set doc = uidoc.Document  ' get the back-end document for the document open on screen.
strFieldname = uidoc.CurrentField ' remember the current field if any
Set rti = doc.GetFirstItem("fieldname") ' insert your fieldname here, generally "Body"

' Make your rich text changes here, for instance:
Call rti.AddNewLine(1, True)
Call rti.AppendText(Now & ": log entry.")
If session.NotesBuildVersion >= 190 Then
rti.Update ' ND6 and later
Else
Call doc.ComputeWithForm(True, False) ' caution, as this may erase some field values if you have @Db functions in formulas.
End If
doc.SaveOptions = "0" ' make it possible to close the document without a "do you want to save" prompt. If this is a mail-in doc you may need to set MailOptions="0" also to avoid being prompted.
Call uidoc.Close(True)
Set uidocNew = wksp.EditDocument(True, doc, , , , True)
Delete uidoc
uidocNew.Document.RemoveItem("SaveOptions")
If strFieldname <> "" Then uidocNew.GotoField(strFieldname) ' return focus to field that was current before.
注: これにより、Queryclose、Queryopen、Postopen などのフォームイベントがトリガーします。また、uidoc.Refresh は計算結果フィールド式と入力確認も実行します。このため、@IsDocBeingSaved | @IsDocBeingSent が true でない限り、@Failure を返さないように確認式を作成してください。