- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
- Go to OOobbs/81.
** [[OOobbs/81]] [#ef3591c5]
-''サマリ'': プログレスバーを使いたい
-''環境'': Calc
-''状態'': 解決
-''投稿者'': [[hota]]
-''投稿日'': 2005-11-07 (月) 23:45:42
*** 質問 [#j3d963b8]
処理中の進行状況をprogressbarで表示しようと考えています.
以下のように作ってみましたが,閉じるボタンを押さないと
先に進まない状態です.
またprogressbarの処理について探していますがよくわかりません.
progressbarを更新する方法はないでしょうか.
(CommandButton1はキャンセルボタンの予定.)
よろしくお願いします.
REM ***** BASIC *****
Sub test
Dim i As Long
Dim CountNo As Single
CountNo = 0
For i = 1 To 4
CountNo = i / 4 * 100
UpdateProgressBar1 CountNo
Next
End sub
Sub UpdateProgressBar1(CountNo As Single)
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Dialog1 )
oDialog1Model = oDialog1.Model
oCMD1Model = oDialog1Model.CommandButton1
oCMD1 = oDialog1.GetControl("CommandButton1")
oCMD2Model = oDialog1Model.ProgressBar1
oCMD2 = oDialog1.GetControl("ProgressBar1")
oCMD2Model.ProgressValueMax = 100
oCMD2Model.ProgressValueMin = 0
oCMD2Model.ProgressValue = CountNo
oDialog1.Execute()
End Sub
*** 回答 [#bd169cf2]
-ちょっと修正してます。眠い中投稿してしまった。。 -- [[hota]] &new{2005-11-08 (火) 08:42:46};
-starsuite8のsdkをみたが,どうもlibraryga -- [[hota]] &new{2005-11-13 (日) 09:38:35};
-libraryが”standard”以外loadできないような... -- [[hota]] &new{2005-11-13 (日) 09:39:50};
-河井です。久しくさわっておりませんでした。&br;御質問は、時間のかかる処理が行われている間だけダイヤログを表示して、処理の進行にそってプログレスバーを変化させたいということですね。以下のように修正してみました。
REM ***** BASIC *****
Public oDialog1 as Object
Public oCMD2 as Object
Public oCMD2Model as Object
Public oEventHandle as Object
Public bTaskCancel as Boolean
Sub test
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.GetByName( "Standard" ).GetByName( "Dialog1" ) )
'
' Dialog1にイベントの作成(XTopWindowListener)
oEventHandle = CreateUnoListener("OnDialog1_", "com.sun.star.awt.XTopWindowListener")
' Dialog1に作成したイベントを割り当て
oDialog1.addTopWindowListener(oEventHandle)
'
oDialog1Model = oDialog1.Model
oCMD1Model = oDialog1Model.CommandButton1
oCMD1 = oDialog1.GetControl("CommandButton1")
oCMD2Model = oDialog1Model.ProgressBar1
oCMD2 = oDialog1.GetControl("ProgressBar1")
oCMD2Model.ProgressValueMax = 100
oCMD2Model.ProgressValueMin = 0
oCMD2Model.ProgressValue = 0
oDialog1.Execute()
'
' Dialog1のイベント割り当て解除
oDialog1.removeTopWindowListener(oEventHandle)
End Sub
Sub AnyTask()
Dim i As Long
Dim CountNo As Single
CountNo = 0
' 何らかの処理ループ
bTaskCancel = False
For i = 1 To 100
CountNo = i / 4 * 100
oCMD2Model.ProgressValue = CountNo
' ダイヤログが閉じたら処理を中断
if bTaskCancel then
msgbox "処理はキャンセルされました。"
Exit For
end if
Next
End Sub
'------ ここからイベントハンドラ ------
' Dialog1が開かれた時の処理
Private Sub OnDialog1_windowOpened(oEvent)
AnyTask()
oDialog1.endExecute()
End Sub
' Dialog1が閉じようとしている時の処理
Private Sub OnDialog1_windowClosing(oEvent)
End Sub
' Dialog1が閉じたときの処理
Private Sub OnDialog1_windowClosed(oEvent)
' 何らかの処理を中断させる
bTaskCancel = True
End Sub
' Dialog1が最小化されたときの処理
Private Sub OnDialog1_windowMinimized(oEvent)
End Sub
' Dialog1が元のサイズに戻されたときの処理
Private Sub OnDialog1_windowNormalized(oEvent)
End Sub
' Dialog1がアクティブになったときの処理
Private Sub OnDialog1_windowActivated(oEvent)
End Sub
' Dialog1が非アクティブになったときの処理
Private Sub OnDialog1_windowDeactivated(oEvent)
End Sub
' Dialog1が廃棄されるときの処理
Sub OnDialog1_disposing()
End Sub
>ダイヤログは独自のライブラリ名やダイヤログ名からロード出来るようにGetByNameで明示的に指定させています。
元のソースでダイヤログが閉じるまで処理が動かないのは、ダイヤログを閉じるまでoDialog1.Execute()の行で実行中のまま処理が止まるからです。
ダイヤログを作成した時点でイベントを割り当てることで、ダイヤログが開かれた時に呼び出されるイベントハンドラ内に対象となる何かの処理を呼び出す記述する事で何らかの処理中にプログレスバーを更新させることが出来ます。また、キャンセル時はダイヤログが閉じられた時に呼び出されるイベントハンドラ内にフラグを置く等して対象となる何かの処理を中断させることができます。 -- [[河井]] &new{2005-11-17 (木) 00:51:44};
<
-河井です。昨日の上記の処理をOpenOffice.org2.0で実行した時、ダイヤログが表示されない現象を確認しました。&br;どうやら&color(red){''XTopWindowListenerをダイヤログに割り当て''すると2.0では表示出来ない不具合?};が発生するようです。
~>(CommandButton1はキャンセルボタンの予定.)&br;
''BasicIDE''上で''CommandButton1プロパティ''の''ボタンの種類''を''キャンセル''から''標準''に変更する必要はありますが、以下の処理に変更することでOpenOffice.org2.0上で動作を確認しました。
REM ***** BASIC *****
Public oDialog1 as Object
Public oDialog1Model as Object 'hota追加
Public oCMD1Model as Object 'hota追加
Public oCMD1 as Object 'hota追加
Public oCMD2 as Object
Public oCMD2Model as Object
Public oEventHandle as Object
Public bTaskCancel as Boolean
Sub test
DialogLibraries.LoadLibrary( "Standard" )
oDialog1 = CreateUnoDialog( DialogLibraries.GetByName( "Standard" ).GetByName( "Dialog1" ) )
oDialog1Model = oDialog1.Model
oCMD1Model = oDialog1Model.CommandButton1
oCMD1 = oDialog1.GetControl("CommandButton1")
'
' CommandButton1用イベントの作成(XActionListener)
oEventHandle = CreateUnoListener("OnBtn1_", "com.sun.star.awt.XActionListener")
' CommandButton1に作成したイベントを割り当て
oCMD1.addActionListener(oEventHandle)
'
oCMD2Model = oDialog1Model.ProgressBar1
oCMD2 = oDialog1.GetControl("ProgressBar1")
oCMD2Model.ProgressValueMax = 10000
oCMD2Model.ProgressValueMin = 0
oCMD2Model.ProgressValue = 0
AnyTask()
'
' CommandButton1のイベント割り当て解除
oCMD1.removeActionListener(oEventHandle)
End Sub
Sub AnyTask()
Dim i As Long
Dim CountNo As Single
CountNo = 0
' 何らかの処理ループ
bTaskCancel = False
oDialog1.setVisible(True)
For i = 1 To 10000
' CountNo = i / 4 * 100
CountNo = i
oCMD2Model.ProgressValue = CountNo
' ダイヤログが閉じたら処理中断
if bTaskCancel then
msgbox "処理が中断!"
Exit For
end if
Next
oDialog1.setVisible(False)
End Sub
' ------ ここからイベントハンドラ -------
' キャンセルボタンが押された時の処理
Private Sub OnBtn1_actionPerformed(oEvent)
oDialog1.setVisible(False) ' ダイヤログを閉じる
bTaskCancel = True
End Sub
Sub OnBtn1_disposing()
End Sub
-''CommandButton1''にボタンが押された時のイベントを割り当てました。(''XActionListener'')
-''Dialog1''は、''.execute()''を止めて''.setVisible()''で表示、非表示。
-何かのループ処理を確認しやすい様に多めに変更しておきました。&br;
1.1.xから2.xへの移行中はまだまだ色々と工夫が必要かもしれません。 -- [[河井]] &new{2005-11-17 (木) 20:43:38};
-細かい部分まで解説付きでありがとうございます. -- [[hota]] &new{2005-11-19 (土) 09:17:59};
-progressbar動作が見れて感動です. -- [[hota]] &new{2005-11-19 (土) 09:23:50};
-実際に組み込んだ際にエラーになったので,Public宣言部分を追加しました. -- [[hota]] &new{2005-11-19 (土) 13:59:57};
*** 補足 [#t1014bf4]
-最初の解答で「''XTopWindowListenerをダイヤログに割り当て''すると2.0では表示出来ない不具合?」と書いていましたが、そうではありませんでした。最初のコード上で''windowOpened''イベントハンドラ内を以下の様にコメントアウトする事で確認できます。
' Dialog1が開かれた時の処理
Private Sub OnDialog1_windowOpened(oEvent)
AnyTask()
' oDialog1.endExecute()
End Sub
どうやら、''XTopWindowListener''の''windowOpened''イベントハンドラの発生順序がOOo1.1.xからOOo2.x以降で変わってしまったようです。
|OpenOffice.orgのバージョン|''windowOpened''イベントの発生順|
|1.1.x|(ウィンドウ描画)-->(windowOpened)-->(windowActivated)・・・|
|2.x|(windowOpened)-->(windowActivated)-->(ウィンドウ描画)・・・|
|注記:|windowOpenedとwindowActivatedは同時発生なのかこの順なのか不明です。|
ダイヤログの''Visible''プロパティを使用して表示した場合も''XTopWindowListener''が利用出来ますので、''windowOpened''イベントハンドラ内には動作フラグを置いてメインの処理は別で記述するといった方法も良いかもしれません。イベントの発生順序はOOo1.1.xの方が正常の様に思えますが仕様変更ならばコード上で工夫するのも仕方ありません。-- [[河井]] &new{2005-12-29 (木) 20:43:33};
#comment