Top > OOobbs > 81

OOobbs/81 Edit

  • サマリ: プログレスバーを使いたい
  • 環境: Calc
  • 状態: 解決
  • 投稿者: hota?
  • 投稿日: 2005-11-07 (月) 23:45:42

質問 Edit

処理中の進行状況を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

回答 Edit

  • ちょっと修正してます。眠い中投稿してしまった。。 -- hota? 2005-11-08 (火) 08:42:46
  • starsuite8のsdkをみたが,どうもlibraryga -- hota? 2005-11-13 (日) 09:38:35
  • libraryが”standard”以外loadできないような... -- hota? 2005-11-13 (日) 09:39:50
  • 河井です。久しくさわっておりませんでした。
    御質問は、時間のかかる処理が行われている間だけダイヤログを表示して、処理の進行にそってプログレスバーを変化させたいということですね。以下のように修正してみました。
    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()の行で実行中のまま処理が止まるからです。 ダイヤログを作成した時点でイベントを割り当てることで、ダイヤログが開かれた時に呼び出されるイベントハンドラ内に対象となる何かの処理を呼び出す記述する事で何らかの処理中にプログレスバーを更新させることが出来ます。また、キャンセル時はダイヤログが閉じられた時に呼び出されるイベントハンドラ内にフラグを置く等して対象となる何かの処理を中断させることができます。 -- 河井? 2005-11-17 (木) 00:51:44

  • 河井です。昨日の上記の処理をOpenOffice.org2.0で実行した時、ダイヤログが表示されない現象を確認しました。
    どうやらXTopWindowListenerをダイヤログに割り当てすると2.0では表示出来ない不具合?が発生するようです。

    >(CommandButton1はキャンセルボタンの予定.)
    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()で表示、非表示。
  • 何かのループ処理を確認しやすい様に多めに変更しておきました。
    1.1.xから2.xへの移行中はまだまだ色々と工夫が必要かもしれません。 -- 河井? 2005-11-17 (木) 20:43:38
  • 細かい部分まで解説付きでありがとうございます. -- hota? 2005-11-19 (土) 09:17:59
  • progressbar動作が見れて感動です. -- hota? 2005-11-19 (土) 09:23:50
  • 実際に組み込んだ際にエラーになったので,Public宣言部分を追加しました. -- hota? 2005-11-19 (土) 13:59:57

補足 Edit

  • 最初の解答で「XTopWindowListenerをダイヤログに割り当てすると2.0では表示出来ない不具合?」と書いていましたが、そうではありませんでした。最初のコード上でwindowOpenedイベントハンドラ内を以下の様にコメントアウトする事で確認できます。
    ' Dialog1が開かれた時の処理
    Private Sub OnDialog1_windowOpened(oEvent)
       AnyTask()
    '   oDialog1.endExecute()   
    End Sub
    どうやら、XTopWindowListenerwindowOpenedイベントハンドラの発生順序が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の方が正常の様に思えますが仕様変更ならばコード上で工夫するのも仕方ありません。-- 河井? 2005-12-29 (木) 20:43:33


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