Access

  MS Access 2010+  |  Formularze  |   VBA 7.0

• Jak uatrakcyjnić proces otwierania formularza ?

Wiemy już, że formularze są podstawowymi obiektami MS Access. Za ich pomocą możemy prezentować zgromadzone w bazie danych informacje, edytować dane, dodawać nowe oraz usuwać istniejące dane. Skoro jest to najważniejszy obiekt interfejsu bazy danych powinniśmy zadbać o jego wygląd i funkcjonalność. Możemy też spróbować otwierać formularze w niekonwencjonalny sposób. Wizualny efekt procesu otwierania formularza możemy rozłożyć na wiele pojedynczych prezentacji formularza. Najpierw pokazujemy formularz o małym rozmiarze i za każdym razem zwiększamy jego rozmiar oraz jeżeli jest to konieczne również jego położenie.

Rozmiar i położenie okna formularza

Poznaliśmy podstawowe właściwości formularza za pomocą których możemy pobrać aktualne położenie okna formularza (WindowLeft i WindowTop) oraz rozmiar okna formularza (WindowWidth i WindowHeight), a także metody AutoCenterAutoResize za pomocą których możemy wycentrować formularz oraz wymusić, by formularz miał wysokość tak dobraną, by pokazywał pełne rekordy. Aby zmienić położenie i (lub) rozmiar okna formularza (okno formularza musi być oknem aktywnym) możemy użyć metody obiektu DoCmd MoveSize.

Przykładowe otwarcie formularza w kierunku od lewego do prawego boku.

Na stronie Otwarcie formularza znajduje się przykład przedstawiający otwarcie formularza, tak że jego wysokość cały czas jest stała, a szerokość zwiększa się stopniowo, aż do osiągnięcia docelowej szerokości. Wizualny schemat otwarcia formularza pokazany jest poniżej. Na stronie tej omówione zostały problemy na jakie napotkałem realizując przykładowe otwarcie formularza.

Formularz do lewej

5. Od lewego boku do prawego formularza

Dziewięć wizualnych sposobów otwarcia formularza.

Wizualny efekt procesu otwierania formularza możemy rozłożyć na wiele pojedynczych prezentacji formularza. Najpierw pokazujemy formularz o małym rozmiarze i za każdym razem zwiększamy jego rozmiar oraz jeżeli jest to konieczne również jego położenie. W zależności od kierunku zwiększania rozmiaru formularza w trakcie jego otwierania możemy wyróżnić 9 wizualnych efektów:

0. Centralnie
Punktem stałym jest środek formularza. Stopniowo zwiększana jest wysokość i szerokość formularza.
1. Od lewego górnego narożnika do prawego dolnego narożnika
Punktem stałym jest lewy górny narożnik. Stopniowo zwiększana jest wysokość i szerokość formularza.
2. Od prawego górnego narożnika do lewego dolnego narożnika
Punktem stałym jest prawy górny narożnik. Stopniowo zwiększana jest wysokość i szerokość formularza.
3. Od prawego dolnego narożnika do lewego górnego narożnika
Punktem stałym jest prawy dolny narożnik. Stopniowo zwiększana jest wysokość i szerokość formularza.
4. Od lewego dolnego narożnika do prawego górnego narożnika
Punktem stałym jest lewy dolny narożnik. Stopniowo zwiększana jest wysokość i szerokość formularza.
5. Od lewego boku okna formularza do prawego boku okna formularza
Linią stałą jest lewy bok formularza. Stopniowo zwiększana jest szerokość formularza. Wysokość formularza jest stała.
6. Od prawego boku okna formularza do lewego boku okna formularza
Linią stałą jest prawy bok formularza. Stopniowo zwiększana jest szerokość formularza. Wysokość formularza jest stała.
7. Od górnego boku formularza do dolnego boku formularza
Linią stałą jest górne obramowanie formularza. Stopniowo zwiększana jest wysokość formularza. Szerokość formularza jest stała.
8. Od dolnego boku formularza do górnego boku formularza
Linią stałą jest dolne obramowanie formularza. Stopniowo zwiększana jest wysokość formularza. Szerokość formularza jest stała.

Skoro wyliczyliśmy dziewięć wizualnych sposobów otwarcia formularza, ze względu na kierunku zwiększania rozmiaru formularza w trakcie jego otwierania, to utwórzmy typ wyliczeniowy Enum enShowForm

Public Enum enShowForm
		Explode = 0
		LeftTop_RightDown
		RightTop_LeftDown
		RightDown_LeftTop
		LeftDown_RightTop
		Left_Right
		Right_Left
		Top_Down
		Down_Top
End Enum

Poniżej dwa inne wizualne schematy otwarcia formularza.

Formularz Explode

0. Centralnie we wszystkich kierunkach
     Explode = 0


Formularz LeftTop_RightDown

1. Od lewego górnego narożnika
     do prawego dolnego narożnika
     LeftTop_RightDown = 1


⊗ Public Sub formShowForm(frm As Access.Form, _
              ByVal lLeft As Long, ByVal lTop As Long, _
              ByVal lWidth As Long, ByVal lHeight As Long, _
       Optional ByVal enDirect As enShowForm = enShowForm.Explode, _
       Optional ByVal lRepeat As Long = 250)
  • Funkcja formShowForm(...) tworzy wizualny efekt podczas otwierania formularza. Proces otwierania formularza rozłożony jest na wiele pojedynczych prezentacji formularza. Najpierw pokazywany jest formularz o małym rozmiarze i z każdym cyklem pętli For Next razem zwiększany jest jego rozmiar oraz jeżeli jest to konieczne również jego położenie. W zależności od kierunku zwiększania rozmiaru okna formularza możemy wyróżnić 9 wizualnych efektów.
  • argumenty:
    • frm
    • Zmienna obiektowa reprezentująca formularz którego rozmiar będzie zmieniany.
    • lLeft()
    • Końcowa odległość lewego górnego rogu formularza od lewej krawędzi roboczego obszaru okna aplikacji MS Access. Jeżeli widoczne jest „okienko nawigacji”, jest to odległość od jego prawej krawędzi. Jednostką argumentu jest twip.
    • lTop
    • Końcowa odległość lewego górnego rogu formularza od górnej krawędzi roboczego obszaru okna aplikacji MS Access. Najczęściej jest to dolne obramowanie Wstążki (Ribbon). Jednostką argumentu jest twip.
    • lWidth
    • Końcowa szerokość formularza. Jednostką argumentu jest twip.
    • lHeight
    • Końcowa wysokość formularza. Jednostką argumentu jest twip.
    • enDirect
    • Argument opcjonalny. Domyślna wartość to enShowForm.Explode = 0. Typ wyliczeniowy określający sposób (kierunek) zwiększania rozmiaru formularza w trakcie jego otwierania.
    • lRepeat
    • Ilość operacji zmiany rozmiaru formularza. Im niższa wartość, tym szybciej otwierany jest formularz. Dla wartości argumentu lRepeat=0 formularz otwierany jest bez efektów wizualnych..
  • zwraca:
  • procedura nie zwraca żadnej wartości.
  • autor:
    Funkcja powstała w oparciu o:
    Chris St. Valentine, "Access 2.0 - Potęga programowania" wyd. LT&P wyd. 1996 r.
  • data: 02.01.2018
Option Compare Database
Option Explicit
' Typ wyliczeniowy. Kolejne elementy
' określają kierunek wyświetlania formularza
Public Enum enShowForm
		Explode = 0
		LeftTop_RightDown
		RightTop_LeftDown
		RightDown_LeftTop
		LeftDown_RightTop
		Left_Right
		Right_Left
		Top_Down
		Down_Top
End Enum

Public Sub formShowForm(frm As Access.Form, _
									ByVal lLeft As Long, ByVal lTop As Long, _
									ByVal lWidth As Long, ByVal lHeight As Long, _
					Optional ByVal enDirect As enShowForm = enShowForm.Explode, _
					Optional ByVal lRepeat As Long = 250)
' tymczasowe wymiary i położenie
' okna formularza szerokość
Dim lWidthTmp   As Long
Dim lHeightTmp  As Long
Dim lLeftTmp    As Long
Dim lTopTmp     As Long
Dim i           As Long

	For i = 1 To lRepeat
		Select Case enDirect
			' 0. centralnie
			Case enShowForm.Explode
				lLeftTmp = lLeft + (lWidth - lWidthTmp) / 2
				lTopTmp = lTop + (lHeight - lHeightTmp) / 2
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight * (i / lRepeat)
			' 1. od lewego górnego do prawego dolnego
			Case enShowForm.LeftTop_RightDown
				lLeftTmp = lLeft
				lTopTmp = lTop
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight * (i / lRepeat)
			' 2. od prawego górnego do dolnego lewego
			Case enShowForm.RightTop_LeftDown
				lLeftTmp = lLeft + (lWidth - lWidthTmp)
				lTopTmp = lTop
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight * (i / lRepeat)
			' 3. od prawego dolnego do lewego górnego
			Case enShowForm.RightDown_LeftTop
				lLeftTmp = lLeft + (lWidth - lWidthTmp)
				lTopTmp = lTop + (lHeight - lHeightTmp)
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight * (i / lRepeat)
			' 4. od lewego dolnego do prawego górnego
			Case enShowForm.LeftDown_RightTop
				lLeftTmp = lLeft
				lTopTmp = lTop + (lHeight - lHeightTmp)
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight * (i / lRepeat)
			' 5. od lewej do prawej (bez zmiany wysokości)
			Case enShowForm.Left_Right
				lLeftTmp = lLeft
				lTopTmp = lTop
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight
			' 6. od prawej do lewej
			Case enShowForm.Right_Left
				lLeftTmp = lLeft + (lWidth - lWidthTmp)
				lTopTmp = lTop
				lWidthTmp = lWidth * (i / lRepeat)
				lHeightTmp = lHeight
			' 7. od góry do dołu (bez zmiany szerokości)
			Case enShowForm.Top_Down
				lLeftTmp = lLeft
				lTopTmp = lTop
				lWidthTmp = lWidth
				lHeightTmp = lHeight * (i / lRepeat)
			' 8. od dołu do góry (bez zmiany szerokości)
			Case enShowForm.Down_Top
				lLeftTmp = lLeft
				lTopTmp = lTop + (lHeight - lHeightTmp)
				lWidthTmp = lWidth
				lHeightTmp = lHeight * (i / lRepeat)
			Case Else
				Exit Sub
		End Select
			
		' zmieniaj tylko szerokość formularza
		DoCmd.MoveSize lLeftTmp, lTopTmp, lWidthTmp, lHeightTmp
		DoEvents
		' ustawiaj fokus na otwieranym formularzu
		DoCmd.SelectObject acForm, frm.Name, False
	Next
	DoEvents
End Sub