Eine DriveListBox ist im Prinzip eine gewöhnliche ComboBox, nur mit dem Unterschied, dass sie die Symbole zu den Laufwerkstypen zeigt und dass sie nicht über die Methoden AddItem und RemoveItem zum Hinzufügen oder Entfernen von Einträgen verfügt. Aber da sie eben doch nur eine ComboBox ist, können Sie ersatzweise über API-Nachrichten den angezeigten Inhalt einer DriveListBox manipulieren.
Wenn Sie etwa ein bestimmtes Laufwerk entfernen möchten, ermitteln Sie den Index des Laufwerks in der DriveListBox und senden ihr über die API-Funktion SendMessage die Nachricht CB_DELETESTRING und geben den ermittelten Index dazu an. Zur Ermittlung desselben können Sie alle Einträge der DriveListBox durchlaufen und mit dem gewünschten Laufwerksbuchstaben vergleichen. Sie können jedoch auch hierzu auf eine API-Nachricht zurückgreifen, auf CB_FINDSTRING und diese mit der für Strings spezifizierten Deklarationsvariante SendMessageStr an die DriveListBox senden.
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SendMessageStr Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As String) As Long
Private Const CB_ERR = (-1)
Private Const CB_DELETESTRING = &H144
Private Const CB_FINDSTRING = &H14C
Public Sub RemoveDrive(DriveListBox As DriveListBox, _
Drive As String)
Dim nIndex As Integer
With DriveListBox
nIndex = SendMessageStr(.hwnd, CB_FINDSTRING, 0, _
Left$(Drive, 2))
If nIndex <> CB_ERR Then
SendMessage .hwnd, CB_DELETESTRING, nIndex, 0
End If
End With
End Sub
Wenn Sie mehrere Laufwerke auf einmal herausnehmen wollen, oder umgekehrt nur bestimmte Laufwerke übriglassen wollen, durchlaufen Sie die Liste vom letzten zum ersten Laufwerk hin und entfernen die gewünschten Einträge bzw. lassen sie unbehelligt und entfernen dafür die übrigen.
Public Enum ShowRemoveDriveTypeConstants
dtShow
dtRemove
End Enum
Public Sub RemoveDrives(DriveListBox As DriveListBox, _
Drives As String, Optional ByVal ShowRemove _
As ShowRemoveDriveTypeConstants)
Dim i As Integer
Dim nDrives As String
nDrives = LCase$(Drives)
With DriveListBox
Select Case ShowRemove
Case dtShow
For i = .ListCount - 1 To 0 Step -1
If Not CBool(InStr(Left$(.List(i), 1), nDrives)) Then
SendMessage .hwnd, CB_DELETESTRING, i, 0
End If
Next
Case dtRemove
For i = .ListCount - 1 To 0 Step -1
If InStr(Left$(.List(i), 1), nDrives) Then
SendMessage .hwnd, CB_DELETESTRING, i, 0
End If
Next
Case Else
'Error
End Select
End With
End Sub
Der Aufruf
RemoveDrives Drive1, "cde", dtShow
lässt die Laufwerke C:, D: und E: übrig, der Aufruf
RemoveDrives Drive1, "cde"
hingegen entfernt diese Laufwerke aus der Liste.
Schließlich können Sie den Inhalt einer DriveListBox auch noch anhand der Laufwerkstypen filtern, wenn Sie etwa nur Festplatten anzeigen, oder etwa keine CDROM-Laufwerke dabei haben möchten. Den Laufwerkstyp ermitteln Sie zur einem gegebenen Laufwerksbuchstaben über die API-Funktion GetDriveType (siehe auch: "Der Typ ist gefragt"). Diese gibt eine nummerische Kennung des Typs zurück. Leider stellen diese Kennungen nur eine schlichte Reihe dar (von 0 bis 6), so dass Sie diese Kennungen nicht direkt in einem Bitfeld verknüpfen können.
Ein kleiner Rechentrick hilft jedoch, diese Klippe zu umschiffen. Sie verwenden zunächst doch Konstanten eines Bitfeldes (von 0 bis 32) und verknüpfen diese mit Or zum Muster der gewünschten bzw. unerwünschten Laufwerkstypen. Zur Prüfung, ob eine der von GetDriveType zurückgegebenen Kennungen in dem Muster enthalten ist, vermindern Sie den Wert der Kennung um eins und bilden darüber die Zweier-Potenz. Damit das Resultat bei der Kennung 0 (also aus 2 hoch -1 = 0,5) zu 0 wird, konvertieren Sie es noch ausdrücklich mit CInt in eine Integer-Zahl.
Public Enum DriveTypeConstants
dtUnknown = 0
dtNoRoot = 1
dtRemovable = 2
dtFixed = 4
dtRemote = 8
dtCDRom = 16
dtRAMDisk = 32
End Enum
Public Sub RemoveDrivesByType(DriveListBox As DriveListBox, _
ByVal DriveTypes As DriveTypeConstants, _
Optional ByVal ShowRemove As ShowRemoveDriveTypeConstants)
Dim i As Integer
Dim nDriveType As Integer
With DriveListBox
Select Case ShowRemove
Case dtShow
For i = .ListCount - 1 To 0 Step -1
nDriveType = _
2 ^ CInt((GetDriveType(Left$(.List(i), 2)) - 1))
If Not CBool((nDriveType And DriveTypes) = _
nDriveType) Then
SendMessage .hwnd, CB_DELETESTRING, i, 0
End If
Next 'i
Case dtRemove
For i = .ListCount - 1 To 0 Step -1
nDriveType = _
2 ^ CInt(GetDriveType(Left$(.List(i), 2)) - 1))
If (nDriveType And DriveTypes) = nDriveType Then
SendMessage .hwnd, CB_DELETESTRING, i, 0
End If
Next 'i
Case Else
'Error...
End Select
End With
End Sub
Der Aufruf
RemoveDrivesByType Drive1, dtCDRom, dtShow
lässt nur CDROM-Laufwerke übrig und der Aufruf
RemoveDrivesByType Drive1, dtCDRom Or dtRemovable
wirft beispielsweise alle CDROM-Laufwerke und alle Diskettenlaufwerke hinaus.
|