Windows API - Pfad auswählen

Liebe ExpertInnen,

ich suche eine Möglichkeit, den Benutzer einen Pfad angeben zu lassen (auf dem ich dann etliche Dateien ablegen möchte), ähnlich wie beim SaveOpenFile. Gibt es da was? Ich gestehe, dass mich der API-Guide überwältigtfordert.

Gruß Ralf

Hallo,

ich suche eine Möglichkeit, den Benutzer einen Pfad angeben zu
lassen (auf dem ich dann etliche Dateien ablegen möchte),
ähnlich wie beim SaveOpenFile. Gibt es da was? Ich gestehe,
dass mich der API-Guide überwältigtfordert.

An welcher Stelle? Aus welchem Kontext?

 BOOL SetCurrentDirectory(
 LPCTSTR lpPathName // pointer to name of new current directory
 );

(kernlel.lib, => z.B. http://gdmike.statbuff.com/2006/07/05/win32-tip-set-… )

Grüße

CMБ

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

'Browsing for directory.
Private Const BIF\_RETURNONLYFSDIRS = &H1 'For finding a folder to start document searching
Private Const BIF\_DONTGOBELOWDOMAIN = &H2 'For starting the Find Computer
Private Const BIF\_STATUSTEXT = &H4
Private Const BIF\_RETURNFSANCESTORS = &H8

Private Const BIF\_BROWSEFORCOMPUTER = &H1000 'Browsing for Computers.
Private Const BIF\_BROWSEFORPRINTER = &H2000 'Browsing for Printers
Private Const BIF\_BROWSEINCLUDEFILES = &H4000 'Browsing for Everything

Private Const MAX\_PATH = 260
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

Public Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String

 '=================================================
 'Opens the system dialog for browsing for a folder
 '=================================================
 Dim iNull As Integer
 Dim lpIDList As Long
 Dim lResult As Long
 Dim sPath As String
 Dim udtBI As BrowseInfo

 With udtBI
 .hwndOwner = hwndOwner
 .lpszTitle = lstrcat(sPrompt, "")

 .ulFlags = BIF\_RETURNONLYFSDIRS
 End With

 lpIDList = SHBrowseForFolder(udtBI)
 If lpIDList Then
 sPath = String$(MAX\_PATH, 0)
 lResult = SHGetPathFromIDList(lpIDList, sPath)
 Call CoTaskMemFree(lpIDList)
 iNull = InStr(sPath, vbNullChar)
 If iNull Then
 sPath = Left$(sPath, iNull - 1)
 End If
 End If

 BrowseForFolder = sPath

End Function

Gru0
Joey

PS: hoffe alle Deklarationen mitkopiert zu haben

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin, Joey,

Public Function BrowseForFolder(hwndOwner As Long, sPrompt As
String) As String

Windows habe ich nie gelernt, deshalb noch eine Frage: Wie rufe ich die Function auf?

PathSelected = BrowseForFolder( ??? , „Bitte Pfad für Druckdateien auswählen“)

sprompt ist wohl der Title der Box, aber was gebe ich für hwndOwner mit?

Gruß Ralf

ps: Woher hast Du den Code - selbst gebaut?

Moin, CMБ,

der Anwender soll selbst einen Pfad vorgeben können (wenn er mag), das muss keineswegs der Pfad sein, in dem die Applikation liegt.

Gruß Ralf

Hallo Ralf,

wenn du den API-Guide hast, ist das doch schon mal ein Schritt in die richtige Richtung.
Such dort einfach mal nach der Funktion SHBrowseForFolder. Dort gibt es dann neben den Details auch Beispielcode mit recht guten Kommentaren. Den kannst du einfach in ein VB6-Formular reinkopieren und das Ganze starten.
Damit kriegst du ein lauffähiges Beispiel und einen ersten Eindruck der Funktionsweise und kannst dann an den kommentierten Stellen gezielte Änderungen probieren um das Ergebnis deinen Vorstellungen anzupassen.

Daniel

Moin, Daniel,

Such dort einfach mal nach der Funktion SHBrowseForFolder.

Du bist ein kleiner Scherzkeks, was? Woher soll ich wissen, wie die Funktion heißt?

Gruß Ralf

Hi,

sprompt ist wohl der Title der Box, aber
was gebe ich für hwndOwner mit?

der (das?) Windows Handle. Liefert eigentlich jede Form unter MS mit mit. Eigenschaft „hwnd“ unter VB. „0“ geht aber auch.

Gruß Ralf

ps: Woher hast Du den Code - selbst gebaut?

Wer macht denn noch sowas :smile: Natürlich kopiert und möglicherweise modifiziert im Laufe der Jahre.

Gruss
Joey

Moin, Joey,

der (das?) Windows Handle. Liefert eigentlich jede Form unter
MS mit mit. Eigenschaft „hwnd“ unter VB. „0“ geht aber auch.

das ist nicht so ganz einfach, wenn die Function, die den Pfad braucht, aus einer Menüleiste heraus aufgerufen wird. Geht aber trotzdem (durch Probieren herausgefunden): Mit dem Wert 0 als Parameter.

Inzwischen habe ich SHBrowseForFolder im API-Guide gefunden, Deine Version ist aber viel schöner :smile:

Gruß Ralf

Hallo Ralf,

Du bist ein kleiner Scherzkeks, was? Woher soll ich wissen,
wie die Funktion heißt?

Ich bin auch nicht mit diesem Wissen auf die Welt gekommen :wink:. Die Gruppierungsansicht im API-Guide hilft aber ungemein, wenn man was bestimmtes sucht. Zum Bleistift gibt es da die Gruppe Common Dialogs, also gebräuchliche Dialoge, und so oft wie man diesen Dialog in Windows sieht, könnte man durchaus erwarten, das er dort auftaucht.

Und außerdem habe ich’s dir ja jetzt verraten. Zweck meines Postings war u.A. dir mit dem Namen der Funktion den Weg zu weisen, den Rest brauchte ich eigentlich nicht zu schreiben, denn den kannst du ja recht komfortabel im API-Guide nachlesen.

Daniel

Moin, Daniel,

den API-Guide kenne ich, den Namen der Funktion hatte mir Joey schon verraten. Konnte man alles lesen.

Gruß Ralf