プロが教えるわが家の防犯対策術!

VB6(SP5)でプログラムを作っていますが、ツールバーのボタンの動作がおかしくて困っています。

ツールバーにボタンを3つ作り(Aボタン、Bボタン、Cボタンとします)、スタイルをtbrButtonGroupにしました。当然、どれかひとつのボタンを押すと、他の二つは自動的にUnPressed状態に変わります。
起動直後、どのボタンがPressed状態になっているかは、INIファイルの設定にしたがいます。

この、ボタンを押しての機能切り替えをメニューからもできるようにしています。
つまり、メニューでAを選択すると、Aボタンを押したのと同じ状態になり、AがPressed、B、CボタンがUnPressed状態になります。

ところが、メニューで操作すると、起動時にPressed状態になっているボタンがずっとUnpressed状態のままになってしまいます。一度ツールバーでボタンを操作すると、その後はメニューで操作してもボタンは正常にトグルするのですが、メニューだけで操作していると、ずっとPressed状態のままです(ボタン表面の色だけ、PressedとUnpressedで変わります)。

現時点で以下の対策を試してみましたが、まったく効果ありませんでした。
・ツールバーのリフレッシュ。
・押されない他の二つのボタンに対してtbrUnPressedを設定する(本来tbrButtonGroupにしてあればいらないはず)。その後ツールバーをリフレッシュしてもダメ。
・メニューを選択した場合でも、一度Toolbar_ButtonClick()へ飛んでからボタンの処理に飛ぶようにする。

上記以外に、何か手段はありますでしょうか?
また、ツールバーコントロール自体のバグなんじゃないかとも思っているのですが、何かこの現象について情報がありましたら、お教えください。

A 回答 (2件)

原因についてはコードを見てみないとよくわかりません。

が、似たような現象は何度も経験した覚えがあります。その詳細は忘れましたが。。。
試しに前回のボタンの状態を復元するサンプルを作ってみました。はずしていたらレスしてください。

1.ツールバーコントロールに tbrButtonGroup スタイルのボタンを3つ配置します。
2.メニューエディタで適当な親メニューを作成し、その下層として 'mnuTest' という同じ名前のメニューを3つ作成します。3つのメニューには1から3のインデックスを付けておきます。キャプションは 'A'、'B'、'C' とでもしておきます。
3.プロジェクトを適当な場所に保存してから実行します。

Option Explicit

Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Private Sub Form_Load()

mnuTest_Click GetPrivateProfileInt("Settings", "test", 1, App.Path & "\test.ini")

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim i As Long

For i = mnuTest.LBound To mnuTest.UBound
If mnuTest(i).Checked Then Exit For
Next

WritePrivateProfileString "Settings", "test", CStr(i), App.Path & "\test.ini"

End Sub

Private Sub mnuTest_Click(Index As Integer)

If Not Toolbar1.Buttons(Index).Value = tbrPressed Then
test Index
Toolbar1.Buttons(Index).Value = tbrPressed
End If

End Sub

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)

test Button.Index

End Sub

Private Sub test(Index As Integer)

Dim i As Long

For i = mnuTest.LBound To mnuTest.UBound
mnuTest(i).Checked = i = Index
Next

'ボタンの変更による処理が必要であればこれ以降に記述します

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

多少やり方は異なりますが、私が書いたソースも回答していただいたソースと同じように、INIファイルに終了時のボタン状態を保存し、次回起動時にそのボタンが押された状態になるようにしています。
質問文がわかりにくかったかもしれませんが、このボタン状態の復元には問題ありません。
その後メニューだけで操作すると、起動時に押された状態のボタンがずっと押された状態のままで変化しないのです。

回答していただいたソースをコピー&ペーストして実行してみましたが、やはりメニューから操作すると、起動時に押されていたボタンがずっと押された状態のままでした。

なお、質問では書き忘れていましたが、WindowsのOSは2000とNT4.0です(それ以外のOSでは未確認)。

お礼日時:2002/01/15 13:21

すみません。

#1 では何にもならないですね。デバックのとき出来たと思って勘違いしてしまいました。
Load イベントを次に変えればOKかと思います。根本的な要因についてはわかりません。

Private Sub Form_Activate()

DoEvents
mnuTest_Click GetPrivateProfileInt("Settings", "test", 1, App.Path & "\test.ini")

End Sub
    • good
    • 0
この回答へのお礼

2度も回答ありがとうございます。

今度はうまくいきました。
これで何とかなりそうです。助かりました。
ありがとうございました。

お礼日時:2002/01/15 16:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!