Banner Access
Tekst informacyjny o polityce Cookies Close   

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