2010年3月9日火曜日

ビューでチェックを付けた順に番号を付けたい

懇談室のこのエントリについて考えてみました。

質問者のバージョンは6.5なので「できない」と回答しています(いじわるじゃないですよ)が、8 では OnSelect というビューのイベントが追加されています。

ヘルプによると、このイベントが発生するのは
・ビューが開くとき
・選択マージンでチェックマークを使用して文書を選択/選択解除したとき
・選択された行をクリックするとき
とのこと。

ビューで文書を1つ選択するたびにこのイベントが発生するなんて...なんだかパフォーマンス悪そうな予感....

ビューで「選択された」文書をこのイベントで取得したい場合、ハイライト表示されている文書は CaretNoteID を利用して簡単に取得することができますが、(ハイライトされていないけど)チェックマークをつけた1文書を取得するには工夫が必要です。

次のLotusScriptのサンプルでは、選択マージンでチェックマークを付けた時にその文書の NoteID をリスト変数へ追加します(NoteID が既にリストにある場合は追加しません)。

その後、ビューのアクションボタンを押すとリスト変数へ追加した順番に番号付けします。
'ビューの(Globals) (Declarations)
Dim ws As NotesUIWorkspace
Dim ss As NotesSession
Dim num%
Dim idlist List As Long

'ビューの(Globals) Initialize
Sub Initialize
    Set ws = New NotesUIWorkspace
    Set ss = New NotesSession
End Sub

'ビューのイベント Onselect
Sub Onselect(Source As Notesuiview)
    Dim dc As NotesDocumentCollection
    Dim doc As NotesDocument
    Set dc = Source.Documents
    Set doc = dc.GetFirstDocument
    While Not ( doc Is Nothing )
        If Not Iselement( idlist( doc.NoteID ) ) Then
            num = num + 1
            idlist( doc.NoteID ) = num
            Exit Sub
        End If
        Set doc = dc.GetNextDocument( doc )
    Wend
End Sub

'ビューのアクション「選択順に番号を付ける」
Sub Click(Source As Button)
    Dim doc As NotesDocument
    Dim db As NotesDatabase
    Set db = ws.CurrentDatabase.Database
    Forall o In idlist
        Set doc = db.GetDocumentByID( Listtag( o ) )
        doc.num = o
        Call doc.Save( True, False )
    End Forall
    num = 0
    Erase idlist
    Call ws.ViewRefresh
    Call ws.CurrentView.DeselectAll
End Sub
とっても手抜きなので、選択マージンをマウスでなぞったり、チェックマークをを消したり、Ctrl + A などで一度にチェックを付けたり、などなどには対応していません...orz

0 件のコメント:

コメントを投稿