Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0477: Standarddialoge für Ordner, Computer und Drucker suchen

 von 

Beschreibung 

Statt mühsam eigene Dialoge zu schreiben oder sich mit der Ordner-ListBox rumzuschlagen nimmt man lieber gleich den eigenen Dialog von Windows.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

SHBrowseForFolderA (SHBrowseForFolder), SHGetPathFromIDListA (SHGetPathFromIDList)

Download:

Download des Beispielprojektes [2,75 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command4"
' Steuerelement: Schaltfläche "Command3"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Schaltfläche "Command2"
Option Explicit

Private Sub Command1_Click()
    Dim strFolder As String
    
    strFolder = ShowSelection(Me.hWnd, "Ordner wählen", BrowseForFolder)
    Text1.Text = IIf(strFolder <> vbNullString, strFolder, "(kein)")
End Sub

Private Sub Command2_Click()
    Dim strFolder As String
    
    strFolder = ShowSelection(Me.hWnd, "Ordner wählen", BrowseForComputer)
    Text1.Text = IIf(strFolder <> vbNullString, strFolder, "(kein)")
End Sub

Private Sub Command3_Click()
    Dim strFolder As String
    
    strFolder = ShowSelection(Me.hWnd, "Ordner wählen", BrowseForPrinter)
    Text1.Text = IIf(strFolder <> vbNullString, strFolder, "(kein)")
End Sub

Private Sub Command4_Click()
    Dim strFolder As String
    
    strFolder = ShowSelection(Me.hWnd, "Ordner wählen", BrowseForLocalFolder)
    Text1.Text = IIf(strFolder <> vbNullString, strFolder, "(kein)")
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------
Option Explicit

Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
                         Alias "SHBrowseForFolderA" ( _
                         lpBrowseInfo As BROWSEINFO) As Long
                         
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
                         Alias "SHGetPathFromIDListA" ( _
                         ByVal pidl As Long, _
                         ByVal pszPath As String) As Long
                         
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const BIF_RETURNFSANCESTORS = &H8
Private Const BIF_BROWSEFORCOMPUTER = &H1000
Private Const BIF_BROWSEFORPRINTER = &H2000

Private Type BROWSEINFO
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Public Enum Flag

    ' //Nach Drucker im Netzwerk suchen lassen
    BrowseForPrinter = BIF_BROWSEFORPRINTER
    
    ' //Nach Computer im Netzwerk suchen lassen
    BrowseForComputer = BIF_BROWSEFORCOMPUTER
    
    ' //Nach lokalem oder Netzwerkordner suchen lassen
    BrowseForFolder = BIF_RETURNONLYFSDIRS
    
    ' //Nur lokale Ordner zur Auswahl zulassen
    BrowseForLocalFolder = BIF_RETURNFSANCESTORS
End Enum

Public Function ShowSelection(ByVal hWnd As Long, Title As String, Optional dwFlag As _
    Flag = BIF_RETURNONLYFSDIRS) As String
    
    Dim bi As BROWSEINFO
    Dim pidl As Long
    Dim strFolder As String
    
    strFolder = String$(255, vbNullChar)
    
    With bi
    
        .hOwner = hWnd
        .ulFlags = dwFlag
        .pidlRoot = 0
        .lpszTitle = Title
        
    End With
    
    pidl = SHBrowseForFolder(bi)
    
    ShowSelection = IIf(SHGetPathFromIDList(ByVal pidl, ByVal strFolder), Left$( _
        strFolder, InStr(strFolder, vbNullChar) - 1), vbNullString)
End Function


'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 16 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von hoschi am 07.09.2006 um 08:54

Hallo

Wie kriege ich es hin, dass ich bei diesem Dialog zusätzlich die Möglichkeit habe, einen neuen Ordner zu erstellen?

Gruss
Hoschi

Kommentar von Cornflake am 26.06.2006 um 11:35

Hab eine Lösung gefunden. Das ganze ist wohl ein Bug von Windows 2000 wenn es das LW A: für einen Netzwerkordner hält, aber Unterordner auf LW A: wieder nicht.
Unter XP geht das LW A: mit BIF_RETURNFSANCESTORS ohne Probleme; unter W2k leider nicht.
Dort kann man sich behelfen, indem BIF_RETURNONLYFSDIRS verwendet wird.
Wenn man nun trotzdem verhindern will, das jemand Netzwerkordner auswählen kann muss er leider eine spätere Prüfung von Hand dazuschreiben.

Kommentar von Cornflake am 26.06.2006 um 11:08

Unter Windows 2000 funktioniert bei mir nicht das Laufwerk A: in dem Laufwerksauswahldialog. Also der Dialog kommt ich kann auch alle möglichen ordner auswählen. Doch wenn ich nur auf das Laufwerk A: klicke wird der OK Button grau. Warum? Kann das mal jemand prüfen ob das bei Ihm auch so ist. Wenn ichd as ganze unter XP teste geht es. Aber halt nur unter Win2000 nicht.

Kommentar von Patrick am 04.10.2005 um 11:37


In der Funktion "ShowSelection" muss

.hOwner = Me.hWnd

durch
.hWndOwner = Me.hWnd

ersetzt werden ...

dann funzt's!


MfG,

Patrick

Kommentar von Carsten Jahner am 25.08.2005 um 17:13

Besteht die Möglichkeit ähnlich wie im CommonDialog einen Initialordner zu übergeben der dann in der Dialogansicht bereitsgeöffnet wurde (insofern vorhanden)?

Kommentar von herbertl lang am 22.02.2005 um 13:34

das wollte ich lange schon mal sagen.

der api - service ist einfach super!

herbert lang

Kommentar von Jochen Wierum am 07.11.2004 um 11:18

Hallo Joachim,

Die Funktionen, sowie ihre Strukturen werden in der MSDN recht gut erklärt:
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shbrowseforfolder.asp
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/structures/browseinfo.asp

Im Allgemeinen wird die hWnd vermutlich dazu dienen, dass der Dialog gegenüber dem per hWnd übergebenen Fenster modal angezeigt wird.

Mit freundlichen Grüßen,
Jochen

Admin @ActiveVB

Kommentar von Joachim Kurbach am 07.11.2004 um 10:54

Verwendete API-Aufrufe:
SHBrowseForFolderA (SHBrowseForFolder), SHGetPathFromIDListA (SHGetPathFromIDList)
Keine Erläuterung für Me.hWnd

Kommentar von Toast78 am 22.07.2003 um 19:24

Ist ja schon ganz nett, aber ein paar Dinge stören mich da noch:

pidlRoot ist nicht wirklich für die Angabe eines Standardordners verwendbar, weil:
- mir bisher keine Funktion bekannt ist, die eine ID zu
einem Ordner liefert. Also eine Umkehr von SHGetPathFromIDList.
- Übergibt man eine Verzeichnis-ID an pidlRoot, so kann man nicht mehr an übergeordnete Ordner rankommen, die oberhalb des Rootordners liegen.

Kommentar von Florian Hufsky am 16.07.2003 um 09:54

bei mir wird cotaskmemfree nicht als funktion akzeptiert? (vb 6.0 sp 5 - win xp)

Kommentar von Jörg Ohligschläger am 07.05.2003 um 11:10

Leider wurde ein wichtiges Detail vergessen!

Die Funktion 'SHBrowseForFolder' reserviert Speicher und legt dort die IDList ab. Dieser Speicher muß unbedingt mit 'CoTaskMemFree pidl' wieder freigegeben werden.


Kommentar von -NoBody- am 23.03.2002 um 04:58

hoppla... sorry hab grad erst des andere beispiel gesehn...

Kommentar von -NoBody- am 23.03.2002 um 04:49

Wirklich sehr praktisch, aber kann man irgendwie auch den standard-windows dialog um dateien auszuwählen verwenden?
Danke

Kommentar von Teker am 06.03.2002 um 20:57

Also ich hab auch Win2000 Pro und dat Teil läuft WUNDERBAR THX!!!

Kommentar von Sebastian am 06.03.2002 um 14:09

Ich habe diesen Code unter Windows 2000 geschrieben, er funktioniert einwandfrei.

Kommentar von Privatebox am 25.02.2002 um 13:04

Weshalb geht dieser Code nicht unter windows 2000?
Kennt jemand eine Alternative für Windows 2000 (Ohne eigene Form)?