2つの異なるリストボックスの位置の同期をとるには?

解決


豚猫  2005-07-11 11:24:15  No: 90915  IP: [192.*.*.*]

たびたびの質問失礼致します。

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

編集 削除
豚猫  2005-07-11 11:25:37  No: 90916  IP: [192.*.*.*]

すいません。
またもや記載もれ・・・。><

開発環境

Windows2000
VB6.0

編集 削除
ねろ  2005-07-11 13:08:46  No: 90917  IP: [192.*.*.*]

他に方法があると思いますが、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

編集 削除
豚猫  2005-07-11 13:26:12  No: 90918  IP: [192.*.*.*]

>ねろ様

ご返答ありがとうございます。
ご教授いただいた内容にて解決致しました。

当初、リストボックス.Selected  というものは
チェックが入っている、または選択されているものの
判定に使用するとしか、考えがありませんでした。
未熟さを感じます^^;

また、上記ソース内にて
フラグが意味するものを理解しようとフラグなしにて
実行したところ、一度選択したものや
Ctrl等により、複数選択した際に、
選択解除にならなかったり、と動作が不安定でした。

対になるリストボックスにselected=TRUEをすると
CLICKイベントに飛ぶ。この場合の制御に使用しているのだと
把握しました。

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

編集 削除