当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2009年1月30日金曜日

OLEオブジェクトを起動する

今日はオブジェクトについて、ほんのちょこっとだけ触れてみます。
ノーツのリッチテキストにはファイルをそのまま添付するだけでなく、埋め込みオブジェクトとしても添付することが出来ます。

今回は、リッチテキストフィールドに存在している埋め込みオブジェクトを起動してみるというサンプルです。
添付ファイルを起動しようとする場合、CreateObject関数でその添付ファイルのオブジェクトクラスを作成して、その中で起動処理を行うため、LotusScript以外にVBA等の知識が必要になってきます。
埋め込みオブジェクトの場合、LotusScriptだけで起動が出来るので、覚えておきましょう。


Sub Click(Source As Button)
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim ritem As NotesRichTextItem
Dim eobj As NotesEmbeddedObject
Dim handleV As Variant

'自文書の取得
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

'自文書の中のBodyアイテムを取得
Set ritem = doc.GetFirstItem( "Body" )

'アイテムがリッチテキストかどうかを判断する
If ritem.Type = RICHTEXT Then
'リッチテキストの中の全オブジェクトを取得
Forall x In ritem.EmbeddedObjects
Set eobj = x
'オブジェクトを実行
Set handleV = eobj.Activate( True )

'このまま処理をすると、アプリケーションが終了してしまうので、処理を一時中断する
Messagebox "処理待ち", 0, "オブジェクトの起動"
End Forall
End If
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月29日木曜日

文書サイズを取得する

今日は簡単なサンプルです。
文書のサイズを取得するものです。

NotesDocumentクラスのSizeプロパティを利用するだけなのですが、気をつける点があります。
それは、ビューで使用する場合と、文書を開いている状態で使用する場合とで、結果が異なると言うことです。
文書を開いているときの方がSizeは大きくなります。
表示用の計算結果フィールドが追加されるのが主な原因ではないでしょうか。

文書のサイズで、処理を分けるという場合にはこの点も注意しましょう。

サンプルは、2種類用意しました。と言っても、文書を開いたときのものと、ビューで文書を選択したときという違いなだけです。


Sub Click(Source As Button)
'文書を開いた状態で実行するサンプル
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument

Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

Messagebox "文書サイズは、『" & doc.Size & "』バイトです。", 0, "結果"
End Sub

Sub Initialize
'ビューで文書を選択して実行するサンプル
Dim session As New NotesSession
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument

Set db = session.CurrentDatabase
Set docs = db.UnprocessedDocuments
Set doc = docs.GetFirstDocument

Messagebox "文書サイズは、『" & doc.Size & "』バイトです。", 0, "結果"
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

突然ですがレイアウトを変えてみました

なんとなく、前のレイアウトが気に入らなかったので変更してみました。
いつも見ていただいている方、「あれ?違うサイトかな?」なんて思ってしまったらごめんなさい。

レイアウトは変わりましたが、内容はこれまで通り、ゆる~いサンプルを中心にお送りしていきます。

引き続き、ごひいきの程、お願いします。

2009年1月28日水曜日

8.5のクライアント

Lotus Notes 8.5をインストールした話は先日しました。

Notesクライアントはぱっと見、「どこが変わったんだろう?」というくらいです。
Domino Designerは、あからさまに変わりました。Eclipseベースになってますね。
正直なところ・・・使いづらいです。反応が遅いんですよね。

ちなみに、こんな感じ。


よぉく見ると、あちこちにEclipseの面影があります。

そして、Domino Administrator。
あれ?変わってない・・・っていうかEclipseベースになってないぞ?
えぇっ。いいのかぁ。まぁ、AdministratorをEclipseにする理由はないけどさぁ。
UIがバラバラでしょうがぁ。

使いやすいから良いんですけどね。
どうなんでしょ?

2009年1月27日火曜日

Javaで文書を作成する

いやぁ、ホントにネタがなくなった。
あるにはあるんだけど、今更載せるのか?っていうネタばっかり。
ホントにブログの構成間違ったなぁ。

ということで、Javaのサンプルを作成してみた。

JavaでACLの内容を表示するのサンプルで作成した様に、Javaエージェントとして作成してある。
DBにボタンを配置して、その中の式を
@Command([ToolsRunMacro];"エージェントの名前")
とする。

これで、実行すると、自DBの中に文書を作成するというものになっている。
DIIOPを動かさなくても良いので、気軽に試してみてほしい。


import lotus.domino.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)
Database db = agentContext.getCurrentDatabase();
Document doc = db.createDocument();
doc.replaceItemValue( "Subject", "Javaで作成した文書" );
doc.replaceItemValue( "Categories", "Documentクラス" );
doc.replaceItemValue( "Sections", "メソッド" );
doc.save( true );
} catch(Exception e) {
e.printStackTrace();
}
}
}

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月26日月曜日

配列の内容を検査する

配列の内容を検査するというサンプルを作ってみました。
Arraygetindexという関数で、実現できます。
この関数は配列の中を検査して、該当する内容があったら、配列のどこにあったのかを返してくれるものです。

サンプルは、入力した文字列が決まった配列の中にあるかどうかを検査するものです。
工夫すれば、ノーツ文書の複数値を許可しているフィールドの中も検査できる様になるでしょう。


Sub Click(Source As Button)
    Dim hairetsu( 5 ) As String
    Dim kensamoji As String
    Dim ret As Variant
    
    '配列の中身の決定
    hairetsu(0) = "いちご"
    hairetsu(1) = "りんご"
    hairetsu(2) = "みかん"
    hairetsu(3) = "ばなな"
    hairetsu(4) = "ぶどう"
    hairetsu(5) = "すいか"
    
    '検査したい文字列の入力
    kensamoji = Inputbox( "検査したい文字列を入力してください。", "検査文字列の入力" )
    
    '配列の検査
    ret = Arraygetindex( hairetsu, kensamoji, 1 )
    
    '検査結果の表示
    If Isnull( ret ) Then
        Msgbox "入力した文字列【" & kensamoji & "】は、配列の中に見つかりませんでした。", 0, "配列の内容を検査する"
    Else
        Msgbox "入力した文字列【" & kensamoji & "】は、配列の" & ret & "番目に見つかりました。", 0, "配列の内容を検査する"
    End If
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月23日金曜日

入力された値が数値かどうか調べる

先ほど、ドミノ懇談室で、Re: 数値を指定するという記事を書いたが(あ。本名だよ。ま、いっか)、ちょっとこれの解説をしようと思う。

@Matches関数は、文字列が特定のパターンと一致するかどうかを調べる関数です。
ここでは、数字(0~9の文字と仮定します)以外はNGとするので、パターンは{0-9}となります。注意するのは、"{0-9}"と"で囲う点です。
また、文字列はtestフィールドなので、そのまま指定します。

とすると、
@Matches(test;"{0-9}")で、testフィールドの文字列が数字かどうかを判断できます。
しかし、サンプルを見ると、これだけで終わっていません。
どういうことか?
"{0-9}"というのは、1文字分なのです。
よって、
@Matches(test;"{0-9}")では、testフィールドに2文字以上入力されていたら全部NGになってしまうのです。
これでは困るので、今回の要件である「4文字以内」という所に着目して、サンプルの様に、"{0-9}"を1つの場合から4つの場合まで書いているのです。
これで、1文字、2文字、3文字もしくは4文字であればOKとなるわけです。



Rem {数字とは、0-9のいずれかを指すものとする。-(マイナス)や,(カンマ)、.(小数点)は含まない。};
str1 := @Matches(test;"{0-9}");
str2 := @Matches(test;"{0-9}{0-9}");
str3 := @Matches(test;"{0-9}{0-9}{0-9}");
str4 := @Matches(test;"{0-9}{0-9}{0-9}{0-9}");

@If(str1=1|str2=1|str3=1|str4=1;@Success;@Failure("4桁以内の数字を入力してください。"))


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

フィールドに値を追加する

使えるネタがあと僅かになってきました。
一年分くらいはあると思ってたのに・・・

筆者のネタは、自分でNotes DBを製造する際、LotusScriptや@関数の使い方のイメージが沸かないときにサンプルとして、自作したものです。
ヘルプを読んだだけでは分からないときに良くやります。
ホットスポットボタンを配置して、そこにプログラムを書くだけなので簡単にできます。
自称、初心者の方にお勧めです。

閑話休題。

さて、今日はフィールドに文字を追記する方法を紹介しましょう。
テキストフィールドだろうと、リッチテキストフィールドだろうとできるお手軽なものです。
ただし、NotesUIDocumentクラスのメソッドなので、文書が編集モードで開いていることが条件になります。

サンプルは、編集モードで開くのが面倒だったので、わざわざ新規文書を作成して、そこに文字を追記する様にしています。
メソッドの書式と動きが分かれば良いので、このような形になっています。


Sub Initialize
    Dim uiws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    
    'テキストを追加するための文書を作成しておく。
    Set uidoc = uiws.ComposeDocument( "", "", "MainTopic" )
    
    '追加する内容を入力させる。
    res = Inputbox ( "何か入力してください。", "追加するテキスト", "省略時の値です。" )
    
    'Bodyフィールド(リッチテキスト)の一番後ろに追加する(この場合は、Bodyはnullなので、入力した内容だけが表示される)
    Call uidoc.FieldAppendText( "Body", res )
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月22日木曜日

リッチテキストで文字の効果を変更する

まだ8.5が使い慣れないので、紹介できません。ごめんなさい。
ということで、今日もサンプルプログラムです。

リッチテキストフィールドに文字を追記する方法です。
せっかくリッチテキストフィールドに文字を追記するのだから、フォントの種類を変更してみたいですね。
そういうときに使うのが、NotesRichTextStyleクラスです。
このクラスのプロパティをセットすることで、この後に追加した文字がそのように変わってくれるのです。

サンプルは、自文書の返答文書を作成して、その中のリッチテキストフィールドに色々な文字列を追記しています。
サンプルでは、フォントの形を変えているだけですが、大きさや種類、色も変更することが出来ます。
詳細はデザイナーヘルプを見てください。

※なお、リッチテキストフィールドは文書を保存しないと有効にならないので、このような形のサンプルになっています。気をつけてください。

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim uiws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim resdoc As NotesDocument
    Dim resritem As NotesRichTextItem
    Dim rstyle As NotesRichTextStyle
    
    '自文書の返答文書を作成する
    Set db = session.CurrentDatabase
    Set uidoc = uiws.CurrentDocument
    Set doc = uidoc.Document
    Set resdoc = db.CreateDocument
    Call resdoc.MakeResponse( doc )
    
    '返答文書にフォーム情報を与える
    resdoc.Form = "Response"
    resdoc.SUbject = "バックグラウンドで作成した文書"
    Call resdoc.ComputewithForm( True, False )
    
    '返答文書内のリッチテキストフィールドを使用する
    Set resritem = New NotesRichTextItem( resdoc, "Body" )
    
    'リッチテキストフィールドで使用するスタイルを呼び出す
    Set rstyle = session.CreateRichTextStyle
    
    '太文字で文字を追記する
    rstyle.Bold = True
    Call resritem.AppendStyle( rstyle )
    Call resritem.AppendText( "ここは太文字" )
    
    '改行する
    Call resritem.AddNewLine(1)
    
    '標準文字で追記する
    rstyle.Bold = False
    Call resritem.AppendStyle( rstyle )
    Call resritem.AppendText( "ここは標準文字" )
    
    '改行する
    Call resritem.AddNewLine(1)
    
    '斜体字で追記する
    rstyle.Italic = True
    Call resritem.AppendStyle( rstyle )
    Call resritem.AppendText( "ここは斜体字" )
    
    '文書を保存する
    Call resdoc.Save( True, True )
    
    Msgbox "文書を保存しました。ビューを更新してください。", 0, "リッチテキストで文字の効果を変更する"
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月21日水曜日

サンプルアプリケーションを登録しました

筆者の作成したサンプルアプリケーションを
株式会社エフのHP
に登録しました。
指定したNotes DB内の文書データをCSVに書き出すというものです。
わざわざビューを作成したり、CSVの書き出しロジックを追加したりしなくても良い様になっています。

サポートはしませんが、設計公開型なので、自由にカスタマイズできる様になっています。

興味がある方は、覗いてみてください。
〈製品とサービス〉〈Lotus Notes/Domino関連サービス〉からダウンロードできます。


※2014年1月にサンプルの公開は終了させていただきました。

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

1万アクセス突破!!

気がついたら、1万アクセスを超えました。
アクセス5,000件突破!を書いたのが、2008年11月11日ですから、2ヶ月ちょっとで5,000件のアクセスがあったわけです。
ブログを書き始めた頃には想像できない数字ですね。めちゃくちゃ嬉しいですね。

この数字に恥じないように、もっと皆様のお役に立てるような記事を書いていきますので、よろしくお願いします。

ビューの列の値を表示

今日はNotesViewEntryクラスを使ったサンプルです。
筆者はあまりこのクラスを使うのが好きではなく(理由はないんだけどね)、
よく分かっていないのだが、掲示板等を見ると、このクラスを使えば良いんじゃない?
というような回答を見かけるので、この際、サンプルをこしらえてみよう。
ということで、作ってみました。

サンプルは、($All)というビューに表示されている列の値を取得して、プロンプト表示するというものです。
DB内に文書が多数あると表示しきれないので、3エントリごとに改行するという工夫をしています。


Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim ventrys As NotesViewEntryCollection
Dim ventry As NotesViewEntry
Dim i As Integer
Dim ret As String

'ビューを取得して、そこから全エントリを取得
Set db = session.CurrentDatabase
Set view = db.GetView( "($All)" )
Set ventrys = view.AllEntries

Set ventry = ventrys.GetFirstEntry
i = 0
'ビュー全エントリから一つずつエントリを抜き出していく
Do While Not ( ventry Is Nothing )
i = i + 1
'1エントリずつ改行すると表示しきれないので、3の倍数の時だけ改行する
If i Mod 3 = 0 Then
ret = ret & Cstr( i ) & "." & ventry.ColumnValues(2) & Chr$(10)
Else
ret = ret & Cstr( i ) & "." & ventry.ColumnValues(2) & Chr$(9)
End If
Set ventry = ventrys.GetNextEntry( ventry )
Loop

Messagebox ret, 0, "ビューの列の値を表示"
End Sub

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月20日火曜日

1Byteと2Byteの長さの違い

今日は、1バイト文字と2バイト文字の長さについて考察してみよう。

よくフィールドに入力できる文字列の長さを制限したい。ということがある。
そのような時に使う関数として、Len関数がある。
しかし、これには派生した関数がある。LenB関数とLenBP関数だ。

それぞれ違う結果を返すので、気をつけて使わないと正しい入力チェックができないのだ。
サンプルを見てほしい。
"----*----1----*----2"という文字を1バイトや2バイト文字で表現した場合、それぞれの関数がどういう値を返すのかを表示するものだ。
下図は実際に実行した画面だ。返す値が違っているのが分かってもらえると思う。

1バイト文字と2バイト文字を同じ1文字と考えるのか、そうでないのかを決めた上で、どの関数にするかを決めてほしい。


【サンプルを実行した結果】
1バイト文字の長さ


2バイト文字の長さ


1バイトと2バイト文字をミックスした文字列の長さ



Sub Click(Source As Button)
Dim tmp As String

tmp = "----*----1----*----2"
Msgbox "tmp = " + tmp + Chr$(13) + _
"Len = " + Cstr(Len(tmp)) + Chr$(13) + "LenB = " + Cstr(Lenb(tmp)) + Chr$(13) + "LenBP = " + Cstr(Lenbp(tmp)), 0, _
"1Byte String"

tmp = "----*----1----*----2"
Msgbox "tmp = " + tmp + Chr$(13) + _
"Len = " + Cstr(Len(tmp)) + Chr$(13) + "LenB = " + Cstr(Lenb(tmp)) + Chr$(13) + "LenBP = " + Cstr(Lenbp(tmp)), 0, _
"2Byte String"

tmp = "----*----1----*----2"
Msgbox "tmp = " + tmp + Chr$(13) + _
"Len = " + Cstr(Len(tmp)) + Chr$(13) + "LenB = " + Cstr(Lenb(tmp)) + Chr$(13) + "LenBP = " + Cstr(Lenbp(tmp)), 0, _
"1,2Byte Mix String"
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月19日月曜日

数値の判断

8.5のインストールはつつがなく終わってしまい、あまり面白いこともなかったので・・・
とりあえず、普通にネタを披露します。
と言うほどのものでもないんですが・・・

今回は、数値の判断です。
入力した値やフィールドの値が数値かどうかを判断するものです。
小数点(.)やカンマ(,)、マイナス(-)なども判断してくれるので、結構便利に使えるのではないでしょうか?
サンプルは、プロンプトから入力した値が数値なのかそうでないのかを返すというものです。



Sub Click(Source As Button)
'数値型の変数の定義
Dim res As Variant

'入力形式のダイアログボックスの表示
res = Inputbox( "何か入力してください。", "数値の判断" , "" )

If Isnumeric( res ) Then
'数値が入力されれば、次のメッセージが表示される
Messagebox "数字を入力しましたね。", 0, "数値の判断"
Else
Messagebox "数値以外を入力しましたね。", 0, "数値の判断"
End If
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

Notes Domino8.5をダウンロードしましたよ

まだ8.0.xの事もよく分かっていないのに、8.5がリリースされてしまいましたね。
これで、6.5.x、7.0.x、8.0.x、8.5と4つのバージョンがサポートされることになったんですね。
大丈夫なのかなぁ?IBMさん。

などという心配はさておいて、とりあえず8.5をダウンロードしました。
8.0の学習は8.5の中でまとめていくことにしましょう。

今は8.0なので、それを8.5にバージョンアップすることから始めます。
変わったところがあれば、そこを記事にして書きますので、期待しないで待っててくださいね。

2009年1月16日金曜日

Excelを起動してブックに入力する

書いた気がしていたのだが、書いていなかったので紹介しましょう。
今回は、Excelとの連携です。
と言っても、LotusScriptからExcelを起動して、ブックに書き込むというものです。

サンプルは、Excelを起動して、ブックに文字と式を書き込むというものです。



Sub Click(Source As Button)
Dim ExcelObject As Variant


'Excelの起動
Set ExcelObject = CreateObject( "Excel.Application" )
ExcelObject.Visible = True


'エラーチェック
If ExcelObject Is Nothing Then
Msgbox"Excelがインストールされていません。"
Exit Sub
End If


'Excelファイルに埋め込む
With ExcelObject
.Workbooks.Add
.Range("A2").Select
.ActiveCell.FormulaR1C1 = "A"
.Range("A3").Select
.ActiveCell.FormulaR1C1 = "B"
.Range("A4").Select
.ActiveCell.FormulaR1C1 = "C(A+B)"
.Range("B2").Select
.ActiveCell.FormulaR1C1 = "1"
.Range("B3").Select
.ActiveCell.FormulaR1C1 = "2"
.Range("B4").Select
.ActiveCell.FormulaR1C1 = "=R[-2]C+R[-1]C"
.Range("B5").Select
End With
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月15日木曜日

OSの環境変数の取得

今回はOSの環境変数(下図参照)の取得を行ってみましょう。


Environ関数を使います。引数に取得したい変数の名前をしていするだけの簡単な関数です。
指定した変数の値が返ってきます。

また、設定されている環境変数を全部取得したい場合は、変数名の代わりに1~255のいずれかの数値を指定することも可能です。
この場合は、n番目の変数の名前とそこに設定してある値が xxx = zzzzzzという形で返ってきます。

ユーザ環境変数とシステム環境変数に同じ変数が設定されている場合、ユーザ環境変数が有効になるので、取得できる値もユーザ環境変数のものになります。

サンプルは単純にするために、"windir"という名前の環境変数の値を取得しています。

Sub Click(Source As Button)
    Dim ret As Variant

    ret = Environ("windir")
    Msgbox "windir = " + ret, 0, "OSの環境編集の取得"
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月13日火曜日

ファイルの書き出し2

出てきたネタの中に、ファイルの書き出しについての記述があったので、今回はそれを紹介しよう。
以前、ファイルの書き出しで紹介しているんじゃないの?という方もいるかもしれない。

今回との違いは、Print #ステートメントとWrite #の違いによるものです。
どちらもデータをシーケンシャルファイルに書き出すものですが、
Write #は、複数のデータを","(カンマ)で区切って書き出せるのです。
Print #の場合、指定したデータをそのまま出力するのです。

結果として、Write #の場合、データがそれぞれ""(ダブルクォーテーション)で囲まれて出力されます。
サンプルは、前回紹介したもののPrint #をWrite #にしただけです。
実際に実行してみて違いを比べてみてください。

------------------------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim fileNum As Integer
Dim i As Integer

Set db = session.CurrentDatabase
Set docs = db.AllDocuments

'ファイル番号を割り当てる
fileNum% = Freefile()

'出力用にファイルをオープンする
Open "c:\script.txt" For Output As #fileNum%

'全文書数分の繰り返し
For i = 1 To docs.Count
Set doc = docs.GetNthDocument( i )
'ファイルに出力する
Write #fileNum%, Cstr( i ) + "." + doc.Subject(0)
Next

'ファイルをクローズする
Close #fileNum%
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月9日金曜日

文書に目次をつける


今回は趣向を変えて、ノーツ文書の便利な編集方法というものを紹介してみましょう。
文書を作成していて、1画面に収まらず下方向にスクロールをしないと全部見えない場合に、使うと便利な方法です。

1.文書を作成する
  通常通り文書を作成しましょう。
  図形を貼り付けても良いし、添付ファイルを貼り付けても良いです。セクションもつけて構いません。

2.文書を保存する
  とりあえず、作成した文書を保存しましょう。
  この時、段落ごとにタイトルをつけておくようにしましょう。

3.文書を編集モードで再度開きなおす
  文書を保存しただけで、閉じていない場合は、この操作は不要です。

4.本文の一番最初に目次を作成する
  本文の先頭部分に、各段落のタイトルだけを書きましょう。












5.アンカーリンクを作成する
  段落のタイトルの後ろにカーソルを合わせます。
  「編集」「リンクのコピー」「アンカーリンク」メニューをクリックします。
  リンクのタイトルを決めるダイアログが表示されるので、そのまま[OK]をクリックします。
  すると、行の先頭に、アンカーを指す画像アイコンが表示されます(これは触らないでね!)。






6.目次にアンカーリンクを貼り付ける
  文書の先頭にある目次に戻ります。
  そうしたら、アンカーリンクのタイトル部分を全部選択します。
  「作成」「ホットスポット」「リンク」メニューをクリックします。
  アンカーリンクを貼り付けた部分(文字列)が青文字に変わります。



7.他の段落もアンカーリンクを作成して目次に貼り付ける
  5.と6.の作業を繰り返して、すべての段落にアンカーリンクを作成します。

8.文書を保存する
  アンカーリンクがすべて作成できて、目次にも貼り付けられたら、必ず文書を保存します。
  この時、文書は保存しながら閉じましょう。

9.文書を開きなおす
  文書は編集モードでなく、読み込みモードで開きなおします
  (ビューで文書をダブルクリックすれば、読み込みモードで開きます)。
  目次にある段落タイトル名をクリックしてください。
  ほら。その段落に移るでしょ?これで、なが~い文書も読みやすくなりますね。

2009年1月8日木曜日

ホットスポットリンクを作成

今回は、リッチテキストフィールドにホットスポットリンクを作成するというサンプルを提供します。

ポイントは、NotesRichTextItemクラスのAppendDocLinkメソッドです。


このメソッドの3番目の引数に、文字列を指定することで、その文字列に囲み線がついたホットスポットリンクになります(左図を参照)。


リッチテキストを操作する場合、文書を保存した後、閉じないと反映されないという性格上、
自文書ではなく、返答文書を作成して、そこのリッチテキストにホットスポットリンクを作成するというサンプルにしてあります。

-----------------------------------------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim resdoc As NotesDocument
Dim ritem As NotesRichTextItem

'自文書の設定
Set db = session.CurrentDatabase
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

'新規に文書を作成した後、返答文書として位置づける
Set resdoc = db.CreateDocument
Call resdoc.MakeResponse( doc )

'スクリプトで文書を作成した場合、フィールドに何も設定されないので自分で設定する
resdoc.Form = "Response"
resdoc.Subject = "文字列にホットスポットリンクを作成"

'ファイルをリッチテキスト(Bodyフィールド)に添付する
Set ritem = New NotesRichTextItem( resdoc, "Body" )
Call ritem.AppendDocLink( doc, "親文書のリンクです", "親文書へのリンク" )

'文書の保存
Call resdoc.Save( True , True )
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月7日水曜日

notes.iniの環境変数のセット

今日二発目です。
一発目がnotes.iniの環境変数の取得だったので、今度はnotes.iniの環境変数のセットをやってみましょう。

取得がGetEnvironmentVarだったのに対して、SetEnvironmentVarになります。

サンプルは、$TestDataという環境変数に"1"をセットするものです。
これを実行すると、notes.iniに
$TestData=1
という行が追加されます。

Sub Click(Source As Button)
    Dim session As New NotesSession

    '三つ目のパラメータにFalseを指定すると、環境変数名の頭に$をつけたものになる
    Call session.SetEnvironmentVar("TestData", "1", False )
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

notes.iniの環境変数の取得

今回は、notes.iniの変数の取得についてです。
notes.iniに環境変数をセットしたり、セットしてある環境変数を取得したりする方法です。

notes.iniの環境変数には2種類ある。$で始まるユーザ環境変数と、それ以外のシステム環境変数です。
サンプルでは、このうちシステム環境変数の値を取得して、プロンプト表示するものです。

※@関数の@Environmentでは、ユーザ環境変数は取得できるが、システム環境変数は取得できないので、注意してほしい。

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim env As String

    '二つ目のパラメータにTrueを指定しないと、環境変数名の頭に$をつけてしまうので、注意
    env = session.GetEnvironmentString( "Directory", True )
    Messagebox _
    "Notes.iniの環境変数Directoryの値は、" & Chr$(10) & env & Chr$(10) & "です。", _
    0, "環境変数の取得"
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月6日火曜日

読者フィールドを変更する

ネタが切れかけていたのですが、眠っていたネタが見つかったので、もうしばらく持ちネタにお付き合いください。

今回は、読者フィールドの変更についてです。
作成者フィールドを変更するでは、作成者フィールドを変更する方法を紹介していますが、これに似ていますね。
違うのは、IsAuthorsプロパティではなくIsReadersプロパティを使うことだけ。

なお、読者名フィールドや作成者フィールドにセットする名前は、正規形(CN=xxxx xxxx/O=yyyy)になっている必要があります。省略形(xxxx xxxx/yyyy)でセットすると名前と認識されずに、誰にも見えなくなってしまうということが起こりかねませんので、注意してください。

サンプルは、ビューで選択した文書の「readers」というフィールドに任意の読者名をセットするというものです。readersフィールドは、IsReadersプロパティをTrueにすることで、読者名フィールドとなります。

左図は文書のプロパティを示した画面です。readersというフィールドが読者名フィールドであることを示しています(赤枠部分)。

-------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim item As NotesItem
Dim i As Integer

Set db = session.CurrentDatabase
Set docs = db.UnprocessedDocuments

For i = 1 To docs.Count
Set doc = docs.GetNthDocument( i )
Set item = doc.GetFirstItem( "readers" )

doc.readers = "任意の読者名"
item.IsReaders = True
Call doc.Save( True, True )
Next
End Sub


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2009年1月5日月曜日

データベースの検索5

新年あけましておめでとうございます。
2009年ですね。まぁ、別になんにもないんですが・・・

今年もゆる~いサンプルをお届けして参りますので、よろしくお願いします。

さて、一発目は、まだ紹介していなかったのがあったのか!?というデータベース検索です。
NoteIDによる検索です。
GetDocumentByIDというメソッドです。
このNoteIDというのは、また厄介なもので、同じレプリカIDのDBでも、違うIDになるのです。
なので、このメソッドを使って検索する場合、レプリカには対応できないと言うことを注意してください。

サンプルは、自文書のNoteIDを使って、NotesDBを検索して、そこから文書のタイトルをプロンプト表示するものです。
自分自身を検索するので、あまり良いサンプルとは言い難いですが、そこは応用を利かせてみてください。

---------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim uid As String

Dim db As NotesDatabase
Dim doc2 As NotesDocument

'現在の文書の文書IDを取得する
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document
uid = doc.NoteID

'自DBで、文書IDを元に文書を検索する
Set db = session.CurrentDatabase
Set doc2 = db.GetDocumentByID( uid )

Messagebox "文書のタイトルは、『" + doc2.Subject(0) + "』です。", 0, "データベースの検索"
End Sub

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ