sql >> Database teknologi >  >> RDS >> Access

VBA Alchemy:At gøre metoder til egenskaber

En af de bedste måder at fremskynde kodeudførelsen i Excel er at deaktivere skærmopdatering ved hjælp af Application.ScreenUpdating ejendom. Du kan gøre det samme i Access ved at bruge Application.Echo metode.

Bemærk, at jeg omtalte Excel-versionen som en ejendom og Access-versionen som en metode . Det betyder, at vi kan tjekke status for skærmmaling i Excel, men det kan vi ikke gøre i Access. Dette viser sig at være en vigtig forskel.

Jeg har flere funktioner i mit kodebibliotek, der midlertidigt slår skærmmaling fra. Teknikken bruges generelt ikke til at give den slags præstationsboost, vi ser i Excel. I stedet forbedrer det grænsefladen ved at forhindre den type "formularblinkning", der opstår, hvis vi foretager hurtige ændringer i udseendet af vores formularer.

En simpel brugssag

Jeg har et klassemodul, der giver avancerede funktioner til individuel ændring af størrelsen på formularkontrolelementer, når selve formularen ændres. Da jeg først udviklede dette modul, var den visuelle effekt meget foruroligende. Hver gang formularen blev ændret, ændrede hver enkelt kontrol størrelse på skærmen én ad gangen.

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

Dette var en rystende brugeroplevelse. For at forbedre det, ville jeg slå skærmopdatering fra, foretage mine ændringer og derefter slå skærmopdatering til igen i slutningen af ​​funktionen.

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

Dette forbedrede brugeroplevelsen væsentligt. Jeg begyndte at bruge denne teknik i al min kode, der ændrede brugergrænsefladen. Og det var da, jeg begyndte at løbe ind i problemer.

Problemet kom, da jeg ringede til flere funktioner, der deaktiverede skærmmaling i træk. Den første funktion ville slå skærmmaling fra, foretage ændringer og derefter slå skærmmaling til igen. Grænsefladen vil blinke sin opdatering, derefter vil den anden funktion slå skærmmaling fra igen, foretage sine ændringer og til sidst slå skærmmaling til igen for altid.

Bevarelse af skærmmalingstilstand

Den bedre måde at håndtere denne situation på ville være at gemme skærmmaleriets status i begyndelsen af ​​rutinen, slå skærmmaling fra og derefter gendanne den originale skærmmalingsstatus, der blev gemt i begyndelsen af ​​rutinen. I Excel var dette ligetil:

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

Måske har du allerede opdaget problemet i Access. Koden til at slå skærmmaling til og fra i Access er en metode, hvilket betyder, at der ikke er nogen måde at kontrollere dens aktuelle status. Det er umuligt at skrive kode som eksemplet ovenfor i Access.

Hvordan håndterede jeg problemet? Jeg oprettede et klassemodul og indpakkede Application.Echo metode inde i en klasseegenskab. Jeg brugte Singleton-mønsteret (uden at være klar over, at det var, hvad det var på det tidspunkt) til at opretholde dette stykke programtilstand. Jeg gav denne klasse navnet clsApp og oprettede en enkelt offentlig forekomst af klassen erklæret med Ny søgeord, så det altid er tilgængeligt.

Eksempelkode

Her er et uddrag fra min clsApp klasse:

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

I et separat standardmodul erklærede jeg en offentlig forekomst af klassen sådan:

Public App As New clsApp

Jeg havde nu en måde at kontrollere status for min ansøgnings skærmmaling. Det eneste krav var, at jeg aldrig ville bruge Application.Echo direkte i nogen af ​​mine koder. Jeg bruger altid App.Echo for at indstille flaget for skærmmaleri nu.

Eksempel på brug

Dette gjorde det muligt for mig at ændre min størrelseskode til denne, som ligner mit Excel-eksempel fra tidligere:

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. Hvordan sammenkædes kolonner i en Postgres SELECT?

  2. Hvorfor og hvornår en LEFT JOIN med betingelse i WHERE-klausulen ikke svarer til den samme LEFT JOIN i ON?

  3. Sådan fungerer SLEEP() i MariaDB

  4. Installation af SQL Server Failover Cluster Instance – Del 1