ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 11.01.2001

Diese Seite wurde zuletzt aktualisiert am 11.01.2001
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Laufwerksfiltertüten

Zurück...


Anzeige

(-hg) mailto:hg_removedrives@aboutvb.de

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 MSDN Library - API SendMessageSendMessage 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 MSDN Library - API GetDriveTypeGetDriveType (siehe auch: Der Typ ist gefragt"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.


Modul modRemoveDrives (modRemoveDrives.bas - ca. 3,2 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer