|
Mit den Cursortasten können Sie sich zwar in einer DirListBox bewegen, doch die Auswahl des Pfades ist per Tastatur nicht vorgesehen. Dabei wäre es doch für den Anwender ganz angenehm, könnte er wie etwa im Windows Explorer gewohnt mit den Nach-Rechts- und Nach-Links-Cursortasten durch die Ordnerstruktur navigieren und auch mit den Plus- und Minus-Tasten des Ziffernblocks der Tastatur Ordner öffnen und schließen.
So schwierig ist das gar nicht. Sie können im KeyDown-Ereignis der DirListBox wie bei jedem anderen Steuerelement auf die entsprechenden Tastatur-Codes ("KeyCode") reagieren. Der einzige kleine Stolperstein dürfte lediglich die im Vergleich zu einer normalen ListBox etwas eigenartige Verwaltung des ListIndex-Eigenschaft sein.
Das Prinzip ist einfach: Der Ordner, der dem gewählten Pfad entspricht (also als unterste Ebene geöffnet ist), hat den ListIndex -1. Alle darüber liegenden Ordner werden in negative Richtung weitergezählt. Die gegebenenfalls vorhandenen, aber noch nicht geöffneten Ordner unterhalb des gewählten Ordners werden mit 0 beginnend aufwärts gezählt. Die Eigenschaft ListCount gibt dementsprechend nur die Anzahl dieser Ordner wieder, nicht jedoch die Gesamtzahl aller Elemente der DirListBox bis hinauf zur Laufwerkswurzel.
Berücksichtigen Sie nun, dass die List-Eigenschaft zum jeweiligen ListIndex immer den kompletten Pfad des betreffenden Ordners liefert, und dass Sie den gewählten Pfad der DirListBox durch Zuweisung eines neuen Pfades ändern, können Sie nun jeweils entsprechend der Position des Auswahlbalkens der DirListBox einen aktuellen Pfad zuweisen. Schauen wir uns die einzelnen Tasten und deren Wirkung im einzelnen an. Wir haben hierzu die Hilfsprozedur DirListKeyDown in einem Standard-Modul angelegt, der Sie die betreffende DirListBox, und den vom KeyDown-Ereignis derselben gelieferten KeyCode und Shift-Status übergeben - zum Beispiel:
Private Sub Dir1_KeyDown(KeyCode As Integer, Shift As Integer)
DirListKeyDown Dir1, KeyCode, Shift
Falls der Tastendruck nicht bereits in der Hilfsprozedur ausgewertet und verwendet (KeyCode = 0) worden ist, können Sie die Auswertung wie gewohnt folgen lassen
Select Case KeyCode
Case ...
...
End Select
End Sub
Nun die Hilfsprozedur:
Public Sub DirListKeyDown(DirList As DirListBox, KeyCode As Integer, _
Shift As Integer)
Dim i As Integer
Dim nOldPath As String
Damit Sie alle Tasten in Kombinationen mit den Umschalt-Tasten (Umschalt, Strg, Alt) weiterhin beliebig verwenden können, reagieren wir hier nur, wenn Shift gleich 0 ist:
If Shift = 0 Then
Select Case KeyCode
Case vbKeyReturn
Wird die Eingabe-Taste oder die Plus-Taste des Ziffernblocks betätigt, und ist der ListIndex größer oder gleich 0 (der betreffende Ordner ist noch nicht geöffnet), setzen wir den Path auf den Wert der List-Eigenschaft und öffnen damit den Ordner:
With DirList
If .ListIndex >= 0 Then
.Path = .List(.ListIndex)
End If
End With
KeyCode = 0
Case vbKeySubtract
Wird die Minus-Taste des Ziffernblocks betätigt, soll der betreffende Ordner geschlossen werden. Ist der markierte Ordner der gewählte Pfad, oder befindet sich die Auswahl oberhalb des geöffneten Pfad-Ordners, ist der ListIndex kleiner als 0 - der Ordner soll geschlossen werden. Dazu setzen wir den Pfad auf den Wert der List-Eigenschaft mit dem nächstkleineren ListIndex. Das reicht allerdings nicht ganz, denn die Markierung würde danach den nun gewählten Pfad-Ordner zeigen. Daher merken wir uns zuvor den alten Pfad, gehen die Liste der nun untergeordneten Ordner abwärts durch, bis wir den Listeneintrag mit dem alten Ordner-Pfad wiederfinden und setzen den ListIndex und damit die Markierung darauf:
With DirList
Select Case .ListIndex
Case Is < 0
nOldPath = .List(.ListIndex)
.Path = .List(.ListIndex - 1)
For i = 0 To .ListCount - 1
If .List(i) = nOldPath Then
.ListIndex = i
Exit For
End If
Next 'i
End Select
End With
KeyCode = 0
Case vbKeyLeft
Im Window Explorer verhält sich die Nach-Links-Taste auf zweierlei Weise. Ist der markierte Ordner geöffnet, wird er geschlossen - der Code ist derselbe wie bereits gezeigt. Das betrifft den gewählten Pfad-Ordner als auch alle darüber liegenden (ja zwangsläufig geöffneten) Ordner.
With DirList
Select Case .ListIndex
Case < 0
nOldPath = .List(.ListIndex)
.Path = .List(.ListIndex - 1)
For i = 0 To .ListCount - 1
If .List(i) = nOldPath Then
.ListIndex = i
Exit For
End If
Next 'i
Case Else
Ist der ListIndex gleich oder größer 0, ist ein nicht geöffneter Ordner markiert. In diesem Fall wird lediglich die Markierung zum nächsten übergeordneten Ordner verschoben. In der DirListBox ist das ganz einfach der ListIndex -1:
.ListIndex = -1
End Select
End With
KeyCode = 0
Case vbKeyRight
With DirList
Select Case .ListIndex
Case Is < 0
Die Nach-Rechts-Taste zeigt im Windows Explorer auch zwei verschiedene Verhaltensweisen. Ist der Ordner der gewählte Pfad-Ordner oder ein darüber liegender Ordner, wird die Markierung auf den jeweils ersten untergeordneten Ordner verschoben. Das geht natürlich nur, wenn ein solcher vorhanden ist - den anderenfalls auftretenden fehler fangen wir einfach mit einem "On Error Resume Next" ab:
On Error Resume Next
.ListIndex = .ListIndex + 1
Case Else
Ist der markierte Ordner nicht geöffnet (ListIndex 0 oder größer), wird er geöffnet - der gewählte Pfad auf diesen Ordner gesetzt:
.Path = .List(.ListIndex)
End Select
End With
KeyCode = 0
End Select
End If
End Sub
|