2010年3月27日土曜日

フォームを自動作成する

懇談室の話題についてサンプルを作ってみました。

設計情報が書かれた XML ファイルを読み込んでフォームを作ることができました。

以下、確認したバージョンは 8.0.1 ですが 6.0.x でも動作すると思います(...たぶん)

まずはエージェントのサンプルです。
Sub Initialize
    Dim ss As New NotesSession
    Dim stream As NotesStream
    Dim db As NotesDatabase
    Dim importer As NotesDXLImporter
    
    Set stream = ss.CreateStream
    If Not stream.Open("c:\temp\template.xml") Then Exit Sub
    
    Set db = ss.CurrentDatabase
    Set importer = ss.CreateDXLImporter(stream, db)
    
    importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
    Call importer.Process
End Sub

サンプルとして用意した XML ファイルは次のとおりです。
<?xml version="1.0" ?>
<database xmlns="http://www.lotus.com/dxl">
<form name="Memo1">
<body>
<richtext>
<par def="1"><field kind="editable" name="Subject" type="text"></field></par>
<par def="1"><field kind="editable" name="Body" type="richtext"></field></par>
</richtext>
</body>
</form>
</database>

2010年3月24日水曜日

「Designer で開く」が消えた!?

Domino Designer がインストールされていれば、ワークスペース上で設計者以上の権限を持つアプリケーションのアイコンを右クリックして表示されるリストに「Designer で開く」が出てきます。

「Designer で開く」が表示されない場合、Notesのメニューにある「表示」をクリックして「詳細メニューの表示」にチェックが付いていないかもしれません。

いつもどおりアイコンを右クリックして表示されなくなったら「ローカルの設定ファイルが壊れた?」とか 「Designerを再インストール?」などといろいろ考えてしまいますね。

2010年3月17日水曜日

文書の背景色を変更するには

懇談室のこの話題について検討してみました。

文書の背景色は動的に変更できることがIBMのWEBサイトに掲載があります。

文書の背景色を動的に変更する方法

ただ、こうやって背景色を変更することが後のバージョンでもサポートされている、ということではないことに注意してください。

早速試してみました。

次のサンプルでは、チェックボックスにチェックを付けて保存した文書を開くと背景はグレーになります。
チェックがない場合、背景は白になります。

フォームには2つのフィールドを追加します。

フィールド「Color」...チェックボックス、編集可能
キーワードには「選択肢を入力」として次の1行を設定します
グレー表示

フィールド「$PaperColor」...数値、計算結果
値として次の式を設定します
@If(Color="グレー表示"; 15; 1)

※ $PaperColor へ設定する数値については以前に投稿したエントリが参考になると思います。


R5以降では自動で作成される $PaperColorEx を削除するため、フォームのイベント Postsave へ次のスクリプトを記述します。
Sub Postsave(Source As Notesuidocument)
    Dim doc As NotesDocument
    Set doc = Source.Document
    If doc.HasItem( "$PaperColorEx" ) Then
        Call doc.RemoveItem( "$PaperColorEx" )
        Call doc.Save( True, True )
    End If
End Sub

これで完成です。なかなかいい感じですね。

もしフォームに $PaperColor フィールドを作りたくない場合、 上の Postsave イベントのコードを下の様に変更することで設定できました。
Sub Postsave(Source As Notesuidocument)
 Dim doc As NotesDocument
 Dim color%
 Set doc = Source.Document
 If doc.Color(0) = "グレー表示" Then
  color = 15
 Else
  color= 1
 End If
 Call doc.ReplaceItemValue("$PaperColor", color)
 
 If doc.HasItem( "$PaperColorEx" ) Then
  Call doc.RemoveItem( "$PaperColorEx" )
 End If
 Call doc.Save( True, True )
End Sub
※QuerySave で$PaperColor アイテムの値を置換しても、保存したときに文書に設定されていた背景色の値に置き換わってしまうようです...orz

2010年3月16日火曜日

選択式アンケートをビューで集計する

アンケートの様なアプリケーションで、ダイアログリストやチェックボックスといったキーワードから選択する方式のフィールドが複数あるとき、どのキーワードが何個選択されたかを知るためのビューをフィールド毎に1つ作っていませんか?

これら複数のフィールドの値をまとめて一つのビューへ表示する方法があります。

以下、アンケートのアプリケーションを作成したときの事例です。

フォームには選択式の回答欄として、フィールドを9つ(フィールド名:A1~A9)設置しています。

ビューは1つ。「簡易集計」
ビューのプロパティで"データベースを最初に開くときすべてを省略する"を有効にします。

1列目:選択された値の数を表示します
ソート:なし、カテゴリなし
式:@IsCategory(@DocDescendants("%"; "%"; "%"); "")

2列目:選択式の項目の名前と値を階層表示します
展開できる行に三角アイコンを表示する:有効
ソート:昇順、種類:カテゴリ別、複数値を別のエントリで表示:有効
式:
empty := " (未回答)";
( "Q1\\" + @If( A1 = ""; empty; A1) ):
( "Q2\\" + @If( A2 = ""; empty; A2) ):
...省略...
( "Q8\\" + @If( A8 = ""; empty; A8) ):
( "Q9\\" + @If( A9 = ""; empty; A9) )


ここで2列目の式について簡単に説明します。

A1フィールドで何も選択しなかった場合、"Q1\\ (未回答)"となります。
A1フィールドで複数の値("みかん"と"りんご")を選択した場合は"Q1\\みかん":"Q1\\りんご"となります。
2つの円マーク(またはバックスラッシュ)で繋げた文字列を上のビューで表示すると2列目は

▼Q1
 ▼ (未回答)
 ▼みかん
 ▼りんご

のように表示されます。

2010年3月15日月曜日

添付のExcelファイルから値を取得して文書へ反映する

懇談室の話題からサンプルを作ってみました。

特定の文書にある添付ファイルをExcelで開き、現在開いている文書へ計算結果を書き込みます。
計算結果は1つ目のシートの2列目にある数値の合計としています。

Notesクライアントで開いた文書(フォーム)にあるアクションボタンを押したときに実行することを想定しています。

前提条件を設定してコードを簡単にしています。
・「特定の文書」はユニバーサルIDが変わらない
・「添付ファイル」のファイル名が変わらない
・保存先のパスには書き込み権限がある
・クライアントPCにはExcelがインストールされている
Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim filename$, filepath$, unid$
    Dim obj As NotesEmbeddedObject
    Dim xlApp As Variant
    Dim xlbook As Variant
    Dim xlsheet As Variant
    Dim maxrows As Long
    Dim sum%
    filepath = "C:\TEMP\"
    filename = "Book1.xls"
    unid = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" '32桁のユニバーサルID
    sum = 0
    On Error Goto ERRORTRAP
    Set doc = ws.CurrentDatabase.Database.GetDocumentByUNID(unid)
    If doc Is Nothing Then Exit Sub
    If Not doc.HasEmbedded Then Exit Sub
    Set obj = doc.GetAttachment(filename)
    Call obj.ExtractFile(filepath & filename)
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    Set xlbook = xlApp.Workbooks.Open(filepath & filename)
    Set xlsheet = xlbook.Worksheets(1)
    With xlsheet.UsedRange
        maxrows = .Rows(.Rows.Count).Row
    End With
    For rows = 1 To maxrows
        sum = sum + xlsheet.Cells(rows, 2).Value
    Next
    Set uidoc = ws.CurrentDocument
    Call uidoc.Document.ReplaceItemValue("Sum", Cstr(sum))
FINAL:
    If Not xlApp Is Nothing Then
    xlApp.quit
    Set xlApp = Nothing
    End If
    Kill filepath & filename
    Exit Sub
ERRORTRAP:
    Msgbox Cstr(Err) & ": " & Error
    Resume FINAL
End Sub

2010年3月10日水曜日

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

昨日のサンプルは中途半端でした。反省...
ビューのイベント Onselect を使ったサンプルの差し替え版です。

下の Lotus Script では、ビューの選択マージンに1文書ずつチェックマークを付けた場合はチェックマークを付けた順に番号を付けますが、選択マージンをマウスでなぞったり、Ctrl + A 等で一度にチェックマークを付けた場合は作成日順に番号が付きます。

チェックマークを消した場合は番号が付きません。チェックマークを消した後また同じ文書に付けると、最後にチェックマークを付けた時の番号になります。

文書のチェックマークが解除されたことを調べるのに NotesDocumentCollection クラスの Contains を使っていますが、これも 8 から利用できるメソッドです。文書コレクションをループしなくても探せるところがステキです。

ヘルプによると Contains の引数には NotesDocument, NotesDocumentCollection のオブジェクトの他、 String値の NoteID が使えるとのこと。ただし NoteID を配列として指定できないようです。
'ビューの(Globals) (Declarations)
Dim ws As NotesUIWorkspace
Dim ss As NotesSession
Dim idlist List As Long

'ビューのイベント Initialize
Sub Initialize
 Set ws = New NotesUIWorkspace
 Set ss = New NotesSession
End Sub

'ビューのイベント Onselect
Sub Onselect(Source As Notesuiview)
    Dim doc As NotesDocument
    Dim dc As NotesDocumentCollection

    Set dc = Source.Documents
    Set doc = dc.GetFirstDocument
    While Not ( doc Is Nothing )
        If Not Iselement( idlist( doc.NoteID ) ) Then
            idlist( doc.NoteID ) = "1"
        End If
        Set doc = dc.GetNextDocument( doc )
    Wend

    Forall o In idlist
        If Not dc.Contains( Listtag( o ) ) Then
            Erase idlist( Listtag( o ) )
        End If
    End Forall
End Sub

'ビューのアクション「番号を付ける」 
Sub Click(Source As Button)
    Dim doc As NotesDocument
    Dim db As NotesDatabase
    Dim lngNum%

    Set db = ws.CurrentDatabase.Database
    lngNum = 0
    Forall o In idlist
        Set doc = db.GetDocumentByID( Listtag( o ) )
        lngNum = lngNum + 1
        doc.num = lngNum
        Call doc.Save( True, False )
    End Forall

    Erase idlist
    Call ws.ViewRefresh
    Call ws.CurrentView.DeselectAll
End Sub

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

2010年3月5日金曜日

NotesColor の色見本表を作る

客先と認識を一致させるには具体的なイメージが必要な場合もありますよね。

色もそうですが「もうちょっと明るい感じ」と言われて変更しても一発OKになることは稀かも。

そこで NotesColorObject の NotesColor プロパティを使って色の見本表を作ってみました。

NotesColor は 0 から 240 の範囲の数値に色が割り当てられています。

最初の0から15には COLOR_BLACK といった定数もあります。

NotesColor へ数値をセットすると、Red, Green, Blue, Hue(色相), Saturation(彩度), Luminance(明度)の値が変わります。
Sub Initialize
    Dim ss As New NotesSession
    Dim doc As NotesDocument
    Dim color As NotesColorObject
    Dim body As NotesRichTextItem
    Dim nav As NotesRichTextNavigator
    Dim range As NotesRichTextRange
    Dim table As NotesRichTextTable
    Dim style1 As NotesRichTextStyle
    Dim style2 As NotesRichTextStyle
    Dim style3 As NotesRichTextStyle
    Dim styles() As NotesRichTextParagraphStyle
    Dim rows%, columns%, i%
    Dim rgb$, hsl$
    
    Set doc = ss.CurrentDatabase.CreateDocument
    Set body = New NotesRichTextItem( doc, "Body" )
    Set nav = body.CreateNavigator
    Set range = body.CreateRange
    Set color = ss.CreateColorObject
    color.NotesColor = 0
    Set style1 = ss.CreateRichTextStyle
    style1.FontSize = 1
    Set style2 = ss.CreateRichTextStyle
    style2.NotesColor = COLOR_BLACK
    style2.FontSize = 8
    Set style3 = ss.CreateRichTextStyle
    style3.NotesFont = FONT_ROMAN
    style3.FontSize = 7
    rows = 16
    columns = 16
    Redim styles( columns - 1 )
    For i = 0 To columns - 1
        Set styles( i ) = ss.CreateRichTextParagraphStyle
        styles( i ).LeftMargin = 0
        styles( i ).FirstLineLeftMargin = 0
        styles( i ).RightMargin = RULER_ONE_INCH * 0.75
    Next
    body.AppendTable rows, columns, , ,styles
    
    nav.FindFirstElement RTELEM_TYPE_TABLECELL
    range.SetBegin nav
    range.SetStyle style1
    range.SetEnd nav
    Do
        With color
            rgb = .Red & " : " & .Green & " : " & .Blue
            hsl = .Hue & " : " & .Saturation & " : " & .Luminance
        End With
        body.BeginInsert nav
'%REM 'NotesColorが不要ならコメントアウト--ここから
        body.AppendStyle style2
        body.AppendText color.NotesColor
'%END REM 'NotesColorが不要ならコメントアウト--ここまで
        body.AppendStyle style1
        body.AppendText( " " )
        If color.Luminance < 120 Then
            style3.NotesColor = COLOR_WHITE
        Else
            style3.NotesColor = COLOR_BLACK
        End If
        body.AppendStyle style3
        body.AppendTable 1, 1
        body.EndInsert
        nav.FindNextElement RTELEM_TYPE_TABLE
        Set table = nav.GetElement
        table.Style = TABLESTYLE_SOLID
        table.SetColor color
        nav.FindNextElement RTELEM_TYPE_TABLECELL
'%REM 'RGBとHSLが不要ならコメントアウト--ここから
        body.BeginInsert nav
        body.AppendText rgb
        body.AddNewline 1, False
        body.AppendText hsl
        body.EndInsert
'%END REM 'RGBとHSLが不要ならコメントアウト--ここまで
        color.NotesColor = color.NotesColor + 1
        If color.NotesColor > 240 Then Exit Do
    Loop While nav.FindNextElement( RTELEM_TYPE_TABLECELL )
'%REM '説明が不要ならコメントアウト--ここから
    body.AppendStyle style2
    body.AppendText "Line 1  NotesColor"
    body.AddNewline 1, False
    body.AppendText "Line 2  Red : Green : Blue"
    body.AddNewline 1, False
    body.AppendText "Line 3  Hue : Saturation : Luminance"
'%END REM '説明が不要ならコメントアウト--ここまで
    doc.Form = "Memo"
    doc.Subject = "Lotus Notes 色見本"
    doc.SendTo = ss.UserName
    doc.Send False
End Sub
色付けはセルごとに設定できません。そのため外側の表にあるセルの中に入れ子の表を作成して、その表へ色を付けています。
おおまかな処理の流れは次のとおりです。

1. 外側の表(16行x16列)を作成します
2. 最初のセルへ移動します
3. 内側の表(1行x1列)を作成します
4. 内側の表へ移動します
5. 内側の表全体に色を設定します
6. 次のセル(内側の表のセル)へ移動します
7. RGB, HSL の値を記入します
8. NotesColor に 1 追加します
9. 次のセルへ移動できる間、3~8を繰り返します

NotesColor の数値、RBGおよびHSLの値、値の説明が不要ならコメントアウトしてください

NotesColor の数値を表示しない場合でも表がつぶれず色が見やすくなるようスペース文字を追加してフォントサイズで高さを調整しています。

R,G,BとH,S,Lのそれぞれの値は0から256までの数値です。これを16進表現にしたい場合は Hex 関数で変換できます。
rgb = Hex$(.Red) & " : " & Hex$(.Green) & " : " & Hex$(.Blue)
hsl = Hex$(.Hue) & " : " & Hex$(.Saturation) & " : " & Hex$(.Luminance)


AppendTable で styles を省略して16行16列の表を作成しようとすると「列の幅が不正です - 左余白と右余白を確認してください」が表示され終了してしまいました。
(Notes 8.0.1 Basic版で確認)

2010年3月3日水曜日

新規文書にリッチな初期値を設定する

新規文書を作成するときに、リッチテキスト・フィールドへ初期値を設定しておきたい場合があります。

もちろんリッチテキスト・フィールドにもデフォルト値を設定できますが、値は文字列でなければなりません。

もし初期値として色つきの文字や特定のフォントにしたり、表やリンク、あるいは添付ファイルを張り付けておきたい、などといった場合は作りこみが必要です。

そこで、初期値としてのひな型を作成する機能と、作成したひな型のリッチテキストフィールドの内容をコピーして編集モードで開いている文書へペーストする機能を作ってみました。

テンプレートを編集するフォーム "Template" を作ります。
フィールドは2つ、テキストの"Subject"とリッチテキストの"Body"を追加します。
"Subject"は読み込みモードの時とクリップボードへコピーする時に非表示になるよう設定します。

テンプレートを選択するためのビュー"Templates"を作ります。
ビューの1列目に"Subject"を表示します。

次は新規文書を作成するアクションボタンの Lotus Script です。
ここではひな型の名前等を固定で指定しちゃっています。
Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim tdoc As NotesDocument
    Dim ss As New NotesSession
    Dim db As NotesDatabase
    Dim vw As NotesView
    Dim templateName$
    Set db = ss.CurrentDatabase
    Set vw = db.GetView( "Templates" )
    Set tdoc = vw.GetDocumentByKey( "Default Template", True )
    If tdoc Is Nothing Then Exit Sub
    Dim uidoc As NotesUIDocument
    Set uidoc = ws.EditDocument( False, tdoc, True )
    Call uidoc.SelectAll
    Call uidoc.Copy
    Call uidoc.Close( True )
    Dim cuidoc As NotesUIDocument
    Set cuidoc = ws.ComposeDocument( db.Server, db.FilePath, "MainTopic")
    Call cuidoc.GotoField( "Body" )
    Call cuidoc.Paste
End Sub
これを実行すると、画面が一瞬フラッシュしたように見えることがありますが、それは気にしちゃいけません。
もし NotesUIDocument.Visible といったプロパティがあって、False をセットすると非表示にできちゃったりなんかすると解決できそうなんですが...

次は編集モードで開いている文書へひな型を挿入したい場合にアクションボタンへ記述する Lotus Script です。
このボタンは読み込みモードのときに非表示にします。
Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim cuidoc As NotesUIDocument
    'リッチテキスト"Body"に挿入点がない場合はエラー
    Set cuidoc = ws.CurrentDocument
    If cuidoc.CurrentField <> "Body" Then
        Messagebox "現在の項目へは挿入できません。",, "エラー"
        Exit Sub
    End If
    'ひな型を選択する
    Dim ss As New NotesSession
    Dim db As NotesDatabase
    Dim dc As NotesDocumentCollection
    Dim tdoc As NotesDocument
    Set db = ss.CurrentDatabase
    Set dc = ws.PickListCollection( 3, False, 
    db.Server, db.FilePath, "Templates", _
    "選択", "ひな型を選択してください。" )
    If dc.Count = 0 Then Exit Sub
    Set tdoc = dc.GetFirstDocument
    'ひな型をクリックボードへコピーする
    Dim uidoc As NotesUIDocument
    Set uidoc = ws.EditDocument( False, tdoc, True )
    Call uidoc.SelectAll
    Call uidoc.Copy
    Call uidoc.Close( True )
    'クリップボードからペーストする
    Call cuidoc.Paste
End Sub

2010年3月2日火曜日

PANIC: pool free chain が無効です

サーバーにあるアプリケーションの既存文書をビュー上でダブルクリックして開いたところ、NSD が起動され Lotus Notesが終了する現象が発生しました。
(Notes 8.0.1 Basic版にて、特定の文書だけで再現性あり)

NSD で出力されたログの FATAL THREAD には次の記載がありました。
[ 1] 0x76fe9a94 ntdll.KiFastSystemCallRet+0 (600,493e0,0,d8fe854)
[ 2] 0x7601c1b2 kernel32.WaitForSingleObject+18 (600,493e0,3,d8fea70)
@[ 3] 0x601a5754 nnotes.OSRunExternalScript@8+1284 (12c,1)
@[ 4] 0x601a5bea nnotes.FRTerminateWindowsResources+986 (1,0,1010,1)
@[ 5] 0x601a5faf nnotes.OSFaultCleanupExt@24+895 (22a4dd8,1010,0,0,0,d8feda0)
@[ 6] 0x601a603a nnotes.OSFaultCleanup@12+26 (0,1010,0)
@[ 7] 0x601b12a4 nnotes.OSNTUnhandledExceptionFilter@4+276 (d8ffdd8)
@[ 8] 0x6017aca8 nnotes.Panic@4+520 (60bb0f62)
@[ 9] 0x60656400 nnotes.HandleBadFreeChain@4+640 (d342c4c)
@[10] 0x6000306d nnotes.FreeDBlock@12+429 (d34008a,373196d9,d342c4c)
@[11] 0x6065662e nnotes.OSFreeDBlockWithSize@16+78 (60e9cb7a,1466c,1314,1)
@[12] 0x60656662 nnotes.OSFreeDBlockExt@12+34 (60e9cb7a,1466c,1)
@[13] 0x601a98dc nnotes.DPoolFree@8+76 (f9ca8de,1)
@[14] 0x600067fc nnotes.Discard@4+364 (f9ca8d0)
@[15] 0x60008063 nnotes.OSMemoryFree@4+179 (f010a656)

上記のいくつかのキーワードでIBMのサイトを検索したところ、Standard版で似たような状況が発生していることがわかりました。
Lotus Notes 8 (Standard Configuration) crashes when user accepts meeting invitation or update

この情報によると、ローカルにあるアドレス帳(names.nsf) のODSバージョンが古い(20 or 41)場合、圧縮すると解決するようです。

そこでコマンドプロンプトから ncompact を実行しました。
ODSバージョンを変換するため、-C オプションを付けます。

ncompact -c names.nsf

圧縮前のODSバージョンは 41 でしたが、実行後は 43 になりました。

これでもまだ再現するようです。

そこで 8 のODSバージョンになるよう notes.ini ファイルへ次の1行を追加して、再度 -C 付きで ncompact を実行しました。

Create_R8_Databases=1

これでODSバージョンが 48 になり、当該文書は無事開くようになりました。

2010年3月1日月曜日

True と False を数値で判定する

If Then Else ステートメントを使って条件が True か False のどちらになるかを調べたいとき、条件式の結果が 0 なら False, それ以外は True となることを知っているとシンプルに記述できる場合があります。

では0以外の数値が True として扱われていることを次のエージェントで確かめてみます。
Sub Initialize
    Dim intValue As Integer

    intValue = 6
    If intValue Then
        Print Cstr( intValue ) & " は True です。"
    Else
        Print Cstr( intValue ) & " は False です。"
    End If

    intValue = 0
    If intValue Then
        Print Cstr( intValue ) & " は True です。"
    Else
        Print Cstr( intValue ) & " は False です。"
    End If

    intValue = -1
    If intValue Then
        Print Cstr( intValue ) & " は True です。"
    Else
        Print Cstr( intValue ) & " は False です。"
    End If
End Sub
上記の結果は

6 は True です。
0 は False です。
-1 は True です。


となりました。


ところで True か False かを表すデータ型 Boolean の値は計算することができるのでしょうか。

下のエージェントで確認してみます。
Sub Initialize
    Dim bolValue As Boolean
    bolValue = True
    Print Cstr( bolValue ) & " に 1 を掛けると " & Cstr( bolValue * 1 ) & " です。"

    bolValue = False
    Print Cstr( bolValue ) & " に 1 を掛けると " & Cstr( bolValue * 1 ) & " です。"
End Sub
上の結果は

True に 1 を掛けると -1 です。
False に 1 を掛けると 0 です。


となりました。

きちんと計算できました。