VB 5/6-Tipp 0477: Standarddialoge für Ordner, Computer und Drucker suchen
von Sebastian Klose
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: | Verwendete API-Aufrufe: SHBrowseForFolderA (SHBrowseForFolder), SHGetPathFromIDListA (SHGetPathFromIDList) | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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)?