PDA

Vollständige Version anzeigen : vb@rchivCD - SHBrowseForFolder-Funktion


Ikke
22.09.2001, 13:25
Hallo,
ich habe bislang noch nicht großartig mit API-Funktionen gearbeitet, aber genau diese Funktion scheint genau das zu sein, was ich schon seit einiger Zeit suche!
Doch leider verursacht sie bei mir zwei Fehlermeldungen. Vielleicht habe ich auch blos vergessen einen Verweis zu setzen? Wenn ja welchen? Die erste in der Folgenden Zeile:
-------
With BI
...
.lpfn = GetAddress(AddressOf BCallbackProc)
-------
Es scheint an dem Ausdruck in der Klammer zu liegen, denn GetAddress erwartet nur einen Parameter.
Und der zweite Fehler ist in der folgenden Zeile:
-------
SendMessage hwnd, BFFM_SETSELECTION, ByVal 1&, ByVal app.Path
-------
Die Fehlermeldung ist, daß die Variable app nicht definiert ist. Welchen Typ hat die denn bloss?

Ansonsten kann ich die CD nur jedem wärmstens ans Herz legen! ;)
Mal die Werbetrommel rühr! :D

Ikke
22.09.2001, 21:04
Also, da braucht ich mir wohl keine Vorwürfe machen, daß ich das nicht weiß, wenn hier sonst auch keiner eine Antwort auf diese Frage parat hat! :rolleyes:
Aber nun mal ernsthaft! Wollt Ihr mir allen Ernstes erzählen, daß das keiner von Euch weiß????? :(

Scorefun
22.09.2001, 22:42
Hi Ikke,

"app.path" ist eine VB-interne Eigenschaft, die den Pfad des aktuellen VB-Projektes zurückgibt und unter Access nicht vorhanden ist.

Schau mal hier vorbei:
BrowseFolder mit Angabe eines Start-Folders ??? (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=46881)

Sokrates
22.09.2001, 23:04
Hallo Ikke,
zur Funktion SendMessage:
der letzte Parameter wird zwar in der Declaration als Any deklariert, ist aber in VB(A) schwer zu handeln. App.Path ist auf jeden Fall vom Typ String. Vielleicht hilft dir ja eher die Funktion SendMessageByString.

Zu GetAdress ... Es liegt tatsächlich an dem Ausdruck in der Klammer. Der Ausdruck AdressOf ist da der treibende Keil. Versuch mal in der Hilfe von VB was dazu zu finden oder zu CallBack-Funktionen. Auch das ist nämlich unter VB nicht so ganz einfach.

Warum musstest du auch gleich mit den schwierigen Sachen anfangen. ;-)

Viele Grüße
Sokrates

Ikke
22.09.2001, 23:37
Erst einmal Danke Ihr Zwei!
@Scorefun: Ja das funktioniert, ist aber leider nicht ganz das, was ich brauche (siehe unten)
@Socrates: Ich fang ja nicht mit dem schwierigen an! Die DB ist fast fertig und was ich mit dem Ding will, sollte ich wohl besser mal erklären:
Also ich will über eine Schaltfläche eine Datensicherung laufen lassen. Da aber nicht alle Kunden Ihre Back-End-DB am selben Ort speichern und auch nicht alle das selbe Verzeichnis für die Sicherung benutzen muß ich Ihnen vorher die Möglichkeit geben diese Verzeichnisse auszuwählen. Die zu sichernde Datenbank auszuwählen ist nicht das Problem, das habe ich bereits gelöst, aber ich muß ja auch noch den Ordner auswählen, wohin die DB gesichert werden soll. Und da kommt mein Problem mit der Lösung von Scorefun. Bei der kann ich nämlich dort keine Ordner anlegen. Was ich brauche ist ein Datei-Auswahldialog, mit dem ich eben keine Datei, sondern einen Ordner auswähle!
Oh man, daß das so schwer sein soll kann ich nicht glauben! Wenn alle Stricke reissen, dann muß ich halt ein eigenes Formular dafür zusammen basteln, nur daß dieses dann nicht so "professionell" aussehen kann, wie ich es mir wünsche.
Naja vielleicht hat ja noch irgendjemand eine Lösung hierzu.....

Stefan Kulpa
23.09.2001, 03:36
<font face="Verdana" size="2">Hallo,

also wenn es nur um den Ordner-Auswahldialog geht, funktionierts wie folgt (auch in Access):</font>

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public</span> <span class="TOKEN">Type</span> BROWSEINFO
hOwner <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
pidlRoot <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
pszDisplayName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
lpszTitle <span class="TOKEN">As</span> <span class="TOKEN">String</span>
ulFlags <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
lpfn <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
lParam <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
iImage <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">End</span> <span class="TOKEN">Type</span>

<span class="TOKEN">Public</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Sub</span> CoTaskMemFree <span class="TOKEN">Lib</span> "OLE32.dll" (<span class="TOKEN">ByVal</span> pv <span class="TOKEN">As</span> <span class="TOKEN">Long</span>)
<span class="TOKEN">Public</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetDesktopWindow <span class="TOKEN">Lib</span> "user32" () <span class="TOKEN">As</span> <span class="TOKEN">Long</span>

<span class="TOKEN">Public</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> SHBrowseForFolder <span class="TOKEN">Lib</span> "shell32.dll" <span class="TOKEN">Alias</span> _
"SHBrowseForFolderA" _
(lpBrowseInfo <span class="TOKEN">As</span> BROWSEINFO) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>

<span class="TOKEN">Public</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> SHGetPathFromIDList <span class="TOKEN">Lib</span> "shell32.dll" <span class="TOKEN">Alias</span> _
"SHGetPathFromIDListA" _
(<span class="TOKEN">ByVal</span> pidl <span class="TOKEN">As</span> Long, _
<span class="TOKEN">ByVal</span> pszPath <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>

<span class="TOKEN">Public Function</span> BrowseForFolder(<span class="TOKEN">Optional</span> sDlgTitle <span class="TOKEN">As</span> <span class="TOKEN">String</span> = vbNullString) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="REM">'// ----------------------------------------------------------------- </span>
<span class="REM">'// Methode: | Ruft den Verzeichnisauswahldialog auf</span>
<span class="REM">'// -----------------------------------------------------------------</span>
<span class="REM">'// Parameter: | sDlgTitle = optionaler Dialogtitel</span>
<span class="REM">'// -----------------------------------------------------------------</span>
<span class="REM">'// Rückgabe: | ausgewählter Ordner</span>
<span class="REM">'// -----------------------------------------------------------------</span>
<span class="TOKEN">Const</span> BIF_RETURNONLYFSDIRS <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = &H1
<span class="TOKEN">Const</span> MAXPATH <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = 260
<span class="TOKEN">Dim</span> uBrowseInfo <span class="TOKEN">As</span> BROWSEINFO
<span class="TOKEN">Dim</span> sPath <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> lPidl <span class="TOKEN">As</span> <span class="TOKEN">Long</span>

<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
uBrowseInfo.hOwner = GetDesktopWindow()
uBrowseInfo.pidlRoot = 0&
uBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS
<span class="TOKEN">If</span> Len(sDlgTitle) = 0 <span class="TOKEN">Then</span>
uBrowseInfo.lpszTitle = "Bitte wählen Sie ein Verzeichnis:"
<span class="TOKEN">Else</span>
uBrowseInfo.lpszTitle = sDlgTitle
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
lPidl = SHBrowseForFolder(uBrowseInfo)
sPath = VBA.Space$(MAXPATH)
<span class="TOKEN">If</span> SHGetPathFromIDList(<span class="TOKEN">ByVal</span> lPidl, <span class="TOKEN">ByVal</span> sPath) <span class="TOKEN">Then</span>
BrowseForFolder = VBA.Left(sPath, VBA.InStr(sPath, vbNullChar) - 1)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Call</span> CoTaskMemFree(lPidl)

<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>

<font face="Verdana" size="2">Außerdem müssen hier nicht noch weitere DLLs eingebunden werden; alles was benötigt wird, "liefert" jede "Standard-Windows-Version". Mit dieser Lösung können zwar keine Ordner erstellt werden, aber das ist über den Windows-Dialog auch nicht möglich. Für diesen Zweck müsste dann schon ein eigener Dialog erstellt werden - ggf. nach Vorauswahl über o.g. Dialog.

HTH,</font>

Ikke
23.09.2001, 13:10
Danke Stefan,
das war die Lösung, die auch Scorefun vorgeschlagen hatte, nur etwas eleganter programmiert. Sie hilft mir aber leider auch nicht, da ich hier ja keine Ordner anlegen kann. Also werde ich wohl oder Übel zu dem eigenen Formular zurückkehren. Mal sehen, ob ich das nicht optisch ein bischen aufpeppen kann. ;)
Auf jedem Fall vielen Dank Euch allen, für die Mühe, die Ihr Euch gegeben habt!