[Notes/Domino] SetTargetFrame を使って文書をフレームに表示する場合の問題点
NotesUIWorkspace.SetTargetFrame を使って、文書を特定フレームに表示したいケースは多々あると思います。が、普通にコードを書いていても、よく解らないエラーに遭遇してしまうことがあります。
今回は、わたしが把握している SetTargetFrame を使用した場合の問題点と、解決法を紹介いたします。
同一フレーム内に文書を表示する場合
スクリプトを実行しているフレームに文書を表示しようとする場合、ComposeDocument の場合でも、EditDocument の場合でも、以下のエラーメッセージが表示されることがあります。
Target frame is ancestor of script object
この場合は、以下のように引数を追加するとうまくいくようです。
Call ws.ComposeDocument(db.Server, db.FilePath, "フォーム名", , , False)
Call ws.EditDocument(True, doc, False, "", False)
(ちなみに、この件は一応デザイナーヘルプにも書いてありますが、記述が解りづらいかもしれないので、あえて取り上げてみました。)
新規文書を EditDocument する場合
新規文書を EditDocument で表示しようとすると、エラーになる場合があります。
たとえば、以下のようなコードで新規文書を表示しようとする場合、
Dim ws As New NotesUIWorkspace Dim ss As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Set db = ss.CurrentDatabase Set doc = db.CreateDocument doc.Form = "フォーム名" Call ws.SetTargetFrame("フレーム名") Call ws.EditDocument(True, doc)
以下のエラーが表示されてしまいます。
Unable to find Document Window
この場合は、以下のように文書を保存するとエラーが出なくなります。
Dim ws As New NotesUIWorkspace
Dim ss As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = ss.CurrentDatabase
Set doc = db.CreateDocument
doc.Form = "フォーム名"
Call doc.Save(True, True)
Call ws.SetTargetFrame("フレーム名")
Call ws.EditDocument(True, doc)
……が、文書を保存したくないケースがほとんどだとは思いますので、以下のように ComposeDocument にしたほうがいいかもしれません。文書に値をセットしたい場合は、ComposeDocument の戻り値の NotesUIDocument 経由でセットするとよいでしょう。
Dim ws As New NotesUIWorkspace Dim ss As New NotesSession Dim db As NotesDatabase Set db = ss.CurrentDatabase Call ws.SetTargetFrame("フレーム名") Call ws.ComposeDocument(db.Server, db.FilePath, "フォーム名")
ただし、同一フレームに表示する場合は、最初に紹介したテクニックを使用すると、NotesUIDocument の戻り値が返ってこなくなります。どうしても同一フレームに表示したい場合は、環境変数で値を渡すしかないかな……? 他によいアイデアがあったら教えてください(> <)
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。