Warsztat: Okno wyboru folderu z katalogiem domyślnym.

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.