たびたびの質問失礼致します。
2つのリストボックスの同期を取りたいのですが
上手くいきません。
以下に詳細とソースを記載致します。
リストA:ファイル名格納
リストB:リストAにて表示しているファイルのタイムスタンプ
Private Sub リストA_Click()
Me.リストB.ListIndex = Me.リストA.ListIndex
Me.リストB.TopIndex = Me.リストA.TopIndex
End Sub
Private Sub リストB_Click()
Me.リストA.ListIndex = Me.リストB.ListIndex
Me.リストA.TopIndex = Me.リストB.TopIndex
End Sub
上記のようなコーディングしており、
リストボックスのプロパティ値である【MultiSelect】が
【0−なし】の場合は、問題なく動作しておりました。
しかし、現状リストボックスは、Ctrlキー等の使用時に
複数選択できるようにするため【2−拡張】へ
プロパティ値を変更致しました。
すると、動作しなくなりました。
そこで、Clickイベントではなく、MouseDownイベントに
上記ソースをコーディング致しました。
引数に、Shiftがあり、Ctrlキーを押した場合は、【1】
Shiftを押した場合は、【2】が入っておりました。
上記引数等を利用してどうにかならないかと検討したのですが
わかりませんでした。
ご存知の方がいらっしゃいましたら
アドバイスを頂きたいと思います。
以上、よろしくお願いいたします。
【Shift As Integer】のShift
すいません。
またもや記載もれ・・・。><
開発環境
Windows2000
VB6.0
他に方法があると思いますが、Selectedプロパティを使うと
下の様になりますが、気をつける点は処理が襷がけになっているので
Aの処理の中からBの処理が呼ばれその中から更にAの処理が呼ばれ
最後にスタックのオーバーフローになってしまう可能性がある点です。
ある処理が処理中の場合グローバルフラグでそれを回避します。
Option Explicit
Dim Flg As Boolean
Private Sub リストA_Click()
Dim i As Integer
If Flg Then Exit Sub
Flg = True
リストB.TopIndex = リストA.TopIndex
For i = 0 To リストA.ListCount - 1
If リストA.Selected(i) Then
リストB.Selected(i) = True
Else
リストB.Selected(i) = False
End If
Next
Flg = False
End Sub
Private Sub リストB_Click()
Dim i As Integer
If Flg Then Exit Sub
Flg = True
For i = 0 To リストB.ListCount - 1
リストA.TopIndex = リストB.TopIndex
If リストB.Selected(i) Then
リストA.Selected(i) = True
Else
リストA.Selected(i) = False
End If
Next
Flg = False
End Sub
Private Sub リストA_Scroll()
リストB.TopIndex = リストA.TopIndex
End Sub
Private Sub リストB_Scroll()
Me.リストA.TopIndex = リストB.TopIndex
End Sub
>ねろ様
ご返答ありがとうございます。
ご教授いただいた内容にて解決致しました。
当初、リストボックス.Selected というものは
チェックが入っている、または選択されているものの
判定に使用するとしか、考えがありませんでした。
未熟さを感じます^^;
また、上記ソース内にて
フラグが意味するものを理解しようとフラグなしにて
実行したところ、一度選択したものや
Ctrl等により、複数選択した際に、
選択解除にならなかったり、と動作が不安定でした。
対になるリストボックスにselected=TRUEをすると
CLICKイベントに飛ぶ。この場合の制御に使用しているのだと
把握しました。
以上、ありがとうございました。