OptionButton [On⇒OFF]変化の検出

エクステンションの作成、共用ライブラリ

OptionButton [On⇒OFF]変化の検出

投稿記事by K.Tsunoda » 8月 5th, 2009, 3:57 pm

VBAと違って OOo.Basic では、オプションボタンの Change イベントが [OFF⇒ON]変化ボタンだけでしか
発生しません。

例えば、オプションボタンの強調表示などを行なっている場合では、[On⇒OFF]変化に対しても処理が
必要となりますが、「どのボタンがOFFになったのか」のイベント通知がありませんので、自分で、直前の
状態と比較して対象ボタンを探す必要があります。

上記の処理を行なう関数を作りました。

OptionButtonGetOffChange 関数 ( 2009/10/8 Ver 1.1 )
http://blog.livedoor.jp/addinbox/archives/51250649.html

コード: 全て選択   展開ビュー折りたたみビュー
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 IsNull(vntOffCtrl) 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 IsNull(vntOffCtrl) 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/VBAユーザーの為のOpenOffice.org 備忘録 『ユーザー定義関数の一覧
http://blog.livedoor.jp/addinbox/archives/51249421.html
K.Tsunoda
 
記事: 71
登録日時: 11月 2nd, 2008, 6:44 pm

Re: OptionButton [On⇒OFF]変化の検出 アップデート

投稿記事by K.Tsunoda » 10月 8th, 2009, 10:39 pm

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


【 Ver 1.0 での障害発生例 】

[ vntOffCtrl ] 変数を複数のグループで共用している場合等でエラーが
発生する場合があります。

optGrp11 (ON) , optGrp22 (ON) の状態で以下を実行すると(*2) で
エラーになります。

(*1) で vntOffCtrl に Null が入ります。
(*2) で vntOffCtrl に optGrp22 のオブジェクトが入ります。
Null が入っている状態で、そこにオブジェクトを代入する際に
エラーとなります。

コード: 全て選択   展開ビュー折りたたみビュー
Dim oOptGrp1(1 to 3) As Object
Dim oOptGrp2(1 to 3) As Object

For i = 1 to 3
  oOptGrp1(i) = oDialog.getControl("optGrp1" & i)
Next i

For i = 1 to 3
  oOptGrp2(i) = oDialog.getControl("optGrp2" & i)
Next i


Dim vntOffCtrl As Variant

oOptGrp1(1).Model.State = 1  '[ON]
oOptGrp1(1).Model.FontWeight = com.sun.star.awt.FontWeight.BOLD
vntOffCtrl = OptionButtonGetOffChange ( oOptGrp1 ,False )  '(*1)
If Not IsNull(vntOffCtrl) Then
  vntOffCtrl.Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
End If

oOptGrp2(1).Model.State = 1  '[ON]
oOptGrp2(1).Model.FontWeight = com.sun.star.awt.FontWeight.BOLD
vntOffCtrl = OptionButtonGetOffChange ( oOptGrp2 ,False )  '(*2)
If Not IsNull(vntOffCtrl) Then
  vntOffCtrl.Model.FontWeight = com.sun.star.awt.FontWeight.NORMAL
End If


ただ、直接、Null 代入 ⇒ オブジェクト代入という処理を行なってもエラーには
なりません。Variant 返却値を持つユーザー定義関数からの代入の場合に
エラーになるようです。

この違いの原因は不明ですが、障害回避の為に、Nothing を返すように
変更しました。
K.Tsunoda
 
記事: 71
登録日時: 11月 2nd, 2008, 6:44 pm


Return to コードスニペット(便利な汎用コード)

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[2人]