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()へ飛んでからボタンの処理に飛ぶようにする。

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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

すみません。

#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

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

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

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

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

このQ&Aと関連する良く見られている質問

QVB6.0のツールバー標準メニューボタンが消える

VisualBasic6.0を使用しているのですが、何かのきっかけで標準ツールバー(メニューバーの下の保存ボタンなどがあるバー)から、起動のたびにボタンが1つずつ消えていきます。リセットすると元に戻るのですが、次回の起動にはまた1つ消えている・・・と言った具合です。
昨年同じ現象が起こった時は、確かVBを再インストールしても直りませんでした。その後何かして直ったんですが、何をしたやら・・・(おい)。多分原因はレジストリ関連だと目星をつけていますが、うかつに触れませんし・・・。
どうぞ解決方法をご存知の方はお教えくださいませ。

Aベストアンサー

私も、同じ現象に遭遇しています。
表示メニューあたりが、ほとんど消えてしまう状況になります。
知り合いの話では、SP4を入れると現象がでるようなことらしいです。
最近出たSP5でも直っていないということでした。

で、対処方法ですが。。。
ツールバーが表示される領域で右クリックすると、表示させるツール
バーのメニューが表示されますが、この下に、ユーザ設定っていうメ
ニューがありますよね。
これをクリックして表示されるダイアログに、リセットっていうボタ
ンがありますので、こいつをクリックすると、初期設定に戻ります。
ただし、いつしか、またメニューが消えることがあるので、そうなっ
たら、また、上記の操作を行ってあげてください。
いまのところ、こういう操作でしか回避できる方法は知りません。

参考になりましたでしょうか??

MSのことなので、どうせ直る前に次のメジャーバージョンアップが
行われるのでしょうが。。

Qvba ie操作 ボタンを押したい(2)

https://ca.omc-card.co.jp/member/omcplus_login.html
のサイトにログインしたいのですが、ログインボタンが押せません。

ソースは、
**********************************************************************************
<FORM action="../member/xt_mem_top_login.asp" method="post" name="form1"><input type="hidden" name="sid" value=""><input type="hidden" name="pw" value=""> 
   ~~~省略~~~
<TABLE border="0" cellspacing="0" cellpadding="5" class="tab_button_bottom15">
<TR>
<TD><A href="javascript:checkInput(document.form1);"><IMG src="../img/button/login.gif" alt="ログイン" width="160" height="35" border="0"></A></TD>
</TR>
</TABLE>
</FORM>
**********************************************************************************
です。

---------------------------------------------------------------------------------
Sub test()
Dim objIE As InternetExplorer

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://ca.omc-card.co.jp/member/omcplus_login.html"

Do While objIE.Busy = True Or objIE.ReadyState <> 4
DoEvents
Loop

objIE.Document.forms(0).Item("sid_input").Value = "×××"
objIE.Document.forms(0).Item("pw_input").Value = "×××"

Do While objIE.Busy = True Or objIE.ReadyState <> 4
DoEvents
Loop

'objIE.Document.forms(1).submit 'エラーになる
objIE.Document.all.Item("document.form1").Click 'エラーになる
objIE.Document.forms(0).getElementsByTagName("input")(0).Click 'エラーにならないけどクリックもされない。
objIE.Document.forms(0).getElementsByTagName("input")(1).Click 'エラーにならないけどクリックもされない。
objIE.Document.forms(0).getElementsByTagName("document.form1")(1).Click 'エラーになる
objIE.Document.forms(1).getElementsByTagName("input")(1).Click 'エラーになる

Set objIE = Nothing
End Sub
---------------------------------------------------------------------------------

テキストにIDとPWを入れるところまでは出来たのですが、
ログインボタンを押すことができません。

すいませんがご教授ご回答よろしくお願いしますm( )m

https://ca.omc-card.co.jp/member/omcplus_login.html
のサイトにログインしたいのですが、ログインボタンが押せません。

ソースは、
**********************************************************************************
<FORM action="../member/xt_mem_top_login.asp" method="post" name="form1"><input type="hidden" name="sid" value=""><input type="hidden" name="pw" value=""> 
   ~~~省略~~~
<TABLE border="0" cellspacing="0" cellpadding="...続きを読む

Aベストアンサー

 「ログイン」と表示されたボタンの html コード には
<A href="javascript:checkInput(document.form1);"><IMG src="../img/button/login.gif" alt="ログイン" width="160" height="35" border="0"></A>
と書かれています。

 この html ソース は、簡単にいうと
<A href="リンク先URL"><IMG src="画像のURL"></A>
という構造で「画像をクリックするとリンク先のページが開く」ということを意味しています。

 ここの場合は、実際には「javascript:~~」というページはなく、「login.gif」という画像をクリックすると「checkInput(document.form1);」という「javascript」が働くというコードになります。

 従って、WEBページ自体の html 構造やブラウザ等のセキュリティの関係で受け付けてもらえない場合もありますが。。。

objIE.navigate "javascript:checkInput(document.form1);"

でもイケマス。

 「ログイン」と表示されたボタンの html コード には
<A href="javascript:checkInput(document.form1);"><IMG src="../img/button/login.gif" alt="ログイン" width="160" height="35" border="0"></A>
と書かれています。

 この html ソース は、簡単にいうと
<A href="リンク先URL"><IMG src="画像のURL"></A>
という構造で「画像をクリックするとリンク先のページが開く」ということを意味しています。

 ここの場合は、実際には「javascript:~~」というページはなく、「login.gif」という画像を...続きを読む

QEXCELメニューのツールにある操作をVBAで行わせたい

EXCEL 2003のマクロ(VBA)ですが、プログラミングですので、こちらに投稿いたします。

以下の2点をVBAで実行させたく、ネットでくまなく調べているのですが、サンプルソースすら見つけられませんでした。

どなたか、ご存知の方がいらっしゃいましたら、ご教授くださいませ。
よろしくお願い致します。

------------
ツール⇒オプション⇒セキュリティ⇒□読み取り専用を推奨する
のチェックON or OFFさせた後、[OK]を実行したときと同じ操作をさせたい。

ツール⇒ブックの共有⇒□複数のユーザーによる同時編集とブックの統合を許可する
のチェックを外した後、
「このファイルの保護を解除してもよろしいですか?」のメッセージを無視し、
[はい]を実行したときと同じ操作をさせたい。

Aベストアンサー

[DisplayAlerts プロパティ]について調べてみると良いでしょう。
それ以外のコードはマクロ記録がヒントになると思います。

Sub try1()
  Dim flg As Boolean
  
  flg = (MsgBox("読み取り専用推奨?", vbYesNo) = vbYes)
  With ThisWorkbook
    Application.DisplayAlerts = False
    .SaveAs .FullName, ReadOnlyRecommended:=flg
    Application.DisplayAlerts = True
  End With
End Sub

Sub try2()
  With ThisWorkbook
    If .MultiUserEditing Then
      Application.DisplayAlerts = False
      .ExclusiveAccess
      Application.DisplayAlerts = True
    End If
  End With
End Sub

[DisplayAlerts プロパティ]について調べてみると良いでしょう。
それ以外のコードはマクロ記録がヒントになると思います。

Sub try1()
  Dim flg As Boolean
  
  flg = (MsgBox("読み取り専用推奨?", vbYesNo) = vbYes)
  With ThisWorkbook
    Application.DisplayAlerts = False
    .SaveAs .FullName, ReadOnlyRecommended:=flg
    Application.DisplayAlerts = True
  End With
End Sub

Sub try2()
  With ThisWorkbook
    If .MultiUserEditing Then
...続きを読む

Q他アプリの操作(メニューバー)

市販されているアプリケーションを自分で作成しているソフトで操作したいのですが、どの様に制御したらいいのか判りません。プログラムはVB6.0で作成しております。
したい事は他のアプリケーションでメニューバーの中の項目の
印刷項目を選択したいのですが、メニューバーのハンドルを取得
出来ず困っております。
そもそもメニューバーのハンドルって取得できるのでしょうか?

Aベストアンサー

ウィンドウハンドルの取得については割愛します。

Option Explicit

Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111

Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type

' hWndに指定したウィンドウのメニュークリックをエミュレート
' Menusには、メニューを辿る順序を文字列配列で定義
' ファイル -> 印刷 であれば Menus() = {"ファイル", "印刷"}
Private Sub EmulateMenuClick(ByVal hWnd As Long, Menus() As String)
Dim hMenu As Long, lngID As Long, intMenuIndex As Integer
hMenu = GetMenu(hWnd)

' メニュー階層をたどる
For intMenuIndex = 0 To UBound(Menus)

If ContainMenu(hMenu, Menus(intMenuIndex), lngID) = False Then
Call MsgBox("一致するメニューはありません。")
Exit Sub
End If

Next

' 最終的に見つかったメニューのIDをWM_COMMANDでPostMessage
Call PostMessage(hWnd, WM_COMMAND, lngID, 0&)
End Sub

' hMenuのメニューハンドル内でTextの文字列と一致するメニューがあるかどうかを返す
' 見つかればTrue。このとき、hMenuにはサブメニューのハンドル、IDにはメニューのIDが返される
' 見つからなければFalse
Private Function ContainMenu(hMenu As Long, ByVal Text As String, ID As Long) As Boolean
Dim lngCount As Long, lngPos As Long
Dim typMenuItem As MENUITEMINFO
lngCount = GetMenuItemCount(hMenu)

' メニューの個数でループ
For lngPos = 0 To lngCount - 1
typMenuItem.fMask = &H3F&

typMenuItem.dwTypeData = vbNullChar
typMenuItem.cch = 0
typMenuItem.cbSize = Len(typMenuItem)
Call GetMenuItemInfo(hMenu, lngPos, 1, typMenuItem)

typMenuItem.dwTypeData = String(typMenuItem.cch, " ")
typMenuItem.cch = typMenuItem.cch + 1
typMenuItem.cbSize = Len(typMenuItem)
Call GetMenuItemInfo(hMenu, lngPos, 1, typMenuItem)

Debug.Print typMenuItem.dwTypeData

' メニューの文字列を比較(比較方法はどちらでも)
'If typMenuItem.dwTypeData = Text Then
If typMenuItem.dwTypeData Like Text Then

' 一致したらIDとサブメニューハンドルを返す
ID = typMenuItem.wID
hMenu = typMenuItem.hSubMenu
ContainMenu = True
Exit Function
End If
Next

ContainMenu = False
End Function

EmulateMenuClickにウィンドウハンドルと実行したいメニューを辿る文字列配列を渡してください。
画像は、このコードを利用してAPIビューアのバージョン情報をForm1から実行して表示させたものです。

ウィンドウハンドルの取得については割愛します。

Option Explicit

Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA...続きを読む

Qボタンってコントロール?ツールストリップメニューアイテムもコントロール?

スミマセン...教えて頂けますか?
メソッド命名のためにボタンとツールストリップメニューアイテムを一くくりにしたいのですが両方ともコントロールといって間違いないですか?
それとも他に適切な表現がありますか?
大変申し訳ありません。よろしくお願いします。

Aベストアンサー

いわゆるプッシュボタンはコントロールです。
ツールストリップメニューアイテムもコントロールですね。

メソッド命名ならそんなこだわる必要も無いですが、
UIItem(ユーザインターフェースアイテム)などでも可笑しくはないと思います。


人気Q&Aランキング

おすすめ情報