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.