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

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

2011年1月27日木曜日

リッチテキスト内の特定の文字属性を変更する

8.5の資格試験の勉強中ですが、なにやら頭がパンクしそうです。
中級の資格の中に、xPagesとか盛り込まないで欲しい!と思っているのは筆者だけではないはずです。
上級がLotusScriptっておかしいよなぁ。まぁ、筆者はLotusScriptの試験は合格済みなので、アップデートすれば良いだけなのですが。


ということで、恒例のクリックの時間です。昨日、クリックした方もそうでない方もクリックしてくださいね。
にほんブログ村 IT技術ブログへ


さて、今日もどこぞの懇談室の話題について書いてみます。
既存の文書のリッチテキストの内容を変更してみるというものです。

NotesRichText関連のクラスは、たくさんあり、それぞれの役目がどういったものなのか難しいので、使いこなすのが大変かと思いますが、今回は以下のように考えます。
  1. リッチテキストの中を検索する(NotesRichTextNavigatorクラス)。
  2. 変更後のスタイルを決定する(NotesRichTextStyleクラス)。
  3. 変更したい範囲を決定する(NotesRichTextRangeクラス)。
  4. 範囲に対して、スタイルをセットする(NotesRichTextRangeクラス)。


では、サンプルです。
以下のサンプルは、エージェントとして作成してあります。
ビューで選択した文書の、"Body"というリッチテキストフィールド中のフォントスタイルを変更するというものです。
変更する文字列は、「あいうえお」で始まり、「さしすせそ」の前にある文字までです。
「さしすせそ」の文字は変更対象にならないことに注意してください。

また、サンプルはエラー処理とかは施していませんので、実際に利用する際は、注意してください。
Sub Initialize
    Dim session As New NotesSession
    Dim curdb As NotesDatabase
    Dim docs As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim ritem As NotesRichTextItem
    Dim rnavi As NotesRichTextNavigator
    Dim rrange As NotesRichTextRange
    Dim rstyle As NotesRichTextStyle
    
    '現在の文書及びリッチテキスト取得
    Set curdb = session.CurrentDatabase
    Set docs = curdb.UnprocessedDocuments
    Set doc = docs.GetFirstDocument
    
    'リッチテキストスタイルの作成
    Set ritem = doc.GetFirstItem( "Body" )
    
    ' リッチテキストナビゲータの作成
    Set rnavi = ritem.Createnavigator() '文字列検索用
    Set rrange = ritem.Createrange() '文字範囲指定用
    Set rstyle = session.CreateRichTextStyle() '文字スタイル用
    
    'リッチテキストのスタイルを変更する
    rstyle.Notescolor = COLOR_RED
    rstyle.Italic = True
    
    ' リッチテキスト内の文字列の検索
    If rnavi.FindFirstString( "あいうえお" ) = True Then
        '検索した最初の文字を、範囲の最初に位置づける
        Call rrange.Setbegin( rnavi )
        '範囲の最後の文字列の検索
        If rnavi.FindFirstString( "さしすせそ" ) = True Then
            '検索した文字の前の文字を、範囲の最後に位置づける
            Call rrange.Setend( rnavi )
        End If
        
        '設定したスタイルを範囲にセットする
        Call rrange.Setstyle( rstyle )
    End If
    
    '文書を上書き保存する
    Call doc.Save( True, True )
End Sub



【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2011年1月26日水曜日

リストの中の最小値を取得する

1月も終わりが近づいてきました。そろそろ花粉の時期です。筆者は万年アレルギー症らしいので、すでに準備はできています!?
今年は花粉の量が多いと騒がれているようなので、早めに対策をしましょう。

ということで、こちらのボタンをクリックしましょう。花粉対策が見つかるかもしれません。
にほんブログ村 IT技術ブログへ


さて、今日はどこぞの懇談室に出ていた質問の回答を探ってみました。
リストの中の最小値を取得すると言うことです。
最小値なので、@Minかなぁとか思うのですが、デザイナーヘルプを読むと、「1つのリスト内で最小の数値、または2つの数値や2つの数値リストの小さい方の数値が返されます。」とあります。つまり、数値を対象とした関数であることが分かります。
となると、日付は使えません。

ここは、1つ考え方を変えてみます。
最小値が分かるには・・・そう、小さい順に並べればよいのです。
幸い、ノーツにはリリース6から追加された「@Sort」というソート用の関数があります!さすが!
これを使ってみましょう。

以下は、サンプルとその実行結果です。
date_1 := @TextToTime("2011/01/03");
date_2 := @TextToTime("2011/01/12");
date_3 := @TextToTime("2011/01/05");
date_4 := @TextToTime("2011/01/01");
date_5 := @TextToTime("2011/01/25");
date_6 := @TextToTime("2011/01/07");

tmp := @Sort(date_1:date_2:date_3:date_4:date_5:date_6);
@Prompt([Ok];"最小値";@Text(tmp[1]))


確かに、日付の中で1番小さいものが表示されます。
ここで気をつけて欲しいのは、このリストの中に、空白が含まれている場合は、エラーになると言うことです。

値が空白の場合は、@Sort関数のリストに含めないようにするなどの工夫が必要です。


ということで、今日はこの辺で・・・


【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2011年1月24日月曜日

金曜日(2011/1/21)はテクてくで懇親会がありましたよ

ツイッターでも何名かがつぶやいているように、3/2にLotusphere comes to you 2011が開催されます。
筆者も行きます。皆さんも今からスケジュール調整をして是非来場しましょう!
ちなみに、その日は筆者の4x歳の誕生日です。見かけたら祝ってやってください(笑)


さてさて、先週の金曜日はテクてくLotusの夜会がありました。
今回は、Dojoについてのお話しとハンズオンでした。普段は、ハンズオンには出席せずにBOFという製品についての話し合いに参加するのですが、さすがにDojoはほとんど手を付けていないので、おさらいということでハンズオンに出席したのでした。
なお、Dojoについては、IBMのdeveloperWorksJapanのサイトの中に、Dojoツールキット・ファンというページがあります。
また、CodeZineというサイトの中にもDojo道場というコーナーがありますので、そこを見ると詳しくなれるそうです。


このテクてく夜会の後、初めての懇親会が開催されました。
IBMの方や、夜会の参加者、あわせて20名弱の方が参加するというものでした。
筆者はもっぱら、Lotus製品についてIBMの方、夜会のメンバーの方と楽しくおしゃべりさせていただきました。
きっとまた開催されると思いますので、今回参加できなかった方も、次回は参加してくださいね。
ところで、参加者の中にはこのブログの読者の方もいらっしゃったようで、「ネタがないとか言ってたくさん持っているじゃないか!もっと書いて欲しい!」と言われてしまいました。
なるべくたくさんの情報をお届けできるように頑張りますので、許してやってくださいな。



ところで・・・テクてくの資料の12月分がまだアップされませんね。
12月の分は、内容が良かったので、復習をしたいので、テクてくスタッフの皆様、早くアップしてください。お願いします。



では、ネタができたら、ブログを更新します。お楽しみにぃ~。

2011年1月13日木曜日

ビューの列の値を取得する

2011年です。アナログ放送が終わり、地デジになってしまいます。
先日、電気屋さんに行ったら、46型の液晶テレビが12万円で売っていました。筆者はその倍近くの値段で買ったのに・・・
ひどい、ひどすぎる。

ということで?今年1回目のお届けです。


ボタンをクリックしてから読むと、きっと良いことがあります。
にほんブログ村 IT技術ブログへ


今回はLotus Notes/Domino 8.0からの新機能についてです。
デザイナーヘルプには記載されていないものなので、見落としがちなのとどう使えば良いか分からないと困るので掲載しておきます。
っていうか、IBMさん、ヘルプに載せてください。

NotesViewクラスにGetColumnValuesというメソッドが追加されています。
この事は評価ガイド等を見れば書いてあることなので、たいした話ではないかと思います。
問題なのは、前述したとおり、ヘルプに記載がないのです。
つまり、どうやって使えば良いのか、構文はどうなっているのか?等の情報がないのです。

ただし、オートコンプリートの設定を有効にしておく(下図)と、メンバが自動的に表示されます。
さらに、構文のパラメタも自動的に表示してくれます。


さて、ではこの新しいGetColumnValuesメソッドの構文はどうなっているのかを見てみましょう。
どうも、列番号を指定すれば良いようです。
しかし、戻り値が分かりません。こればっかりは試してみないと分かりません。

まずは列番号から。
0から始まるのか、1から始まるのかのどちらかでしょうが、Integer型なので0~32767までの数値というのが妥当でしょう。
また、ビューに存在する列以上の数値は指定できないでしょう。

戻り値ですが、列の値を取得するようなメソッドなので、Variant型の配列が返ってくることが予想できます。

ということを踏まえて、サンプルを作ってみました。
単純に指定したビューの最初の列の値をダイアログとして表示するだけです。

Sub Click(Source As Button)
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim view As NotesView
 Dim ret As String
 Dim titlenum As Integer
 
 Set db = session.CurrentDatabase
 Set view = db.GetView( "ByCategories" )
 
 titlenum = 0
 Forall x In view.GetColumnValues(titlenum)
  If ret = "" Then
   ret = x
  Else
   ret = ret & Chr$(10) & x
  End If
 End Forall
 Msgbox ret, 0, Cstr(titlenum)
End Sub

このメソッドを使うときに気をつけて欲しいことが1つあります。
@DocNumber関数や@DocChildren関数など、テキストや数値に表せないデータが指定されている列はカウントされないと言うことです。
また、列式に「"ここは固定値です"」など固定値の文字列、数値等を設定した場合にもカウントされません。

1列目が@Created
2列目が@DocNumber
3列目が@Text(@DocumentUniqueID
と言う場合、3列目の値を取得したい場合は、view.GetColumnValues(1)とする必要があります。



では、今年も本ブログをご愛顧のほど、よろしくお願いします。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ