LibreOffice Calc Basic - ProgressBarを使って進捗状況を表示する方法

◆概要

 マクロで長時間かかる処理を行う場合、ユーザーに進捗状況を表示することは重要なことです。長い時間、何も変化がなければユーザーは「フリーズしたのか?」という思いで不安になるものです。
 プログレスバーコントロールを利用すれば、進捗状況を表示することが可能になります。

◆ProgressBarコントロール
 プログレスバーを表示するには、com.sun.star.awt.UnoControlProgressBarインターフェースのプログレスバーコントロールを使用します。
 ProgressBarコントロールの最小値との最大値はProgressValueMinとProgressValueMaxプロパティによって設定します。プログレス値はProgressValueプロパティによって制御します。これらの値の型はLong型です。
 次の例は、StandardのDialog1にプログレスバー(LibreOffice 3.4.4では進行状況バー)を配置してから実行します。


Sub ProgressBarDemo()
    Dim oProgressBar as Object, oProgressBarModel As Object, oDialog as Object
    Dim ProgressValue As Long

    DialogLibraries.loadLibrary("Standard")
    oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    REM プログレスバーの設定
    Const ProgressValueMin = 0
    Const ProgressValueMax = 100
    Const ProgressStep = 10
    REM プログレスバーの最小値と最大値をセット
    oProgressBarModel = oDialog.getModel().getByName( "ProgressBar1" )
    oProgressBarModel.setPropertyValue( "ProgressValueMin", ProgressValueMin)
    oProgressBarModel.setPropertyValue( "ProgressValueMax", ProgressValueMax)
    REM プログレスバーを表示
    oDialog.setVisible( True )
    REM 進行状況の値を毎秒増加させる
    For ProgressValue = ProgressValueMin To ProgressValueMax Step ProgressStep
        oProgressBarModel.setPropertyValue( "ProgressValue", ProgressValue )
        Wait 100
    Next ProgressValue
End Sub

◆実行結果

 

 プログレスバーの色はLibreOffice3.4.4のデフォルトでは緑ですが、バーの塗りつぶしの色はFillColorプロパティ、背景色はBackgroundColorプロパティを設定することによって変更できます。
 次の例は、背景色に赤を設定したコードです。この場合は正しく動作します。

sub test
    Dim oProgressBar as Object, oProgressBarModel As Object, oDialog as Object
       Dim ProgressValue As Long
    Dim oProgressColor As Long      ' 塗りつぶし色

   DialogLibraries.loadLibrary("Standard")
   oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   REM プログレスバーの設定
   Const ProgressValueMin = 0
   Const ProgressValueMax = 100
   Const ProgressStep = 10
   oProgressColor=RGB(255,0,0) ' 塗りつぶし色赤 Long型
   REM プログレスバーの最小値と最大値をセット
   oProgressBarModel = oDialog.getModel().getByName( "ProgressBar1" )
   oProgressBarModel.setPropertyValue( "ProgressValueMin", ProgressValueMin)
   oProgressBarModel.setPropertyValue( "ProgressValueMax", ProgressValueMax)
   ' Test 塗りつぶし
   oProgressBarModel.setPropertyValue ( "BackgroundColor", oProgressColor)
   REM プログレスバーを表示
   oDialog.setVisible( True )
   REM 進行状況の値を毎秒増加させる
   For ProgressValue = ProgressValueMin To ProgressValueMax Step ProgressStep
       oProgressBarModel.setPropertyValue( "ProgressValue", ProgressValue )
       Wait 100
   Next ProgressValue
End Sub

◆実行結果

 ところがバーの色を塗りつぶすプロパティFillColorは、どういうわけか正しく動作しません。上記のTest 塗りつぶしの次の行のBackgroundColorをFillColorにすればバーの色が赤くなるはずなのですが。バグなのかプロパティ値が変わったのか...不明です。

◆シートのステータスバーに進行状況を表示するには

 シートのステータスバーに進行状況を表示するには、createStatusIndicatorを利用します。ステータス・インジケーターは com.sun.star.task.XStatusIndicator.start()を呼ぶことで表示されます。 テキストと数の範囲を渡し、ステータスバーを最大範囲に到達するまでsetValue()を使用して値を増加させます。

 次のサンプルコードでは、最大値を10にしてからステータス・インジケーターを表示しています。

Sub StatusProgress
    Dim oDoc As Object
    Dim oDocCtrl As Object
    DIm oDocFrame As Object
    Dim oStatus As Object

    oDoc = ThisComponent
    oDocCtrl = oDoc.getCurrentController()
    oDocFrame = oDocCtrl.getFrame()

    oStatus = oDocFrame.createStatusIndicator()

    oStatus.start( "処理中....", 10 )
    For i = 1 To 10
        oStatus.setValue( i )
        Wait 500
    Next
    oStatus.end()
End Sub 


▼ページトップへ