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.