2022年5月6日金曜日

LibreOffice BasicでGridControl(テーブルコントロール)を作成する方法について

 あまプロではLibreOfficeを使ってマクロやアプリの開発を行う事が有ります。

先日LibreOffice Basicでグリッド(テーブル) コントロールを使った際にどはまりしたんで、あメログ。
ハマり過ぎて、Bugzillaにバグを起票してしまいました🦋

例えば、Calcでシートをデータベースとして、ダイアログ(フォームコントロール)をフロントエンドとするアプリを実装してみます。

新規で適当なodsファイルを作成します。

シートをデータベースとして使うので、適当なシート名と適当なデータを挿入します
一行目がヘッダ行です

 ツール > マクロ > マクロの管理 > Basic... を押下します

 マクロの起動先ツリーからosdファイルのStandardを選択して、管理ボタンを押下します
Basicマクロ管理画面が表示されるので、ダイアログタブを選択し、osdファイルのStandardを選択して、新規作成ボタンを押下します
新しいダイアログで、適当な名前を入力して、OKボタンを押下します

入力した名前のダイアログが作成され、ツリーに追加されます

ツリーを選択して、編集ボタンを押下します

LibreOffice Basic( IDE)が起動します

ダイアログにグリッド(テーブル)コントロールを追加します
何故かメニューのダイアログには無いので
ツールバーのテーブルコントロールを押下します

ドラッグアンドドロップで適当な大きさのテーブルコントロールを追加します

自動的に名前(GridControl1)が生成されます

ツール > マクロの管理 > Basic... を押下して、Basicマクロを表示します

ツリーのodsファイルのStandardを選択して、新規作成ボタンを押下します

新しいモジュールが表示されるので、適当な名前を入力して、OKボタンを押下します

モジュールが作成され、自動的にMainサブルーチンも生成されます

 Mainに以下のLibreOffice Basicを実装します

Sub Main
    'ライブラリをロードして、ダイアログを作成する お約束
    DialogLibraries.LoadLibrary( "Standard")
    Set oDialog = CreateUnoDialog( DialogLibraries.Standard.Dialog1)
    Dim GridControl1 As Object: Set GridControl1 = oDialog.getControl( "GridControl1")
    With ThisComponent.getSheets( ).getByName( "flowers")
        'ヘッダ行からカラム名を取得 列幅は50px
        col0 = GridControl1.Model.ColumnModel.createColumn()
        col0.Title = .getCellByPosition( 0, 0).String
        col0.MaxWidth = 50
        GridControl1.Model.ColumnModel.addColumn( col0)
        col1 = GridControl1.Model.ColumnModel.createColumn()
        col1.Title = .getCellByPosition( 1, 0).String
        col1.MaxWidth = 50
        GridControl1.Model.ColumnModel.addColumn( col1)
        col2 = GridControl1.Model.ColumnModel.createColumn()
        col2.Title = .getCellByPosition( 2, 0).String
        col2.MaxWidth = 50
        GridControl1.Model.ColumnModel.addColumn( col2)
       
        GridControl1.Model.GridDataModel.removeAllRows( )
        Dim i As Integer: i = 1
        Do While .getCellByPosition( 0, i).String <> ""
            'セルのデータを配列化してグリッドに行追加する
            GridControl1.Model.GridDataModel.addRow( 0, _
                Array( .getCellByPosition( 0, i).String, .getCellByPosition( 1, i).String, .getCellByPosition( 2, i).String))
            i = i + 1
        Loop
    End With
    oDialog.Execute()
End Sub
簡単に説明すると、シートのヘッダから列を生成して、データから行を追加してます。
GridControl1(のメンバのModel)にColumnModelとGridDataModelというメンバが有りまして、そこにaddColumnしたりaddRowしたりしなければならない為にこの様に実装します。
参考
UNO Grid Control
ColumnModelGridDataModel

 最後に、odsファイルを開いた際に、このMainを実行する様に設定します

Calcの ツール > マクロ > マクロの管理 > Basic... を押下します

実装したModule1のMainを選択して、割り当てボタンを押下します

カスタマイズが表示されるので、文書を開いた時を選択してマクロボタンを押下します

マクロセレクターが表示されるので、Module1のMainを選択して、OKボタンを押下します

 

マクロが割り当てられます

OKボタンを押下します

保存して、Calcを終了します。

odsファイルを開きます
設定によってセキュリティ警告が表示された場合は、マクロの有効化を押下します
グリッド(テーブル)コントロールにデータが表示されます

これを応用すれば、データを整理して表示する様なアプリに使えます。
非常に便利なんですが、ドキュメントが無かったので…載せておきます。

サンプルはこちらです グリッド.ods

試した環境はこちらです



0 件のコメント:

コメントを投稿

つっこみ