フォーカスのないコンボボックスのListIndexを取得するには?

解決


yakkung  2011-02-11 01:23:32  No: 102774

失礼します。
VB6です。
まず、以下操作の流れです。
・コンボボックスで項目を選択(当然選択された項目が表示されています)
・他のコントロールにフォーカスを移動(他の入力をしていきます)
・最後に処理実行ボタンを押します
さて、処理実行ボタンを押した時に、コンボボックスのListIndexは?
当方では「-1」になるんですけど、そういうものなのでしょうか?
現在表示されている項目のListIndexは取得できないのでしょうか?
よろしくお願いします。


魔界の仮面弁士  2011-02-11 01:52:25  No: 102775

> 当方では「-1」になるんですけど、
フォーカスの遷移だけならば、ListIndex が勝手に -1 になる事は無いと思います。

ところで、その ComboBox の Style は何に設定されていますか?
ドロップダウンコンボの場合、ドロップダウンリストに比べると
ListIndex が -1 になる可能性が高くなります。
(Text を編集した場合、ListIndex が -1 になるため)

> そういうものなのでしょうか?
変更される可能性としては、以下のような物があります。

・Text プロパティへの代入を行った場合(Style がドロップダウンコンボの場合)。
・ユーザーがテキストを編集した場合(Style がドロップダウンコンボの場合)。
・SendKeys 等の影響を受けて、ドロップダウンコンボが編集されてしまっていた場合。
・現在選択中の項目が RemoveItem された場合。
・DataSource へのデータバインドが行われており、かつ、ComboBox の一覧に無い値が渡された場合。
・ListIndex プロパティに -1、または -1 に相当する値(True など)が代入された場合。

もしもユーザー操作ではなく、プログラムの影響で -1 になっているのだとしたら、
下記の方法で、原因を特定できるかもしれません。

(1) [表示]-[ウォッチウィンドウ]でウォッチペインを表示させます。
(2) メニューから[デバッグ]-[ウォッチ式の追加]を選択します。
(3) 式に『Combo1.ListIndex』と記入します。
(4) 対象として『Form1』『(すべてのプロシージャ)』を選択します。
(5) ウォッチの種類として、『式の内容が変化したときに中段』を選択します。
(6) OK を押してダイアログを閉じ、デバッグ実行します。
(7) コードの影響を受けて ListIndex が変更されてた場合、該当箇所で
  一時停止します(変更された直後に、影響を与えた行で一時停止します)。
(8) ここで[表示]-[呼び出し履歴]を使うと、そのプロシージャの呼び出し元も特定できます。


yakkung  2011-02-11 04:55:49  No: 102776

いつもお世話になります(^^>
>フォーカスの遷移だけならば、ListIndex が勝手に -1 になる事は無いと思います。
>変更される可能性としては、以下のような物があります。
>・Text プロパティへの代入を行った場合(Style がドロップダウンコンボの場合)。

・テキストボックスに「コード」を入力
・コンボボックスの該当(ItemData=入力された「コード」の)項目を表示
ということをやってます。
デフォルトの簡易検索?(入力語句と先頭一致するリストへジャンプする)
機能は使うので、ドロップダウンリストにはできません(リストは確か入力できませんよね?)。

コンボボックスのリストは起動時にセットし、
以降、並び順も含めて追加削除など変更することはありません。

ということは、変更した時にListIndexを保持しておくことで
解決はできるかと思います。
ただ、「今、表示されているリスト項目のindexがとれないものか」
ということでお尋ねした次第です。

ありがとうございました。


魔界の仮面弁士  2011-02-12 05:09:36  No: 102777

> ・コンボボックスの該当(ItemData=入力された「コード」の)項目を表示

その部分は、どのように処理されているのでしょうか?

For n = 0 To Combo1.ListCount - 1
    If Combo1.ItemData(n) = Code Then
        'Combo1.ListIndex = n            'この方法だと、ListIndex は 0 以上の値になる
        'Combo1.Text = Combo1.List(n)    'この方法だと、ListIndex は -1 になる
        Exit Sub
    End If
Next


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加