2010年2月22日月曜日

ブレークポイントを削除したい

Lotus Script をデバッグするときに、特定の行で F9 を押すなどしてブレークポイントを設定することがあります。

このブレークポイントは、ユーザープリファレンス - [基本]タブ - 追加のオプションの「LotusScript デバッガのブレークポイントを保持する」を有効にすると保持することができます。

ところで、どこに「保持」されるのでしょうか?

実はアプリケーション内に "breakpoint_" という名前のプロフィール文書として保存されています。

プロフィール文書は NotesPeek などで確認できますが、たまたま見たアプリケーションに自身が作成した "breakpoint_" が残っていたりすると、削除したい衝動に駆られてしまうのです...

小さいことですが、気になってしまうのはしょうがない。

そこで "breakpoint_" を削除するエージェントを作成しましたのでご紹介します。
(Options)
%INCLUDE "LSCONST.LSS"

Sub Initialize
    Dim ws As New NotesUIWorkspace
    Dim varDB As Variant
    On Error Goto ERRORTRAP
    varDB = ws.Prompt( 13, "選択", "アプリケーションを選択してください。" )
    If Isempty( varDB ) Then Exit Sub
    Dim db As New NotesDatabase( "", "" )
    If Not db.Open( varDB( 0 ), varDB( 1 )) Then Exit Sub
    Dim nc As NotesNoteCollection
    Set nc = db.CreateNoteCollection( False )
    nc.SelectProfiles = True
    Call nc.BuildCollection
    If nc.Count = 0 Then
        Print "プロフィール文書は見つかりませんでした"
        Exit Sub
    End If
    Dim dc As NotesDocumentCollection
    Dim doc As NotesDocument
    Set dc = db.GetProfileDocCollection("hogehoge") '0件で初期化
    nid = nc.GetFirstNoteId
    For i = 1 To nc.Count
        Set doc = db.GetDocumentByID( nid )
        If doc.NameOfProfile = "breakpoints_" Then
            Call dc.AddDocument( doc )
        End If
        nid = nc.GetNextNoteId( nid )
    Next
    Dim intCount As Integer
    intCount = dc.Count
    If intCount > 0 Then
        Call dc.RemoveAll( True )
        Print Cstr( intCount ) & " 件の breakpoint_ を削除しました。"
    Else
        Print "breakpoint_ は見つかりませんでした"
        Exit Sub
    End If
FINAL:
    Exit Sub
ERRORTRAP:
    Print Getthreadinfo( LSI_THREAD_PROC ) & ", " & Erl & ", " & Err & ", " & Error
    Resume FINAL
End Sub

ところで、このエージェントをテストしようと以前のエントリの関係で作ったアプリケーションを選択したところ nc.BuildCollection で「フィールドが大きすぎる(32K)、またはビューの列と選択式が大きすぎます。」というエラーになりました。
(ODSバージョンが 43 (R6)で Local にあるアプリケーション、クライアントは 8.0.1 のBasic版)

まあ 32K制限に引っかかる文書がアプリケーション内にある場合、関係のないNoteCollectionのビルドでもエラーになることもあるのね、ということで深入りしないことにします...

そんなアプリケーションでもどうしても削除した場合は NotesPeek 等で noteID を調べて NotesDatabase.GetDocumentByID( "noteID" ) で取得した文書を削除してください。

0 件のコメント:

コメントを投稿