2009年08月05日

[ON⇒OFF]変化したオプションボタンの取得

関連記事:オプションボタンは OFF になる時には 「Change イベント」が発生しない


OOo.Basic のオプションボタンは、[OFF⇒ON]変化のボタンに対しては
Changeイベントが起きますが、[ON⇒OFF]変化のボタンに対してはChange
イベントが起きません。

OFF 変化時に処理が必要(ボタンの強調表示解除など)な場合には、直前の
状態を保持して変化後と比較することで[ON⇒OFF]変化ボタンを探す必要が
あります。

オプションボタンの『 Tag プロパティ 』を利用して、上記の検索処理を行なう
関数を用意しました。

[ DownLoad : OptOffChange.ods ]  2009/10/8 -- Ver 1.1 --

2009/ 8/ 5  ( Ver 1.0 )
2009/10/ 8 ( Ver 1.1 )
          ON⇒OFF 変化したボタンが無い場合の返却値を
          Null から Nothing に変更しました。
          変化ボタンの有無判定の条件を
              IsNull ( vntOffCtrl ) ⇒ ( vntOffCtrl Is Nothing )
          に修正してください( 障害例 )。


OptionButtonGetOffChange (オプションボタン配列 [, Index取得 ] )

[オプションボタン配列]
    1グループのオプションボタンを格納した1次元のオブジェクト配列。
    配列インデックスの開始は 0 でも 1 でもどちらでも構いません。
    複数のオプションボタングループを使用する場合は、グループごとに
    配列変数を用意します(2次元配列は不可)。

[Index 取得]
    [ON⇒OFF]変化ボタンを配列のインデックスで取得する場合は True
    を指定します。False 又は省略の場合は変化ボタンのオブジェクトが
    返ります。

[返却値]
    [ON⇒OFF]変化ボタンのコントロールオブジェクト または 配列のインデックス
    が返ります。[ON⇒OFF]変化が無かった場合は Nothing 又は -1 が返ります。

〜利用方法(ダウンロードファイルにサンプルマクロがあります)〜
    以下のタイミングで必ず実行してください。
      ・ ダイアログの初期化処理時
      ・ Changeイベント
      ・ マクロによるON/OFF設定後

'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/ OptionButton Off-Change Event Support Function
'_/
'_/ [ OptionButtonGetOffChange ]
'_/
'_/ 2009/ 8/ 5 -- Ver 1.0 --
'_/ 2009/10/ 8 -- Ver 1.1 --
'_/ It is changed a return value when there is
'_/ not Off-Change-Button in Nothing from Null.
'_/
'_/ Creator : Keiichi Tsunoda
'_/ Blog : http://blog.livedoor.jp/addinbox/ (Japanese)
'_/
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

Global Function OptionButtonGetOffChange(ByRef argOptBtn() As Object, _
                                         Optional ByVal argIndex As Boolean) As Variant
Dim intBeforeTrueIndex As Integer
Dim blnIndex As Boolean
Dim i As Integer

  If IsMissing(argIndex) Then
    blnIndex = False
  Else
    blnIndex = argIndex
  End If

  intBeforeTrueIndex = -1
  For i = LBound(argOptBtn) to UBound(argOptBtn)
    If CBool(argOptBtn(i).Model.State) Then
      argOptBtn(i).Model.Tag = "TRUE"
    Else
      Select Case argOptBtn(i).Model.Tag
        Case "TRUE"
          intBeforeTrueIndex = i
          argOptBtn(i).Model.Tag = "FALSE"
        Case ""
          argOptBtn(i).Model.Tag = "FALSE"
        Case Else  '(FALSE)
      End Select
    End If
  Next i

  If blnIndex Then
    OptionButtonGetOffChange = intBeforeTrueIndex  'Index or [-1]
  Else
    If (intBeforeTrueIndex = -1) Then
      OptionButtonGetOffChange = Nothing
    Else
      OptionButtonGetOffChange = argOptBtn(intBeforeTrueIndex)
    End If
  End If
End Function

【 利用例 】

Private oOptGrp(1 to 4) As Object

Dim vntOffCtrl As Variant

'〜〜 オブジェクト配列の設定後 〜〜
  For i = 1 to 4
    oOptGrp(i) = oDialog.getControl("optBtn" & i)
  Next i
  vntOffCtrl = OptionButtonGetOffChange(oOptGrp)


'〜〜 Change イベント 〜〜
Private Sub OptItemListener_itemStateChanged(oEvent As com.sun.star.awt.ItemEvent)
Dim vntOffCtrl As Variant
  oEvent.Source.Model.FontWeight = com.sun.star.awt.FontWeight.BOLD
 
  vntOffCtrl = OptionButtonGetOffChange(oOptGrp)
  If Not (vntOffCtrl Is Nothing) Then
    vntOffCtrl.Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
  End If
End Sub


'〜〜 Index 指定の場合 〜〜
  vntOffCtrl = OptionButtonGetOffChange(oOptGrp, True)
  If (vntOffCtrl <> -1) Then
    oOptGrp(vntOffCtrl).Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
  End If


'〜〜 マクロで ON 設定 〜〜
  oOptGrp(1).Model.State = 1  '(ON)
  oOptGrp(1).Model.FontWeight = com.sun.star.awt.FontWeight.BOLD
  vntOffCtrl = OptionButtonGetOffChange(oOptGrp)
  If Not (vntOffCtrl Is Nothing) Then
    vntOffCtrl.Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
  End If

'〜〜 マクロで OFF 設定 〜〜
  oOptGrp(1).Model.State = 0  '(OFF)
  oOptGrp(1).Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
  vntOffCtrl = OptionButtonGetOffChange(oOptGrp)





お役に立ちましたら拍手して貰えると嬉しいです

addinbox at 14:43コメント(0)ダイアログ | マクロ・関数 この記事をクリップ!

コメントする

名前
URL
 
  絵文字
 
 
記事検索
livedoor プロフィール




Microsoft MVP for
Microsoft Office Excel
Apr. 2011 - Mar. 2012
( since Apr. 2009 )

  • ライブドアブログ