Okno klasy: RadioButton, Edit, CheckBox, ComboBox.
Zmiany wartości, opcji, wybór pozycji z listy.
Na <<poprzedniej stronie>> poznaliśmy dokładnie strukturę okna dialogowego "Ustawienia strony" oraz metodę odczytania opcji wydruku.
Teraz zajmiemy się sposobem zmiany poszczególnych jego wartości i opcji.
Poniższe procedury wywołane zostaną przez zbSetPageSetupByID(hActiveWnd) która z kolei wywołana zostanie przez Form_Timer.
Korzystamy z wcześniej przygotowanej tablicy arrID(...)
arrID = Array("Nazwa opisowa okna", Id okna, Odczyt - tekst = True; stan = False)
Okno klasy RadioButton. Zmiana opcji "Orientacja strony": ID = 1056; ID = 1057
- Private Sub PageOrientation(ByVal hWndPage As Long, fOrientVertical As Boolean)
Dim lRet As Long
Dim hOpc As Long
' pobierz uchwyt okna opcji "Orientacja pionowo: ", Id = 1056 i sprawdź jego stan:
hOpc = GetDlgItem(hWndPage, arrID(5 * 3 + 1))
lRet = SendMessage(hOpc, BM_GETCHECK, ByVal 0, ByVal 0)
' jeżeli stan opcji CBool(lRet) nie jest zgodny z fOrientVertical sprawdzamy jaka
' orientacja strony ma być ustawiona:
If Not CBool(lRet) = fOrientVertical Then
- If fOrientVertical = False Then
' pobierz uchwyt okna opcji "Orientacja poziomo: ", Id = 1057
hOpc = GetDlgItem(hWndPage, arrID(6 * 3 + 1))
End If
-
' Przed zmianą orientacji strony bezwzględnie musimy ukryte okno
' opcji odkryć i uaktywnić, gdyż nastąpi zawieszenie się Accessa.
' Aby pokazać okno użyjemy funkcji ShowWindow (...) z parametrem:
' Const SW_NORMAL = 1
' a w celu uaktywnienia okna posłużymy się funkcją EnableWindow (...)
lRet = ShowWindow(hOpc, SW_NORMAL)
lRet = EnableWindow(hOpc, True)
' następnie klikamy widoczne i aktywne okno :
lRet = SendMessage(hOpc, BM_CLICK, ByVal 0, ByVal 0)
- End If
- End Sub
Okno klasy Edit. Zmiana tekstu okien "Marginesy strony": ID=1156 do ID=1158
Aby zmienić wartości marginesów w oknie klasy Edit zastosujemy funkcją SendMessage (...) z parametrem:
Const WM_SETTEXT = &HC
- Private Sub PageMargins(ByVal hWndPage As Long, snMargin() As Single)
Dim lRet As Long
Dim hEdit As Long
Dim i As Long
For i = 0 To 3
-
' pobierz uchwyt okna klasy Edit
hEdit = GetDlgItem(hWndPage, CLng(arrID(i * 3 + 1)))
' wstaw do okna tekst = wartości marginesu
lRet = SendMessage(hEdit, WM_SETTEXT, ByVal 0, ByVal CStr(snMargin(i)))
- Next
End Sub
Okno klasy CheckBox. Zmiana opcji "Drukuj dane": ID = 1920
W celu zmiany opcji "Drukuj dane" ponownie zastosujemy funkcją SendMessage (...) z parametrem:
Const BM_SETCHECK = &HF1
- Private Sub PrintDataOnly(ByVal hWndPage As Long, fDataOnly As Boolean)
Dim lRet As Long
Dim hCheck As Long
' Pobierz uchwyt CheckBox'a
hCheck = GetDlgItem(hWndPage, CLng(arrID(4 * 3 + 1)))
' sprawdź jego stan
lRet = SendMessage(hCheck, BM_GETCHECK, ByVal 0, ByVal 0)
' jeżeli zwrócony stan CheckBox'a CBool(lRet) nie jest zgodny
' z fDataOnly, to ustaw stan na fDataOnly.
' Nie jest konieczne pokazywanie i aktywowanie okna.
If Not CBool(lRet) = fDataOnly Then
lRet = SendMessage(hCheck, BM_SETCHECK, ByVal fDataOnly, ByVal 0)
End If
End Sub
Okno klasy CheckBox. Zmiana opcji - "Drukarka Domyślna ": ID = 1960
"Drukarka Konkretna": ID = 1961
Niestety, w tym przypadku nie wystarczy wysłanie komunikatu (tak jak w przypadku zmiany Orientacji strony)
SendMessage(hCheck, BM_CLICK, ByVal 0, ByVal 0)
Sami musimy zadbać o poprawne wartości w obu CheckBox'ach.
Po zmienie stanu jednego okna, musimy zmienić stan drugiego CheckBox'a na przeciwny.
- Private Sub DefaultPrinter(ByVal hWndPage As Long, fDefPrinter As Boolean)
Dim lRet As Long
Dim hCheck As Long
' pobierz uchwyt CheckBox'a "Domyślna drukarka"
hCheck = GetDlgItem(hWndPage, arrID(9 * 3 + 1))
' sprawdź jego stan
lRet = SendMessage(hCheck, BM_GETCHECK, ByVal 0, ByVal 0)
' Jeżeli zwrócony stan CheckBox'a CBool(lRet) nie jest zgodny z fDefPrinter
' to ustaw stan obu CheckBox'ów "Drukarka domyślna"/"Drukarka konkretna"
' na przeciwne fDefPrinter / Not fDefPrinter.
' Nie jest konieczne pokazywanie i aktywowanie obu okien.
If Not CBool(lRet) = fDefPrinter Then
-
lRet = SendMessage(hCheck, BM_SETCHECK, ByVal fDefPrinter, ByVal 0)
' Pobierz uchwyt CheckBox'a "Konkretna drukarka"
hCheck = GetDlgItem(hWndPage, arrID(10 * 3 + 1))
lRet = SendMessage(hCheck, BM_SETCHECK, ByVal Not fDefPrinter, ByVal 0)
- End If
End Sub
Okno klasy ComboBox. Wybór pozycji z listy "Rozmiar papieru: ": ID = 1137
Wybór pozycji na liście umożliwi nam funkcja SendMessage (...) wywołana z parametrem:
Const CB_SELECTSTRING = &H146
- Private Sub SizePaper(ByVal hWndPage As Long, sSizePaper As String)
Dim lRet As Long
Dim hCbo As Long
' pobierz uchwyt okna CboBox - Rozmiar papieru:
hCbo = GetDlgItem(hWndPage, arrID(7 * 3 + 1))
' znajdź i zaznacz pozycję sSizePaper na liście
lRet = SendMessage(hCbo, CB_SELECTSTRING, ByVal -1, ByVal sSizePaper)
If lRet = CB_ERR Then
MsgBox "Nie mogę znaleźć papieru " & sSizePaper & " na liście !"
End If
End Sub
Okno klasy ComboBox. Wybór pozycji z listy "Źródło papieru: ": ID = 1138
Wybór pozycji z listy źródło papieru wykonujemy identycznie jak dla wyboru Rozmiaru papieru.
- Private Sub SourcePaper(ByVal hWndPage As Long, sSourcePaper As String)
Dim lRet As Long
Dim hCbo As Long
' pobierz uchwyt okna CboBox - Źródło papieru:
hCbo = GetDlgItem(hWndPage, arrID(8 * 3 + 1))
' znajdź i zaznacz pozycję sSizePaper na liście
lRet = SendMessage(hCbo, CB_SELECTSTRING, ByVal -1, ByVal sSourcePaper)
If lRet = CB_ERR Then
MsgBox "Nie mogę znaleźć źródła papieru " & sSourcePaper & " na liście !"
End If
End Sub
Pokazywanie raportu po zmianie ustawień opcji wydruku.
Aby pokazać raport po zmianie ustawień opcji wydruku musimy sprawdzić, czy pracujemy z plikiem bazy *.MDE, czy też *.MDB. Dla pliku *.MDE raport został wcześniej otwarty i ukryty, więc po ustawieniu opcji wydruku musimy go tylko przesunąć i pokazać lub wydrukować.
Nie możemy go zamknąć, gdyż w pliku *.MDE opcje wydruku nie są nigdzie w bazie zapisywane.
Dla pliku *MDB raport należy otworzyć, ponieważ był tylko zaznaczony w oknie DB.
- Private Sub zbPrintReport()
Dim sIsMde As String * 1
' Metodę rozpoznania typu pliku bazy podał Krzysztof Naworyta
' na Grupie dyskusyjnej: pl.comp.bazy-danych.msaccess
' w wątku: Rozpoznawanie wersji pliku MDB
On Error Resume Next
sIsMde = CurrentDb.Properties("MDE")
If Err.Number <> 0 Then Err.Clear
On Error GoTo Err_zbOpenPageSetup
- If sIsMde = "T" Then
-
' Plik bazy typu *.MDE => raport musi być otwarty
fMoveRpt = True
' raport w zdarzeniu Report_Open przesunie się poza widoczne okno
DoCmd.OpenReport cRptName, acViewPreview
' ukryj raport
ShowWindow Reports(cRptName).hwnd, SW_HIDE
Me.TimerInterval = 50
' w celu wyeliminowania komunikatu błędu nr 2501
' - akcja RunCommand została anulowana
On Error Resume Next
' otwórz okno "Ustawienia strony"
DoCmd.RunCommand acCmdPageSetup
' po otwarciu okna "Ustawienie strony" Timer formularza
' uruchomi właściwą funkcję ustawiania opcji wydruku
' zbSetPageSetupByID(GetActiveWindow), której składowymi
' są wyżej opisane procedury zmiany opcji wydruku.
If Err.Number < 0 Then Err.Clear
On Error GoTo Err_zbPrintReport
' plik bazy *.MDE 'pokaż raport.
Call zbShowReport(True)
fMoveRpt = False
- Else
-
' plik bazy *.MDB - nie otwieraj raportu, zaznacz go w oknie DB
Call zbMoveDbOutMDI()
' otwórz i pokaż raport
Call zbShowReport(False)
- End If
- Exit_zbPrintReport:
- Exit Sub
- Err_zbPrintReport:
- MsgBox "Błąd nr: " & Err.Number & vbNewLine & Me.name & _
-
" Procedura: zbPrintReport" & vbNewLine & Err.Description
- Resume Exit_zbPrintReport
- End Sub
Funkcja zbShowReport pokazujaca raportu.
W zależności od argumentu fIsOpenRpt który dla *.MDB = False, dla *.MDE = True otwiera raport lub go tylko przesuwa.
W przybliżony sposób dobiera rozmiar okna raportu do proporcji arkusza A4:
H/W = 1.43; W/H = 0.7 i ustawia centralnie w oknie Accessa.
- Private Sub zbShowReport(fIsOpenRpt As Boolean, fOrientVert As Boolean)
Dim lWidth As Long
Dim lHeight As Long
Dim rctMDI As RECT
Dim hRpt As Long
Dim hParent As Long
' Plik *.MDB nie otwierano raportu
If Not fIsOpenRpt Then
DoCmd.OpenReport cRptName, acViewPreview
Reports(cRptName).Visible = False
End If
- hRpt = Reports(cRptName).hwnd
' pobierz uchwyt rodzica(MDIClient) raportu
hParent = GetParent(hRpt)
' pobierz wymiary okna MDIClient
GetWindowRect hParent, rctMDI
lWidth = (rctMDI.Right - rctMDI.Left) - 30
lHeight = (rctMDI.Bottom - rctMDI.Top) - 30
' ustaw szerokosc okna raportu w/m formatu A4, w zależności od orientacji strony
If fOrientVert = True Then
lWidth = lHeight / 1.43
Else
lWidth = lHeight / 0.7
End If
' ustaw raport centralnie w oknie rodzica
MoveWindow hRpt, CLng(((rctMDI.Right - rctMDI.Left) - lWidth) / 2), 10, _
lWidth, lHeight, True
ShowWindow hRpt, SW_NORMAL
DoCmd.SelectObject acReport, cRptName, False
End Sub