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()へ飛んでからボタンの処理に飛ぶようにする。
上記以外に、何か手段はありますでしょうか?
また、ツールバーコントロール自体のバグなんじゃないかとも思っているのですが、何かこの現象について情報がありましたら、お教えください。
No.1
- 回答日時:
原因についてはコードを見てみないとよくわかりません。
が、似たような現象は何度も経験した覚えがあります。その詳細は忘れましたが。。。試しに前回のボタンの状態を復元するサンプルを作ってみました。はずしていたらレスしてください。
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
回答ありがとうございます。
多少やり方は異なりますが、私が書いたソースも回答していただいたソースと同じように、INIファイルに終了時のボタン状態を保存し、次回起動時にそのボタンが押された状態になるようにしています。
質問文がわかりにくかったかもしれませんが、このボタン状態の復元には問題ありません。
その後メニューだけで操作すると、起動時に押された状態のボタンがずっと押された状態のままで変化しないのです。
回答していただいたソースをコピー&ペーストして実行してみましたが、やはりメニューから操作すると、起動時に押されていたボタンがずっと押された状態のままでした。
なお、質問では書き忘れていましたが、WindowsのOSは2000とNT4.0です(それ以外のOSでは未確認)。
No.2ベストアンサー
- 回答日時:
すみません。
#1 では何にもならないですね。デバックのとき出来たと思って勘違いしてしまいました。Load イベントを次に変えればOKかと思います。根本的な要因についてはわかりません。
Private Sub Form_Activate()
DoEvents
mnuTest_Click GetPrivateProfileInt("Settings", "test", 1, App.Path & "\test.ini")
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ExcelVBA】動的にボタン、ボタン名を生成できますか? 7 2022/04/08 12:54
- ノートパソコン Windows10のノートパソコンをさっきまで使っていて、指紋がついてたからぱっぱっとティッシュでキ 6 2022/07/13 01:52
- 画像編集・動画編集・音楽編集 CyberLinkPowerDirectorでDVD作成時タイトル/チャプターのボタンが押せない 1 2023/04/09 12:30
- マウス・キーボード キーボード設定で困っています。長文です。 2 2022/12/10 12:44
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- その他(生活家電) テレビリモコンのボタン修理 6 2022/05/02 22:30
- ノートパソコン シャットダウンを止めるには 1 2022/09/11 14:36
- その他(パソコン・スマホ・電化製品) 先日、OPTIPLEX790を使用しスリープ機能で電源が落ちた後に電源が付かなくなるトラブルが発生し 1 2022/12/20 01:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
フォームの再読み込み
-
.NET(VB)でボタンの連打を防止...
-
VBAで多数のプログラムを一つの...
-
VBでのエラー音の消し方
-
ダウンロードダイアログをVB...
-
[Excel VBA]コマンドボタンの入...
-
C#で動的に作ったtextboxを消す。
-
セルをマクロのボタンにしたい。
-
C#プログラムで、ボタンをショ...
-
VB.net でトグルボタンを実現し...
-
ボタンの状態
-
Access VBA でデータペーストを...
-
vb.net タイマーに引数を渡す
-
エクセルVBAでユーザーフォーム...
-
コマンドボタンやイメージにマ...
-
他のアプリケーションとの連携
-
excel シート上のボタンが動かない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
フォームの再読み込み
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
セルをマクロのボタンにしたい。
-
コマンドボタンやイメージにマ...
-
Excel VBA Application.caller...
-
VBAのボタンの位置が変わって困...
-
Access VBA でデータペーストを...
-
プロシージャからイベントをコ...
-
他のアプリケーションとの連携
-
閉じると「+」になり開くと「-...
-
C#で動的に作ったtextboxを消す。
-
ボタンをマウスで押し続けたと...
-
VBA でのボタンの移動について
-
ボタン
-
CommandButtonのCaptionを変化...
-
TextBoxでEnterキーを押すと、...
-
VB.net でトグルボタンを実現し...
おすすめ情報