Access
 sql >> база данни >  >> RDS >> Access

VBA Алхимия:Превръщане на методите в свойства

Един от най-добрите начини за ускоряване на изпълнението на кода в Excel е да изключите актуализирането на екрана с помощта на Application.ScreenUpdating Имот. Можете да направите същото в Access, като използвате Application.Echo метод.

Забележете, че посочих версията на Excel като свойство и версията на Access като метод . Това означава, че можем да проверим състоянието на рисуването на екрана в Excel, но не можем да направим това в Access. Това се оказва важна разлика.

Имам няколко функции в моята библиотека с кодове, които временно изключват рисуването на екрана. Техниката обикновено не се използва за осигуряване на вид повишаване на производителността, което виждаме в Excel. Вместо това подобрява интерфейса, като предотвратява типа „мигане на формуляра“, което се случва, ако правим бързи промени във външния вид на нашите формуляри.

Прост случай на използване

Имам модул за клас, който предоставя разширени функции за индивидуално преоразмеряване на контролите на формуляра, когато самият формуляр се преоразмерява. Когато за първи път разработвах този модул, визуалният ефект беше много обезпокоителен. Всеки път, когато формата се преоразмерява, всяка отделна контрола ще преоразмерява на екрана една по една.

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

Това беше разтърсващо потребителско изживяване. За да го подобря, бих изключал актуализирането на екрана, бих направил своите промени, след което бих включил отново актуализирането на екрана в края на функцията.

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

Това значително подобри потребителското изживяване. Започнах да използвам тази техника в целия си код, който променяше потребителския интерфейс. И тогава започнах да срещам проблеми.

Проблемът дойде, когато извиках множество функции, които изключваха рисуването на екрана подред. Първата функция ще изключи рисуването на екрана, ще направи своите промени, след което ще включи отново рисуването на екрана. Интерфейсът ще мига с актуализацията си, след което втората функция ще изключи отново рисуването на екрана, ще направи своите промени и накрая ще включи отново рисуването на екрана завинаги.

Запазване на състоянието на рисуване на екран

По-добрият начин за справяне с тази ситуация би бил да запазите състоянието на рисуване на екрана в началото на рутината, да изключите рисуването на екрана, след което да възстановите първоначалното състояние на рисуване на екрана, запазено в началото на рутината. В Excel това беше просто:

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

Може би вече сте забелязали проблема в Access. Кодът за включване и изключване на рисуването на екрана в Access е метод, което означава, че няма начин да се провери текущото му състояние. Писането на код като примера по-горе е невъзможно в Access.

Как се справих с проблема? Създадох модул за клас и обвих Application.Echo метод вътре в свойство на клас. Използвах модела Singleton (без да осъзнавам, че това беше по онова време), за да поддържам тази част от състоянието на програмата. Нарекох този клас clsApp и създаде един публичен екземпляр на класа, деклариран с Нов ключова дума, така че винаги да е налична.

Примерен код

Ето откъс от моето clsApp клас:

'--== 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

В отделен стандартен модул декларирах публичен екземпляр на класа така:

Public App As New clsApp

Сега имах начин да проверя състоянието на рисуването на екрана на моето приложение. Единственото изискване беше никога да не използвам Application.Echo директно във всеки от моя код. Винаги използвам App.Echo за да зададете флага за рисуване на екрана сега.

Примерно използване

Това ми позволи да променя кода си за преоразмеряване към този, който прилича много на моя пример в Excel от по-рано:

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. Свързване с Microsoft Access в IRI Workbench

  2. Какво е релационна база данни?

  3. Как да създадете база данни от шаблон в Access 2016

  4. Защо трябва да използвате PHPs PDO за достъп до база данни

  5. TreeView ImageCombo падащо меню за достъп