Das Zusammenspiel einer DriveListBox und einer DirListBox ist mit wenigen Zeilen im Handumdrehen programmiert. Im DriveChange-Ereignis bewirkt die Anweisung
Dir1.Path = Drive1.Drive
ohne weiteres Zutun, dass die DirListBox ebenfalls zum entsprechenden Laufwerk wechselt und... tja, leider immer nur das aktuelle Verzeichnis dieses Laufwerks anzeigt.
Die Klasse KeepDir hingegen merkt sich automatisch das jeweils zuletzt vom Anwender in der DirListBox gewählte und das markierte Verzeichnis eines Laufwerks. Kehr der Anwender nach einem Wechsel in ein anderes Laufwerk wieder zum dem einen Laufwerk zurück, restauriert KeepDir automatisch das zuletzt in diesem Laufwerk eingestellte Verzeichnis und die Position der Auswahl.
Sie brauchen lediglich eine Instanz der Klasse KeepDir anlegen und ihr die betreffende DriveListBox und DirListBox mit einem Aufruf der Init-Methode zu übergeben. Alles weitere erledigt die Klasse automatisch und informiert Sie über ihre eigenen Ereignisse DriveChange, DirChange und DirClick über Änderungen der Auswahl in den beiden Steuerelementen.
Wechselt der Anwender in der DriveListBox zu einem Laufwerk, das nicht bereit ist, wird das OnError-Ereignis ausgelöst. Im Parameter RestoreLastDrive wird zunächst True übergeben. Lassen Sie den Wert unverändert, setzt KeepDir sowohl die DriveListBox als auch die DirListBox automatisch auf den vorherigen Zustand zurück. Ändern Sie den Wert in False, müssen Sie selbst auf den Fehler (der im ersten Parameter des Ereignisses übergeben wird) reagieren - gegebenenfalls mit einer Meldung für den Anwender.
Public Event DirChange()
Public Event DirClick()
Public Event DriveChange()
Public Event OnError(ByVal ErrNumber As Long, _
RestoreLastDrive As Boolean)
Private Enum EventConstants
kEventNone = 0
kEventDriveChange = 1
kEventDirChange = 2
kEventDirClick = 4
End Enum
Private WithEvents eDirListBox As DirListBox
Private WithEvents eDriveListBox As DriveListBox
Private mEvents As EventConstants
Private mKeepDirs As Collection
Private mLastDrive As String
Public Sub Init(DriveListBox As DriveListBox, _
DirListBox As DirListBox)
Set eDriveListBox = DriveListBox
Set eDirListBox = DirListBox
mLastDrive = Left$(eDriveListBox.Drive, 2)
mKeepDirs.Add eDirListBox.Path, mLastDrive
End Sub
Private Sub Class_Initialize()
Set mKeepDirs = New Collection
End Sub
Private Sub Class_Terminate()
Set mKeepDirs = Nothing
Set eDirListBox = Nothing
Set eDriveListBox = Nothing
End Sub
Private Sub eDirListBox_Change()
Dim nDrive As String
With eDirListBox
nDrive = Left$(.Path, 2)
On Error Resume Next
mKeepDirs.Remove nDrive
On Error GoTo 0
mKeepDirs.Add Array(.Path, .ListIndex), nDrive
If mEvents Then
mEvents = mEvents Or kEventDirChange
Else
RaiseEvent DirChange
End If
End With
End Sub
Private Sub eDirListBox_Click()
Dim nDrive As String
With eDirListBox
nDrive = Left$(.Path, 2)
On Error Resume Next
mKeepDirs.Remove nDrive
On Error GoTo 0
mKeepDirs.Add Array(.Path, .ListIndex), nDrive
If mEvents Then
mEvents = mEvents Or kEventDirClick
Else
RaiseEvent DirClick
End If
End With
End Sub
Private Sub eDriveListBox_Change()
Dim i As Integer
Dim nErrNum As Long
Dim nDrive As String
Dim nRestoreLastDrive As Boolean
Dim nRestore As Variant
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
mEvents = kEventDriveChange
nDrive = Left$(eDriveListBox.Drive, 2)
On Error Resume Next
nRestore = mKeepDirs(nDrive)
With eDirListBox
.Path = nRestore(0)
If Err.Number Then
Err.Clear
.Path = nDrive
If Err.Number Then
nErrNum = Err.Number
On Error GoTo 0
nRestoreLastDrive = True
RaiseEvent OnError(nErrNum, nRestoreLastDrive)
If nRestoreLastDrive Then
nDrive = mLastDrive
eDriveListBox.Drive = nDrive
mEvents = kEventNone
End If
sInProc = False
Exit Sub
End If
Else
.ListIndex = nRestore(1)
End If
End With
mLastDrive = nDrive
If (mEvents And kEventDriveChange) = kEventDriveChange Then
RaiseEvent DriveChange
End If
If (mEvents And kEventDirChange) = kEventDirChange Then
RaiseEvent DirChange
End If
If (mEvents And kEventDirClick) = kEventDirClick Then
RaiseEvent DirClick
End If
mEvents = kEventNone
sInProc = False
End Sub
|