- ベストアンサー
Visual Basic 6.0 コンボボックスのChangeイベントが発生しません
VB6.0を使用しておりますが、 コンボボックスのリストから選択して値を変更しても Changeイベントが発生しないです。 コンボボックスの入力欄に直接入力した場合はChangeイベントは 発生します。 リストから選択して、Changeイベントを発生されるには どうしたら良いでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
'コンボボックスに追加 Private Sub Form_Load() Combo1.AddItem "AAA" Combo1.AddItem "BBB" Combo1.AddItem "CCC" End Sub 'コンボボックスの入力欄に直接入力した場合 Private Sub Combo1_Change() Debug.Print Combo1.Text End Sub 'リストから選択して、Changeイベントを発生 Private Sub Combo1_Click() Call Combo1_Change End Sub
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
MSDNにChangeイベントはTextボックスの内容を変更した際に発生するものであり 矢印キーやドロップダウンリストから選択された場合は発生しないと明記されています どうしてもということであれば CBN_SELCHANGEメッセージ捕まえてChangeイベントを起こすしかないようです Combo1_ChangeをPrivateからPublicに変更します 標準モジュールを追加して Declare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function CallWindowProc Lib "user32" Alias _ "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _ ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Public Const GWL_WNDPROC = (-4) Public Const CBN_SELCHANGE = 1 Global lpWndProc As Long Public Function ComboProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim NM As Long ComboProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam) NM = (wParam And &HFFFF0000) If NM = CBN_SELCHANGE * &H10000 Then Form1.Combo1_Change End If End Function を記述します Form1のLoadイベントとQueryUnLoadイベントを追加します Loadイベントで lpWndProc = SetWindowLong(Combo1.hwnd, GWL_WNDPROC, AddressOf ComboProc) QueryUnloadイベントで SetWindowLong Combo1.hwnd, GWL_WNDPROC, AddressOf lpWndProc を記述します これで選択を変更した際に Changeイベントが呼ばれます ただし、WindowProcを書き換えているのでVB上から実行した際にブレークポイントなどを設定していると VBのシステム自体が落ちてしまいます Debug.Printなどで 変数をインディエイトに表示することは可能です
お礼
回答ありがとうございました。 API関係は詳しくない為、このような方法があるとは知りませんでした。 専門的な知識に感謝いたします。
お礼
回答ありがとうございます。 この方法で希望する動きが実現できました。 改めて応用力が必要と痛感しました。 勉強になりました。