Top > 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

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes