Access
 sql >> Baza danych >  >> RDS >> Access

VBA Alchemia:zamienianie metod we właściwości

Jednym z najlepszych sposobów na przyspieszenie wykonywania kodu w programie Excel jest wyłączenie aktualizacji ekranu za pomocą Application.ScreenUpdating własność. Możesz zrobić to samo w programie Access, używając Echa aplikacji metoda.

Zauważ, że nazwałem wersję Excela właściwością a wersja Access jako metoda . Oznacza to, że możemy sprawdzić stan malowania ekranu w programie Excel, ale nie możemy tego zrobić w programie Access. Okazuje się, że jest to istotna różnica.

W mojej bibliotece kodu mam kilka funkcji, które tymczasowo wyłączają malowanie ekranu. Technika ta nie jest zwykle używana do zapewnienia takiego wzrostu wydajności, jaki widzimy w programie Excel. Zamiast tego poprawia interfejs, zapobiegając „miganiu formularzy”, które występuje, gdy dokonujemy szybkich zmian w wyglądzie naszych formularzy.

Prosty przypadek użycia

Mam moduł klasy, który zapewnia zaawansowane funkcje do indywidualnej zmiany rozmiaru kontrolek formularza, gdy rozmiar samego formularza jest zmieniany. Kiedy po raz pierwszy tworzyłem ten moduł, efekt wizualny był bardzo niepokojący. Za każdym razem, gdy zmieniano rozmiar formularza, każda pojedyncza kontrolka zmieniałaby rozmiar na ekranie pojedynczo.

Public Sub weForm_Resize()
   '... loop through and resize controls based on their Tag property...
End Sub

To było wstrząsające doświadczenie użytkownika. Aby to poprawić, wyłączyłbym aktualizację ekranu, wprowadziłem zmiany, a następnie ponownie włączyłbym aktualizację ekranu na końcu funkcji.

Public Sub weForm_Resize()
    Application.Echo False
    
    '... loop through and resize controls based on their Tag property...
    
    Application.Echo True
End Sub

To znacznie poprawiło wrażenia użytkownika. Zacząłem używać tej techniki w całym moim kodzie, który modyfikował interfejs użytkownika. I wtedy zacząłem mieć problemy.

Problem pojawił się, gdy wywołałem kilka funkcji, które wyłączały malowanie ekranu z rzędu. Pierwsza funkcja wyłączyła malowanie ekranu, wprowadziła zmiany, a następnie ponownie włączyła malowanie ekranu. Interfejs sflashowałby swoją aktualizację, a następnie druga funkcja ponownie wyłączyłaby malowanie ekranu, wprowadziłaby zmiany, a na koniec na dobre włączyłaby malowanie ekranu.

Zachowywanie stanu malowania ekranu

Lepszym sposobem radzenia sobie z tą sytuacją byłoby zapisanie stanu malowania ekranu na początku procedury, wyłączenie malowania ekranu, a następnie przywrócenie oryginalnego stanu malowania ekranu zapisanego na początku procedury. W programie Excel było to proste:

Sub ComplexExcelProcess()
    Dim SavePaintStatus As Boolean
    SavePaintStatus = Application.ScreenUpdating
    
    '...run some complex calculations...
    
    Application.ScreenUpdating = SavePaintStatus
End Sub

Być może zauważyłeś już problem w programie Access. Kod do włączania i wyłączania malowania ekranu w programie Access to metoda, co oznacza, że ​​nie ma możliwości sprawdzenia jego aktualnego stanu. Pisanie kodu, jak w powyższym przykładzie, jest niemożliwe w programie Access.

Jak poradziłem sobie z problemem? Stworzyłem moduł klasy i opakowałem Application.Echo metoda wewnątrz właściwości klasy. Użyłem wzorca Singleton (nie zdając sobie sprawy, że tak było w tamtym czasie), aby utrzymać ten fragment stanu programu. Nazwałem tę klasę clsApp i utworzył pojedynczą publiczną instancję klasy zadeklarowanej z Nowym słowa kluczowego, aby zawsze było dostępne.

Przykładowy kod

Oto fragment mojej clsApp klasa:

'--== clsApp class module ==--
Option Explicit
Option Compare Database

Private m_bEcho As Boolean

Private Sub Class_Initialize()
    Application.Echo True
    m_bEcho = True
End Sub

Public Property Get Echo() As Boolean
    Echo = m_bEcho
End Property

Public Property Let Echo(ByVal bEcho As Boolean)
    Application.Echo bEcho
    m_bEcho = bEcho
End Property

W osobnym standardowym module zadeklarowałem publiczną instancję klasy w następujący sposób:

Public App As New clsApp

Miałem teraz możliwość sprawdzenia stanu malowania ekranu mojej aplikacji. Jedynym wymaganiem było to, że nigdy nie użyję Application.Echo bezpośrednio w dowolnym moim kodzie. Zawsze używam App.Echo aby ustawić teraz flagę malowania ekranu.

Przykładowe użycie

To pozwoliło mi zmienić mój kod zmiany rozmiaru na ten, który wygląda bardzo podobnie do mojego przykładu Excela z wcześniejszego:

Public Sub weForm_Resize()
    Dim SaveEcho As Boolean
    SaveEcho = App.Echo       'Save the current screen painting state
    App.Echo = False
    
    '... loop through and resize controls based on their Tag property...
    
    App.Echo = SaveEcho       'Restore the screen painting state
End Sub

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie widoków SQL do dodawania/edycji danych w programie Microsoft Access

  2. Visual Basic for Applications w programie Microsoft Access

  3. Charakterystyka raportu

  4. Jak wyświetlić zależności obiektów w programie Access 2016

  5. Funkcje statyczne i subs