• ベストアンサー

ComboBoxについておしえてください

↓・↑とクリックを区別したいのですがどうすればよいのか 教えてください。 ↑をおすとKeyDownにいきClickにいきます。 ↑をおしたときにClickにいかないようにすることはできませんか? よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

サンプルを作ってみました。 必要なものは フォーム1 コンボボックス1 標準モジュール です。 処理を説明します。 サブクラス化という処理をしています。 VBにはクリックやボタンダウンなどのイベントがありますが、全てWIndowsが送ってくる定数(メッセージ)を読み取り、その値によってイベントの内容が決まります。このプログラムはコンボボックスにくるWINDOWSからのメッセージをcomboProc関数にて監視し(これがサブクラス化)、カーソルのイベントだけコンボボックスのリスト部分が非表示のときには、メッセージをWINDOWSに返さないようにしています。もしリスト部分が表示されていても、WM_COMMANDという決定というメッセージを返さないようにしています。 サブクラス化の最中に強制終了をすると、VBが落ちます。必ず普通にフォームを閉じて終了しましょう。 常にこの関数が動いている状態なので、プログラム作成最終段階での組み込みをお奨めします。それまでは、[サブクラス化の開始][サブクラス化の終了]部分をコメントにしておくだけで、このプログラムは動きませんので安心してください。 -----フォーム1(ここから)----- Private Sub Form_Load()   With Me     'ダミーのデータ     With .Combo1       .AddItem 1       .AddItem 2       .AddItem 3       .AddItem 4     End With          'サブクラス化の開始     pLngProc = SetWindowLong(.Combo1.hwnd, GWL_WNDPROC, AddressOf comboProc)   End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   With Me     'サブクラス化の終了     Call SetWindowLong(.Combo1.hwnd, GWL_WNDPROC, pLngProc)   End With End Sub -----フォーム1(ここまで)----- -----標準モジュール(ここから)----- Option Explicit Public Const GWL_WNDPROC  As Long = (-4) Private Const WM_COMMAND = &H111 'メニューが選択されたあるいはコントロールにイベントが発生した Private Const WM_KEYDOWN = &H100 'キーボードのキーが押された Private Const WM_KEYUP = &H101 'キーが解放された Private Const CB_GETDROPPEDSTATE = &H157 'コンボボックスでリストボックス部が開いているかどうか調べる Private Const CB_SHOWDROPDOWN = &H14F 'コンボボックスでドロップダウンリストを表示・非表示 Private Const KEY_UP  As Byte = &H1 Private Const KEY_DOWN As Byte = &H2 Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function CallWindowProc Lib "user32.dll" 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 pLngProc   As Long 'カーソル↑←を押されたとき、1バイト目にフラグを立てる 'カーソル↓→を押されたとき、2バイト目にフラグを立てる Private bytKeyFlg  As Byte Public Function comboProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long   Select Case uMsg     'キーダウン     Case WM_KEYDOWN       'wParamにはキーコードが入る       Select Case wParam         'カーソル↑←         Case vbKeyUp, vbKeyLeft           '1バイト目にフラグを立てる           bytKeyFlg = bytKeyFlg Or KEY_UP         'カーソル↓→         Case vbKeyDown, vbKeyRight           '2バイト目にフラグを立てる           bytKeyFlg = bytKeyFlg Or KEY_DOWN         'その他のキー         Case Else           '通常処理でメッセージを返す           GoTo PGMEND       End Select              'コンボボックスのリスト部分が非表示のときは、メッセージを返さない       If SendMessage(hwnd, CB_GETDROPPEDSTATE, ByVal 0&, ByVal 0&) = 0 Then         GoTo PGMEXIT       End If     'キーアップ     Case WM_KEYUP       'wParamにはキーコードが入る       Select Case wParam         'カーソル↑←         Case vbKeyUp, vbKeyLeft           '1バイト目のフラグをおろす           bytKeyFlg = bytKeyFlg And (Not KEY_UP)         'カーソル↓→         Case vbKeyDown, vbKeyRight           '2バイト目のフラグをおろす           bytKeyFlg = bytKeyFlg And (Not KEY_DOWN)       End Select          'クリックやEnter入力時の処理     Case WM_COMMAND       'カーソル↑←やカーソル↓→が移動するたびに、値を設定してしまうのを防ぐ       If bytKeyFlg > 0 Then         'カーソルキーのフラグがたっているので、メッセージを返さない         GoTo PGMEXIT       End If       '強制的にDROPDOWNリストを閉じる       Call SendMessage(hwnd, CB_SHOWDROPDOWN, 0&, ByVal 0&)   End Select PGMEND:   comboProc = CallWindowProc(pLngProc, hwnd, uMsg, wParam, lParam) PGMEXIT: End Function -----標準モジュール(ここまで)-----

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

すいません。さっきのエラーです。+書き忘れです。 書き忘れは、コンボボックスのスタイルがドロップダウンリスト限定だと言うことです。ドロップダウンコンボのままでは無意味です。 エラーはカーソルで選んでエンターを押してもクリックイベントが発生しません。。。もうちょっと研究が必要です。。。m(__)m

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

>  SendMessage Combo1, CB_SHOWDROPDOWN, 1, 0 の書き方が違います   SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 1, 0 が正しい書き方です。 でもこのAPI、ドロップダウンリストの表示/非表示の切り替えをするだけで、仕様を満たさないのではないのでしょうか?

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode = vbKeyDown Or KeyCode = vbKeyUp) Then SendMessage Combo1, CB_SHOWDROPDOWN, 1, 0 End If End Sub

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

多分VBの標準機能では無理のような気がします。 あるといえば、 1.コンボボックスのプロセスを監視 2.キーダウンイベントにフラグを立てる 3.フラグによりテキストの変更を破棄させる といったような処理ですが、プロセス監視は結構ムズイですよ。 デバッグもしづらいし。。。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

オブジェクトは何ですか?コマンドボタンですか? ↓・↑はカーソルキーですか? 何らかのオブジェクトの上でカーソルキーを押したら、クリックイベントが発生するのを回避したいという捕らえ方でよろしいですか?

chiba-masaru
質問者

補足

やりたいことは、comboBoxでF4をおして内容を画面上に出力して クリックされたときは、Enterと同じように選択さらた内容をとりこみ 次の項目にいきたいのです。 また、↑・↓は青の帯びが上下するだけにしたいのですがどうすればいいですか またComboBoxには名称とコードをもたして ComboBox.Textには名称のみ表示したいのですが なかなかうまくいきません、これも何かいい方法はないのですか? 教えてください。

関連するQ&A

  • ComboBoxについておしえてください。

    1.ComboBox1.Clear 2.ComboBox1.AddItem "あああ" ComboBox1.AddItem "いいい" ComboBox1.AddItem "ううう" コーディングしたのですが、text部分をクリックすると  入力でき内容訂正できてしまうのですが?  上記内容で あああ・いいい・うううの選択しかできないように  したいのですが、どうすればいいのか教えてください。  できれば、下向きの三角印のとこをクリックすると       あああ・いいい・うううの選択画面が表示して       選択できますよね。       これと同じようにtext部分をクリックしても       おなじようにしたいのですが  よろしくお願いします。          

  • comboboxについて

    例えばWeb上で、 <form name="frm1"> <select name="permit"> <option value="0">いいよ</option> <option value="3">駄目!</option> </select> <input type="button" value="OKv" onClick='alert(frm1.person.value)'> <input type="button" value="OKt" onClick='alert(frm1.person.text)'> </form> こういうセレクトボックスがあったとして、画面上では「駄目!」が選択されているとします。 ここで「OKv」ボタンをクリックすると、その セレクトボックスpermit のvalueである"3"が表示されます。 ここで「OKt」ボタンをクリックすると、その セレクトボックスpermit のtextである"駄目!"が表示されます。 ウェブ上ではたったこれだけのことなんですが。 が、これをvb.net(vb 2005)でやろうとするとどうするのかわかりません・・。 comboboxのどこのプロパティに何をどうセットするのでしょうか。 ちょっと調べてみるとDataSource をセットして、DisplayMember がどうとか出てきましたが、そういうことをしないといけないのでしょうか。 こちらはDataSource も何もなく、手動で(コード上で)2コのValueとtextを設定したいだけなんですけど・・。 何か凄い間違ってるような気もするのですが・・そうでしたらその旨ご指摘くださいますようお願いします。

  • 「ComboBox」が「comboBox」になる

    どうでもいいことを聞いてもいいですか? 汗 エクセル2003です。 http://www.cocoaliz.com/excelVBA/index/39/ を参考にシート上のコンボボックスを操作しているのですが なぜ変数のオブジェクト型の部分の「MSForms.comboBox」が 「ComboBox」という風に大文字で始まらないのでしょうか? わざと「c」を大文字の「C」に書き換えても、元に戻ってしまいます。 なのに、MSForms.にして「Crtrl + j」でヒントを出した時は大文字で「ComboBox」となっています。 私だけなのでしょうか? どこかで「comboBox」と宣言してしまったのかと思い探してみましたがありませんでした。 聞かれたときに困るので教えてください。 ご教授よろしくお願い致します。

  • comboboxのクリックイベントについて

    VB6です comboboxを設置してクリックイベントに処理を書いたら、フォームロード時に必ず1回クリックイベントが発生します。 当初はフラグを立ててこの現象を回避していたのですが、コードを書くうちに、この最初のクリックイベントが面倒で仕方ありません。 comboboxを設置するとフォームロード時に必ずクリックイベントが発生するのはVB6の仕様なのでしょうか。 それともほかに回避の仕方があるのでしょうか。

  • flash comboBox

    flash CS3にてコンポーネントのcomboBoxをステージに配置し、 アイテムの追加等必要な設定を一通り行い、書き出すと正常に動作しています。 (この時書き出したswfを「xyz.swf」とします) 現在制作中のコンテンツの構成が次のようになっており メインのflashである「aaa.swf」内で 「bbb.swf」を読み込み、更に 「bbb.swf」内で「xyz.swf」を読み込んでいます。 「xyz.swf」を単体で見たときcomboBoxは正常に動作するのですが、 上記のようにswfを別のswf上に読み込んだ時、全く同じ物(xyz.swf) にもかかわらずcomboBoxが動作しません。(汗) 具体的には、comboBoxをクリックすると通常は登録されたItemがプルダウンメニューで表示されるのですが、 クリックしてもプルダウンメニューが表示されず何の反応も無いという状態です。 メインのswfから別のswfの読み込み→更に別のswfの読み込みという コンテンツの構成は変更する事はできないので困っています。 ご教授いただければ幸いです。

  • vb2005のcomboboxについて

    <form name="frm1"> <select name="permit"> <option value="0">いいよ</option> <option value="3">駄目!</option> </select> <input type="button" value="OKv" onClick='alert(frm1.permit.value)'> <input type="button" value="OKt" onClick='alert(frm1.permit.text)'> </form> Web上でこういうセレクトボックスがあったとして、画面上では「駄目!」が選択されているとします。 ここで「OKv」ボタンをクリックすると、その セレクトボックスpermit のvalueである"3"が表示されます。 ここで「OKt」ボタンをクリックすると、その セレクトボックスpermit のtextである"駄目!"が表示されます。 ウェブ上ではたったこれだけのことなんですが。 が、これをvb.net(vb 2005)でやろうとするとどうするのかわかりません・・。 comboboxのどこのプロパティに何をどうセットするのでしょうか。 ちょっと調べてみるとDataSource をセットして、DisplayMember がどうとか出てきましたが、そういうことをしないといけないのでしょうか。 こちらはDataSource も何もなく、手動で(コード上で)valueとtextを設定・取得したいだけなんですけど・・。 何か凄い間違ってるような気もするのですが・・そうでしたらその旨ご指摘くださいますようお願いします。

  • ComboBoxについて

    ComboBoxのアイテムリストからアイテムを選んだら 選んだアイテムに対応した別の文字列 をComboboxに表示したいと思います。 動き的には Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  ComboBox1.Text = ""  ComboBox1.Items.Add("000")  ComboBox1.Items.Add("001")  ComboBox2.Text = ""  ComboBox2.Items.Add("0個目")  ComboBox2.Items.Add("1個目")  ComboBox2.Visible = False End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged  Select Case ComboBox1.SelectedIndex   Case 0    ComboBox1.Visible = False    ComboBox2.Visible = True    ComboBox2.SelectedIndex = 0   Case 1    ComboBox1.Visible = False    ComboBox2.Visible = True    ComboBox2.SelectedIndex = 1  End Select End Sub Private Sub ComboBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.GotFocus  ComboBox1.Visible = True  ComboBox1.DroppedDown = True  ComboBox2.Visible = False End Sub こんな感じで、ComboBoxを二つ使えば実現できるのですが一つだけでも実現できる方法が ありましたら、教えてくださいませ。

  • ComboBoxについて

    ComboBoxのセレクトした部分を変える方法はないでしょうか? dataに[0,1,2,3,4]、labelsに[1,2,3,4,5]としたComboBoxを用意し、それを選択するとdataを変数に記憶させておき、別ボタンで隣のフレームに移動させます。 再度このComboBoxのあるフレームに移動した場合、読込時に先ほど選択した位置に変える方法が見つからず困っています。 this.selected = dataの入った変数 などいろいろ試してみましたが無理でした。 FlashMX Professional2004 7.0.1 を使用しています。

    • ベストアンサー
    • Flash
  • ComboBoxについて

    ComboBoxで例えばA、B、Cの三つ選択できるようにします。 そして、Aを選択すれば、a=1,b=2,c=3となるようにします。 同様にBを選択すればa=2,b=3,c=4、Cの場合はa=3,b=4,c=5にしたいとします。 簡単に説明すると、一つ選択されたものに対して、複数の変数の値を決めるにはどうしたらいいでしょうか? 因みに、使用しているvbはvb2008のエクスプレスエディションです。 一応書いておくと、windows vista home premium です。 初心者でして、全然わからないのでわかりやすく説明していただけると嬉しいです。 回答よろしくお願いします。

  • Comboboxについて

    コンボボックスを利用して、項目を選択できるようにしようと考えています。 検討課題は2つ。 1、コンボボックスでリスト以外の文字は入力ができないようにする。 2、前回選択した内容を次回起動時に設定する。 と言うことです。 1について DropDownStyleを「DropDownList」にすることで入力は出来なくなりましたが、 初期表示が空白になってしまいます。 初期表示でリストの先頭を表示させることはできるでしょうか? 2について 同様だと思うのですが、リストの表示を制御することは出来るのでしょうか? DropDownStyleを「DropDown」にするとTextを一致させることで実現できましたが、「DropDownList」ではTextではできないみたい。 ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。 VB.NET 2002使用

専門家に質問してみよう