Poniżej cytuje tekst Dominika Marcinskiego w całości:
Witam wszystkich
Jakis czas temu byla dyskusja jak projektowac formularze zeby dzialaly w
roznych rozdzielczosciach. Jako ze takze potrzebuje takiej metody
postanowilem splodzic jedna.
Zalozenia sa bardzo proste ( i dlatego nie wszystko da sie z tym zrobic):
1. Kazdy formularz ma swoja instancje obiektu z klasy 'classResizeV01'
(modul klasy dopiero w Acc97)
2. przy zdarzeniu 'OnLoad' formularza wykonuje sie metode 'Initialize'
obiektu podajac referencje do formularza jako parametr
3. przy zdarzeniu 'OnResize' uruchamia sie metode 'Resize' ktora robi petle
po wszystkich formantach i zmienia ich rozmiar i polozenie wedlug znacznikow
zawartych we wlasciwosci 'Metka' formantu.
4. znaczniki skladaja sie z dwóch liter: Pierwsza oznacza co sie dzieje z
formantem przy zmianie rozmiaru w poziomie, a druga w pionie. Dozwolone
wartości to: M - Move, R - Resize.
Nie chce sie tutaj rozpisywac, bo mniej wiecej wiadomo o co chodzi (mam
nadzieje). Dokladny opis dzialania klasy jak i sposob uzycia znajduje sie w
jej ciele jako komentarz.
Tresc klasy zostala dolaczona na koncu listu nalezy wiec:
1. Utworzyc nowy modol KLASY (tylko w Access 97), oraz nazwac najlepiej
'classResizeV01' (V01 - wersja 01)
2. Wstawic zawartosc procedury i przeczytac sposob uzycia
W przypadku wczesniejszych wersji accessa bedzie chyba trzeba do kazdego
formularza wkladac tresc procedury 'Resize', badz uzywac niewidocznego
podformularza zamiast obiektow klas. Mam nadzieje ze osoby zainteresowane
sobie poradza.
Mam takze nadzieje ze tutaj cale guru accessowe:
1. znajdzie wszystkie bledy
2. sprawi ze procedura stanie sie maksymalnie zoptymalizowana
Jesli kogos to nie interesuje to sorry za spam.
Milej lektury
--
Dominik Marcinski
Inf3, midon@icslab.agh.edu.pl
Tresc klasy:
Option Compare Database
Option Explicit
' Nazwa modułu klasy: classResizeV01 (wersja 01)
' Moduł klasy programu MSAccess'97 wspomagający obsługę zdarzenie 'OnResize' formularza.
' Poniższy kod można używać i modyfikować bez ograniczeń. Konstruktywne modyfikacje są
' mile widziane, oraz winny być ogłaszane na forum
' pl.comp.bazy-danych.msaccess' bądź
' via email 'midon@icslab.agh.edu.pl'
' Osoby odpowiedzialne za wszystkie błędy w poniższym module:
' 1. Dominik Marciński (midon@icslab.agh.edu.pl)
' Sposób użycia:
'
' 1. W sekcji deklaracji obsługiwanego formularza należy dodać deklarację:
'
' Dim objResize As New classResizeV01
'
' 2. Dla zdarzenia 'OnLoad' należy zainicjować obiekt 'objResize' używając
' metody 'Initialize' z parametrem będącym wskaźnikiem do tego formularza:
'
' objResize.Initialize Me
'
' 3. Dla zdarzenia 'OnResize' formularza należy wywołać metodę 'Resize'
' obiektu 'objResize':
'
' objResize.Resize
'
' 4. Dla każdego formantu, który ma brać udział w operacji zmiany rozmiaru,
' we właściwości 'Metka' (Tag) należy dodać dwie, lub jedną literę:
'
' , gdzie
' = 'M' | 'R' |
' = 'M' | 'R' |
'
' litery 'M' i 'R' oznaczają kolejno przesunięcie (Move) i zmiana rozmiaru (Resize).
' Literę na pozycji / należy interpretować jako sposób reakcji
' formantu na zmianę rozmiaru formularza, w kierunku poziomym / pionowym.
' Litera 'M' (przesunięcie) powodować będzie ruch całego formantu w zadanym kierunku,
' Litera 'R' (zmiana rozmiaru) powodować będzie ruch prawego dolnego rogu formantu
' w zadanym kierunku.
' Litera inna niż 'M' i 'R' nie wpływa na zachowanie się formantu w danym kierunku.
'
' 5. UWAGA:
'
' Funkcja zmienia położenie (rozmiary) formantów tylko wtedy gdy rozmiar okna jest
' większy od pierwotnych rozmiarów formularza, tzn. zmnieszanie rozmiaru okna poniżej
' rozmiaru dla którego został zaprojektowany nie powoduje zagęszczania (zawężania)
' się formantów
' Przykład: Właściwość Metka formantu zawiera wartość:
'
' '' - formant nie rusza się
' 'abc' - formant nie rusza się
' 'rr' - formant nie rusza się
' 'M' - formant trzyma się prawej krawędzi okna
' 'R' - formant rozszerza się w poziomie
' 'xM' - formant trzyma się dolnej krawędzi okna
' 'MM' - formant trzyma się prawego dolnego rogu okna
' 'RR' - formant zmienia rozmiar w pionie i w poziomie
' 'RRx' - jak wyżej
' Sposób działania:
'
' 1. Metoda 'Initialize' w procedurze 'Form_Load' odczytuje wymiary formularza
' i zapisuje je w zmiennych 'lastW' i 'lastH', oraz ustawia minimalne rozmiary
' formularza 'minW' i 'minH' równe początkowym wymiarom.
'
' 2. Jeśli rozszerzamy formularz zwiększane są rozmiary sekcji i formularza
'
' 3. Przy zmianie rozmiaru okna odczytywane są te wymiary i obliczana jest różnica
' względem poprzednich wymiarów 'lastW' i 'lastH'. Różnica zapamiętana w zminennych
' 'diffW' i 'diffH' wykorzystana będzie do:
' a) dodana do właściwości 'Top', 'Left' formantu w przypadku przesówania go,
' b) dodana do właściwości 'Top', 'Left', 'Hight', 'Width' w przypadku skalowania.
'
' 4. Jeśli zwężamy formularz, to zmniejszane są rozmiary sekcji i formularza
Const classTitle = "classResize"
Const str1 = "W sekcji 'Nagłówek' lub 'Stopka' znaleziono formant skalowany w pionie. Formanty w wyżej wymienionych sekcjach mogą być jedynie skalowane poziomo."
Const str2 = "Aby używać obliektu 'classResize' należy go wcześniej zainicjalizować. Użyj metody 'objResize.Initialize Me' w zdarzeniu 'OnLoad' formularza."
Const cm = 567 ' Twipów
Dim frmRelated As Form ' Related form
Dim lastW As Integer ' last Width
Dim lastH As Integer ' last Height
Dim minW As Integer ' minimal Width
Dim minH As Integer ' minimal Height
Private Function MAX(val1 As Integer, val2 As Integer)
MAX = IIf(val1 > val2, val1, val2)
End Function
Public Sub Initialize(initForm As Form)
' Funkcja ma za zadanie zdobycie wskaźnika do formularza ('initForm'), który będzie
' korzystał z obiektu classResize, oraz uzyskanie paru informacji o nim.
Dim currC As Control
Dim cTag As Variant
Set frmRelated = initForm
With frmRelated
' Pętla ma za zadanie sprawdzić czy w sekcjach 'Nagłówek' lub 'Stopka' nie ma
' formantów skalowanych w pionie. Podczas zmiany rozmiaru formularza na wysokość
' zmianie rozmiaru ulega tylko sekcja 'Szczegóły', a inne sekcje nie zmieniają
' swojej wysokości.
For Each currC In .Controls
cTag = Mid(currC.Tag, 2, 1)
If cTag = "M" Or cTag = "R" Then
If Not currC.Section = acDetail Then
MsgBox str1, vbExclamation, classTitle
Set frmRelated = Nothing
Exit Sub
End If
End If
Next currC
' Zapamiętanie początkowych rozmiarów formularza, tzn. rozmiarów oryginalnych
' oraz ustawienie minimalnych rozmiarów formularza na takie same wartości.
' Oznacza to, że metoda 'Resize' wspomaga powiększanie formularzy, a nie ich
' zmniejszanie. Najlepiej więc tworzyć skalowane formularze dla najmniejszych
' rozdzielczości z jakimi się pracuje.
lastW = .Width
lastH = .Section(acDetail).Height
On Error Resume Next
lastH = lastH + .Section(acHeader).Height
lastH = lastH + .Section(acFooter).Height
minW = lastW
minH = lastH
End With
End Sub
Sub Resize()
' Ta metoda jest odpowiedzialna za zmianę rozmiaru lub przesówanie formantów
' na formularzu według zadanych znaczników we właściwości 'Metka' formantu.
' Znaczniki rozpoznawane przes metodę to 'M' - Move i 'R' - Resize.
Static diffW As Integer ' Width difference
Static diffH As Integer ' Height difference
Static currC As Control ' current Control
Static cTag As Variant ' control's Tag
On Error GoTo Resize_Error
With frmRelated
' Obliczanie zmian rozmiaru okna w stosunku do poprzednich wymiarów
' Różnica ta nie może jednak spowodować zmiany zbyt daleko idącej tzn. poniżej minimum
diffW = MAX(.InsideWidth, minW) - lastW
diffH = MAX(.InsideHeight, minH) - lastH
If Not lastW < minW Then
If Not diffW = 0 Then
If diffW > 0 Then .Width = .Width + diffW ' Jeśli powiększamy okno
For Each currC In .Controls
cTag = Left(currC.Tag, 1) ' Odczytanie pierwszej litery
If Not IsNull(cTag) Then
Select Case cTag
Case "M":
currC.Left = currC.Left + diffW
Case "R":
currC.Width = currC.Width + diffW
End Select
End If
Next currC
If diffW < 0 Then .Width = .Width + diffW ' Jeśli zmniejszamy okno
End If
End If
lastW = MAX(.InsideWidth, minW)
If Not lastH < minH Then
If Not diffH = 0 Then
If diffH > 0 Then .Section(acDetail).Height = .Section(acDetail).Height + diffH
For Each currC In .Controls
cTag = Mid(currC.Tag, 2, 1)
If Not IsNull(cTag) Then
Select Case cTag
Case "M":
currC.Top = currC.Top + diffH
Case "R":
currC.Height = currC.Height + diffH
End Select
End If
Next currC
If diffH < 0 Then .Section(acDetail).Height = .Section(acDetail).Height + diffH
End If
End If
lastH = MAX(.InsideHeight, minH)
End With
Exit Sub
Resize_Error:
If Err = 91 Then
MsgBox str2, vbExclamation, classTitle
Exit Sub
Else
Err.Raise Err
End If
End Sub