http://www.mvps.org/vbnet/index.html?code/callback/browsecallback.htm
Tu znajduje się oryginalny kod metody (Autor: Randy Birch).
Okno_wyb.zip
Autor: Marek Sikora
Baza w formacie MsAccess 97
Opis problemu:
Popularna funkcja do wyboru katalogu w oknie dialogowym wygląda tak:
Option Compare Database
Option Explicit
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Const MAX_PATH = 260
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 Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" _
(ByVal lpString1 As String, ByVal _
lpString2 As String) As Long
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 OtwFolder()
Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo
szTitle = "This is the title"
With tBrowseInfo
.hWndOwner = hWndAccessApp
.lpszTitle = lstrcat(szTitle, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With
lpIDList = SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
OtwFolder = sBuffer
End If
End Function
Procedura wywołuje standardowe okno dialogowe do wyboru katalogu. Niestety ma ona jedną niedogodność - nie można określić katalogu domyślnego i za każdym razem użytkownik musi rozpoczynać lokalizację folderu od początku. Czy można na to coś poradzić?
Rozwiązanie:
Okazuje się, że próba rozwiązania problemu rozbija się o operator AddressOf, który wprawdzie w Accessie jest słowem zastrzeżonym, ale w obecnych wersjach Accessa nieaktywnym. Próbując dotrzeć do szczegółów tego zastrzeżenia - znalazłem jedynie informację, że nazwa operatora jest zarezerwowana w celu wykorzystania jej w przyszłych wersjach Accessa. Na stronach MSDN można znaleźć rozwiązania, które pozwalają określić katalog domyślny, ale wszystkie te sposoby (wzięte z VisualBasica) opierają się na operatorze AdresOf.
Oryginalny sposób na poradzenie sobie z niniejszym problemem zawarł w swoim rozwiązaniu Randy Birch (link do jego rozwiązania podałem na początku).
Rozwiązanie, które jest rozwinięciem wymienionej metody i przedstawia kilka nowych elementów podał Marek Sikora w przykładzie Okno_wyb.zip.