16. Okna dialogowe Otwórz/Zapisz plik, Otwórz katalog z użyciem klasy WizHook.

Klasę WizHook przedstawiłem z paragrafie 15. Opisałem tam większość z rozpoznanych przeze mnie funkcji. Tutaj chcę omówić jedną z ciekawszych (w mojej ocenie) możliwości klasy WizHook. Jest nią budowanie niezwykle funkcjonalnych okienek dialogowych, typu 'Otwórz plik' w prosty sposób. 

Pamiętamy problemy, jakie występują przy określaniu katalogu startowego w funkcji SHBrowseForFolder z biblioteki shell32 (patrz war035.htm). Funkcje GetOpenFileName i GetSaveFileName z biblioteki comdlg32.dll (patrz np. StanleyP - FAQ P006) oddały nieocenione usługi, ale na pewno zastanawialiśmy się dlaczego wymagają one takich skomplikowanych realizacji, przecież chodzi tylko o wywołanie okienka dialogowego...

Klasa WizHook nie dość, że pozwala konstruować okienka dialogowe w bardzo prosty sposób, to jeszcze mają one większe możliwości niż te pochodzące z biblioteki comdlg32.dll. Nowością - bez wątpienia - jest opcja wyboru wielokrotnego, czy umieszczania własnych napisów na przycisku 'Otwórz'. A nawet obrazek dyskietki lub otwieranego dokumentu w zależości od wybranej opcji Zapis/Odczyt.

A oto przykładowe wywołanie okienek dialogowych z użyciem klasy WizHook:

Najprościej wywołuje się okienko do odczytu plików graficznych.

'Wystarczy tylko tyle
Dim sFile As String
WizHook.Key = 51488399
WizHook.OpenPictureFile sFile, 0
MsgBox "Wybrano plik: " & sFile

Trochę bardziej skomplikowane jest wywołanie uniwersalnego dialogu Otwórz/Zapisz plik i Otwórz katalog, ale i możliwości tego okienka są większe. 

'Najprostsza wersja procedury, wywołującej 
'uniwersalne okno dialogowe Otwórz plik
Dim sFile As String, sFilter As String
WizHook.Key = 51488399
sFilter = "Bazy Access (*.mdb)"
WizHook.GetFileName 0, "", "", "", _
    sFile, "", sFilter, 0, 0, 0, True
MsgBox "Wybrano plik: " & sFile
'Rozbudowana wersja procedury, wywołującej 
'uniwersalne okna dialogowe Otwórz/Zapisz plik
'oraz Otwórz katalog (czyli 3 w jednym)
Function accDialog(Otworz As Boolean)
On Error Resume Next
Dim lRet As Long, lView As Long, lFlags As Long
Dim sInitialDir As String, sFile As String, sFilter As String

    WizHook.Key = 51488399
    lView = 0   '3 - widok Lista, 0 - widok Szczegóły (Uwaga, lView brane jest 
    'pod uwagę, tylko, jeśli lFlags ma ustawiony bit &H40)
    lFlags = &H40 + &H8 'Bit &H8 oznacza okienko typu multiselect(!)
    sInitialDir = "C:\Bazy\"
    sFilter = "Bazy Access (*.mdb, *.mde, *.mdw, *.asp)|Wszystkie pliki (*.*)"
    lRet = WizHook.GetFileName(hWndAccessApp, "", "Tytuł okna", "To ten plik!", _
    sFile, sInitialDir, sFilter, 0, lView, lFlags, Otworz)
    'Napis "To ten plik" pojawi się na przycisku wyboru pliku
    
    If lRet = -302 Then  'Naciśnięto Cancel
        accDialog = Null
    Else
        accDialog = sFile
    End If
End Function

Wywołanie funkcji accDialog(True) wywoła okienko Otwórz plik, a accDialog(False) pokaże dialog Zapisz jako.

 Aby wywołać okienko Otwórz katalog, należy ustawić flagę lFlags na &H20:

lFlags = &H20 'Okno wyboru katalogów otwiera się zawsze w widoku Lista.

Uwaga: W przypadku okienka Zapisz jako, dobrze jest ustawić flagę  lFlags na wartość nieparzystą (zapalony bit &H1), co spowoduje, że Access zapyta o potwierdzenie zastąpienia istniejącego pliku przez nowy.

K. P.