リストボックスのチェックについて


正義の支社  2005-05-12 11:52:07  No: 89784  IP: [192.*.*.*]

リストボックスでstyleをチェックボックス型にした場合に□を押すとチェックがつきますが、文字の部分は2回押さないと□にチェックがつかないです。
なんとか文字の部分も1回チェックしただけでつくようになりませんか?

編集 削除
K.J.K.  2005-05-12 13:01:56  No: 89785  IP: [192.*.*.*]

Clickイベント中でSelectedプロパティを反転させるとか。
プロシージャへの再入を阻むことと、カーソルの位置によっては
無視すること、に気をつければ問題なく実装できるでしょう。

編集 削除
正義の支社  2005-05-12 13:14:42  No: 89786  IP: [192.*.*.*]

MouseDownの時に
lst.Selected(listindex) = True 
のようにしてみたら、文字の部分を押してもチェックがついたり、はずせたりするようになったのですが、
□→■→□(□がチェックしてない状態、■がチェックしている状態)
の順に押すと、3番目のチェックが外れた状態から押しても反応が全くなくなりました。
一度他の部分を押してからだとチェックが入るのですが、同じ行を連続で押すときちんと動かないです。
対処法はありますか?

編集 削除
K.J.K.  2005-05-13 10:14:29  No: 89787  IP: [192.*.*.*]

なぜ、Trueに固定決めうちなのでしょう?
それと適切に再入を阻んでいます?

編集 削除
正義の支社  2005-05-13 10:43:17  No: 89788  IP: [192.*.*.*]

Falseもやってますよ。
押されてる状態ならFalseにして、押されていない状態ならTrueにしてます。

編集 削除
LESIA  2005-05-13 11:30:14  No: 89789  IP: [192.*.*.*]

こんな感じでいいのでは?

Option Explicit

Private OldIndex As Integer

Private Sub Form_Load()
    List1.Clear
    
    List1.AddItem "123"
    List1.AddItem "456"
    List1.AddItem "789"
    
    List1.ListIndex = 0
    OldIndex = 0
End Sub

Private Sub List1_Click()
    If List1.ListIndex = OldIndex Then Exit Sub
    
    List1.Selected(List1.ListIndex) = Not List1.Selected(List1.ListIndex)
End Sub

Private Sub List1_ItemCheck(Item As Integer)
    OldIndex = Item
End Sub

編集 削除
LESIA  2005-05-14 10:23:35  No: 89790  IP: [192.*.*.*]

ちょっと補足。
リストボックスで選択されている行(青くなっている行)は
文字の部分をクリックしても□にチェックがつきますが
選択されている行じゃない行は、文字の部分をクリックすると
選択されるだけです。
この状態でもう一回クリックすると、上の、選択されている行の
文字をクリックするのと同じ動作なので、□にチェックがつきます

というわけで、選択されている行とは違う行をクリックした時だけ
チェックの値を反転させれば良いです。

編集 削除
 2005-05-17 15:25:07  No: 89791  IP: [192.*.*.*]

その処理を追加した場合、lst.selected(i)=trueみたいな感じにするとClickイベントにいきませんか?

編集 削除
LESIA  2005-05-18 08:59:06  No: 89792  IP: [192.*.*.*]

□をチェックしたときも、ItemCheckイベントの後にClickイベントが発生するので、大丈夫だと思います。
ただ、前に選択していた行とSelectedをTrueにした行の両方が青くなってしまう
みたいですが、List1.Refreshとすれば、SelectedをTrueにした行だけが青く
なります。

編集 削除