2016年11月30日水曜日

LibreBasicにいま持ってる知識で立ち向かってみる  法律勉強プログラムを作ってみるの巻 第4回

リストボックスで選択した法律の条文を

一条づつテキストボックスに表示する

<<第1回  <第3回                                                            第5回>


↑今回の成果ヽ(`▽´)/

今のところ法律条文ビューアーですね…。
一条づつ表示したら何が嬉しいのか…
これから先、このご利益が明らかになっていく!!
好ご期待!!

必要なもの:

・自己責任を許容できる寛容な心
・プログラムをトライ&エラーできる程度の時間と勇気
・vlookupがどのように働くのか、理解できる程度の表計算経験
(今回はvlookup使わないですが、似たような概念は使ってます)
・BASICのプログラム経験


簡単な解説:

・ListBoxで「法律名」が選択されたら、そのイベントをトリガーにして、テキストフィールドの値を変える処理に入る
・テキストフィールドの値は「法律名」「固有インデックス」によって決まる
・ダイアログの次へ/戻るボタンは、「固有インデックス」をひとつだけ進め/戻す
・以上の情報を使ってgetJOUBUNbyIDN()が、テキストフィールドへ書き込むべき一つの条文データを取得しているが、同時にテキストフィールドへの書き込みも担当している。


・他、境界処理、条文の塊把握、バグフィックスなど…

参考資料:

https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Events



-次回予告-
・テキストフィールドの書式を整える
・条文番号をアラビア数字に変換する
・BASICからブラウザを起動する


〜能書き〜
変数宣言を強制的にさせるオプションってなかったっけ?
変数名間違えてても走っちゃう言語ってやっぱり苦手かも…。



以下、追加したプログラム



'指定した条文シートとcrntIDNから、その内容を返す
'HOURITUSheetシのcrntIDNをvlookupして次のIDが入っている行までをひとかたまりとして
'文字列を返す
'cntの数だけ前後した条文を返す
Function getJOUBUNbyidn(cnt as integer)
    dim somecell as object   
    dim tgtRow, tgtCol as string
   
    HOURITUSheet = ThisComponent.Sheets.getbyname(HOURITUName)
   
    if crntIDN = 0 then
        crntIDN = "stt"
    endif
   
    SFNC=createUnoService("com.sun.star.sheet.FunctionAccess")
    adrsl = SFNC.callfunction("MATCH", array(crntIDN, HOURITUSheet.getCellRangeByname("A:A"), 0 ))
    adrsg = SFNC.callfunction("ADDRESS", array(adrsl,1,4))
   
   
    adrsl = SFNC.callfunction("MATCH", array("stt", HOURITUSheet.getCellRangeByPosition(0,0, 0,10000), 0 ))
    posstt = SFNC.callfunction("ADDRESS", array(adrsl,1,4))
    adrsl = SFNC.callfunction("MATCH", array("end", HOURITUSheet.getCellRangeByPosition(0,0, 0,10000), 0 ))
    posend = SFNC.callfunction("ADDRESS", array(adrsl,1,4))


    tgtRow = HOURITUSheet.getCellRangeByName(adrsg).CellAddress.Row
    if crntIDN = "stt" then
            tgtRow = tgtRow+1
            crntIDN = HOURITUSheet.getCellByPosition(tgtCol, tgtRow).string
    end if
    tgtCol = HOURITUSheet.getCellRangeByName(adrsg).CellAddress.Column
   
    'cntの数だけ前後にcrntIDNを移動する
    '進む戻る用の仕組み
    if cnt>0  then
   
        for i = 0 to cnt-1
                do
                    if HOURITUSheet.getCellByPosition(tgtCol, tgtRow+1).string ="end" then
                        exit function
                    end if
                    tgtRow = tgtRow+1
                loop while HOURITUSheet.getCellByPosition(tgtCol, tgtRow).string = ""
                crntIDN = HOURITUSheet.getCellByPosition(tgtCol, tgtRow).string
        next i
       
    elseif cnt<0 then
        for i = cnt+1 to 0
       
                do
                    if HOURITUSheet.getCellByPosition(tgtCol, tgtRow-1).string ="stt" then
                        exit function
                    end if
                    tgtRow = tgtRow-1
                loop while HOURITUSheet.getCellByPosition(tgtCol, tgtRow).string = ""
                crntIDN = HOURITUSheet.getCellByPosition(tgtCol, tgtRow).string
       
        next i
    end if

    lowSet = ""
   
    i=0
    Do
        lowSet = lowSet + HOURITUSheet.getCellByPosition(tgtCol+1, tgtRow+i).string
        i=i+1
    loop while     HOURITUSheet.getCellByPosition(tgtCol, tgtRow+i).string =""
   
    oDialog.getControl("TextField1").text = lowSet
end function

' リストボックスのアイテムが選択されたら呼ばれるサブルーチン
Sub listboxselected
    '選択されたアイテムを取得
    '条文内容を取得-> call getJOUBUNbyidn()
    'テキストフィールドに書き出す
    crntIDN=0
    HOURITUName = oDialog.getcontrol("ListBox1").getSelectedItem()
    call getJOUBUNbyidn(0)
   
end sub

' 進む・戻るボタンが押されたら呼ばれるつもりのサブルーチン
sub forwardBtn
    call getJOUBUNbyidn(1)
end sub
sub backBtn
    call getJOUBUNbyidn(-1)
end sub