sql >> Databáze >  >> RDS >> Access

VBA Alchymie:Přeměna metod na vlastnosti

Jedním z nejlepších způsobů, jak urychlit provádění kódu v Excelu, je vypnout aktualizaci obrazovky pomocí Application.ScreenUpdating vlastnictví. Totéž můžete provést v Accessu pomocí Application.Echo metoda.

Všimněte si, že verzi aplikace Excel jsem označoval jako vlastnost a verzi Accessu jako metodu . To znamená, že můžeme zkontrolovat stav malování obrazovky v Excelu, ale nemůžeme to udělat v Accessu. To se ukazuje jako důležitý rozdíl.

V knihovně kódů mám několik funkcí, které dočasně vypínají malování obrazovky. Tato technika se obecně nepoužívá k poskytování takového zvýšení výkonu, jaké vidíme v Excelu. Místo toho vylepšuje rozhraní tím, že zabraňuje typu „blikání formuláře“, ke kterému dochází, pokud provedeme rychlé změny vzhledu našich formulářů.

Jednoduchý případ použití

Mám modul třídy, který poskytuje pokročilé funkce pro individuální změnu velikosti ovládacích prvků formuláře při změně velikosti samotného formuláře. Když jsem poprvé vyvíjel tento modul, byl vizuální efekt velmi znepokojivý. Kdykoli byla velikost formuláře změněna, každý jednotlivý ovládací prvek by změnil velikost na obrazovce jeden po druhém.

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

To byl nepříjemný uživatelský zážitek. Abych to zlepšil, vypnul bych aktualizaci obrazovky, provedl změny a na konci funkce aktualizaci obrazovky znovu zapnul.

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

To podstatně zlepšilo uživatelskou zkušenost. Začal jsem používat tuto techniku ​​ve všech svých kódech, které upravovaly uživatelské rozhraní. A tehdy jsem začal narážet na problémy.

Problém nastal, když jsem zavolal více funkcí, které vypínaly malování obrazovky za sebou. První funkce by vypnula malování na obrazovku, provedla změny a pak znovu zapnula malování na obrazovku. Rozhraní by provedlo aktualizaci, pak by druhá funkce znovu vypnula malování na obrazovku, provedla změny a nakonec definitivně znovu zapnula malování obrazovky.

Zachování stavu malby na obrazovce

Lepším způsobem, jak tuto situaci vyřešit, by bylo uložit stav malování obrazovky na začátku rutiny, vypnout malování obrazovky a poté obnovit původní stav malování obrazovky uložený na začátku rutiny. V Excelu to bylo jednoduché:

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

Možná jste si již všimli problému v Accessu. Kód pro zapnutí a vypnutí malování obrazovky v Accessu je metoda, což znamená, že neexistuje způsob, jak zkontrolovat jeho aktuální stav. Psaní kódu jako ve výše uvedeném příkladu není v Accessu možné.

Jak jsem problém vyřešil? Vytvořil jsem modul třídy a zabalil Application.Echo metoda uvnitř vlastnosti třídy. Použil jsem vzor Singleton (aniž bych si uvědomoval, že to v té době bylo) k udržení tohoto stavu programu. Tuto třídu jsem nazval clsApp a vytvořili jednu veřejnou instanci třídy deklarovanou pomocí New klíčové slovo, aby bylo vždy dostupné.

Ukázkový kód

Zde je výňatek z mé clsApp třída:

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

V samostatném standardním modulu jsem deklaroval veřejnou instanci třídy takto:

Public App As New clsApp

Nyní jsem měl způsob, jak zkontrolovat stav malování obrazovky mé aplikace. Jediným požadavkem bylo, že nikdy nebudu používat Application.Echo přímo v libovolném mém kódu. Vždy používám App.Echo abyste nyní nastavili příznak malování obrazovky.

Ukázka použití

To mi umožnilo změnit můj kód pro změnu velikosti na tento, který vypadá hodně jako můj příklad Excelu z dřívějšího:

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. Jak fungují pohledy PostgreSQL security_barrier?

  2. Integrujte Firebase s PHP pro komunikaci v reálném čase

  3. Připojení 64bitové aplikace k Acombě

  4. Připojení Bastion Server k PostgreSQL serveru přes SSH tunel