Öffnen-Dialog für Verzeichnisse

hallo

mit den standart-dialogen kann man ja ein dialog zum öffnen von
dateien erzeugen. das ist schön und soweit ok. was ich aber
brauche ist ein dialog mit dem man nur einen ordner angeben kann.
es soll sozusagen der komplette pfad zu diesem ordner ermittelt
werden, in dem später gearbeitet wird.
also. wie erzeuge ich einen dialog mit dem ich nur ordner wählen
kann, aber keine dateien.

gruß…
…puhli

Haha, das Problem kenne ich :wink:
Ich habe dafür auch keine so glückliche Lösung gefunden,
aber sie funktioniert:

Ich nehme einfach irgendeinen Datei-Dialog, lasse den
Nutzer in das entsprechende Verzeichnis wechseln und
lese danach mit CurDir den gewählten Pfad aus. Ob eine
Datei ausgewählt wurde, ist mir egal - ich brauche die
.Name-Eigenschaft ja nicht auszulesen, in der ja Pfad
und Dateiname stehen.

Das funktioniert, weil offenbar beim Browsen durch die
Verzeichnisse immer gleich in offizieller Verzeichnis-
wechsel erfolgt.

Unglücklich ist die Variante deshalb, weil da eben nicht
steht „wähle Pfad“, sondern „Save“ bzw. „Open“ oder etwas
dergleichen.

Grüße,
Kristian

Hi,
das geht mit einem API-Aufruf:

Private Type BrowseInfo
 hWndOwner As Long
 pIDLRoot As Long
 pszDisplayName As Long
 lpszTitle As Long
 ulFlags As Long
 lpfnCallback As Long
 lParam As Long
 iImage As Long
End Type
Const BIF\_RETURNONLYFSDIRS = 1
Const MAX\_PATH = 260
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Sub Form\_Load()
 'KPD-Team 1998
 'URL: http://www.allapi.net/
 '[email protected]
 Dim iNull As Integer, lpIDList As Long, lResult As Long
 Dim sPath As String, udtBI As BrowseInfo

 With udtBI
 'Set the owner window
 .hWndOwner = Me.hWnd
 'lstrcat appends the two strings and returns the memory address
 .lpszTitle = lstrcat("C:\", "")
 'Return only if the user selected a directory
 .ulFlags = BIF\_RETURNONLYFSDIRS
 End With

 'Show the 'Browse for folder' dialog
 lpIDList = SHBrowseForFolder(udtBI)
 If lpIDList Then
 sPath = String$(MAX\_PATH, 0)
 'Get the path from the IDList
 SHGetPathFromIDList lpIDList, sPath
 'free the block of memory
 CoTaskMemFree lpIDList
 iNull = InStr(sPath, vbNullChar)
 If iNull Then
 sPath = Left$(sPath, iNull - 1)
 End If
 End If

 MsgBox sPath
End Sub

Bei der Gelegenheit kann ich nur empfehlen, holt Euch den API-Guide. Es lohnt sich!

Gruß

J.

Wo gibt’s den API-Guide? - o.T.
O.T.

…da stehts ja doch: http://www.allapi.net.

Brillen gibt es bei http://www.fielmann.de :smile:

Gruß

J.

Hallo Puhli,

ich habe das Problem inzwischen so gelöst, wie es unten in der Funktion steht. Ist etwas einfacher, als die weiter unten angegebene Lösung von Josué mit API, die übrigens offenbar den Nachteil hat, daß sich der Start-Pfad nicht angeben läßt.

Private Function BrowsePath(OldPath As String) As String
Dim OpenClick As Boolean
 With Me.CommonDialog1
 .CancelError = True
 OpenClick = Not .CancelError
 .InitDir = OldPath
 .Filename = "-" 'important - "Open" click is not possible without any file name given
 .Filter = "Display only directories|\*.NoFiles|All Files (\*.\*)|\*.\*"
 .DialogTitle = "Browse for Path"
 On Error GoTo CancelClick
 .ShowOpen
 OpenClick = True
CancelClick:
 'OpenClick is still "Not .CancelError" (mostly False), if the error occured
 End With 'Me.CommonDialog1

 If OpenClick Then
 BrowsePath = CurDir
 Else
 ChDir OldPath ' important, because the current path changes automatically while browsing
 BrowsePath = OldPath
 End If
End Function 'BrowsePath

Kristian

PS: Achso, der Dialog steckt in COMDLG32.ocx (Common Dialogs Control).