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
▼ページトップへ