Access
 sql >> Teknologi Basis Data >  >> RDS >> Access

Alkimia VBA:Mengubah Metode Menjadi Properti

Salah satu cara terbaik untuk mempercepat eksekusi kode di Excel adalah dengan mematikan pembaruan layar menggunakan Application.ScreenUpdating Properti. Anda dapat melakukan hal yang sama di Access dengan menggunakan Application.Echo metode.

Perhatikan bahwa saya menyebut versi Excel sebagai properti dan versi Access sebagai metode . Itu berarti kita bisa memeriksa status lukisan layar di Excel, tapi kita tidak bisa melakukannya di Access. Ini ternyata menjadi perbedaan penting.

Saya memiliki beberapa fungsi di perpustakaan kode saya yang untuk sementara mematikan lukisan layar. Teknik ini umumnya tidak digunakan untuk memberikan semacam peningkatan kinerja yang kita lihat di Excel. Sebaliknya, ini meningkatkan antarmuka dengan mencegah jenis "flashing formulir" yang terjadi jika kita membuat perubahan cepat pada tampilan formulir kita.

Kasus penggunaan sederhana

Saya memiliki modul kelas yang menyediakan fitur-fitur canggih untuk mengubah ukuran kontrol formulir secara individual ketika formulir itu sendiri diubah ukurannya. Ketika saya pertama kali mengembangkan modul ini, efek visualnya sangat mengganggu. Setiap kali formulir diubah ukurannya, setiap kontrol individu akan mengubah ukuran di layar satu per satu.

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

Ini adalah pengalaman pengguna yang mengejutkan. Untuk memperbaikinya, saya akan mematikan pembaruan layar, membuat perubahan, lalu menghidupkan kembali pembaruan layar di akhir fungsi.

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

Ini meningkatkan pengalaman pengguna secara substansial. Saya mulai menggunakan teknik ini di semua kode saya yang memodifikasi antarmuka pengguna. Dan saat itulah saya mulai mengalami masalah.

Masalahnya muncul ketika saya akan memanggil beberapa fungsi yang mematikan lukisan layar berturut-turut. Fungsi pertama akan mematikan lukisan layar, membuat perubahan, lalu menghidupkan kembali lukisan layar. Antarmuka akan mem-flash pembaruannya, kemudian fungsi kedua akan mematikan lukisan layar lagi, membuat perubahan, dan akhirnya menghidupkan kembali lukisan layar untuk selamanya.

Menjaga status lukisan layar

Cara yang lebih baik untuk menangani situasi ini adalah dengan menyimpan status pengecatan layar di awal rutinitas, mematikan pengecatan layar, lalu mengembalikan status pengecatan layar asli yang disimpan di awal rutinitas. Di Excel, ini sangat mudah:

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

Mungkin Anda sudah melihat masalah di Access. Kode untuk menghidupkan dan mematikan lukisan layar di Access adalah metode, yang berarti tidak ada cara untuk memeriksa statusnya saat ini. Menulis kode seperti contoh di atas tidak mungkin dilakukan di Access.

Bagaimana saya menangani masalah tersebut? Saya membuat modul kelas dan membungkus Application.Echo metode di dalam properti kelas. Saya menggunakan pola Singleton (tanpa menyadarinya saat itu) untuk mempertahankan status program ini. Saya menamai kelas ini clsApp dan membuat satu instance publik dari kelas yang dideklarasikan dengan Baru kata kunci agar selalu tersedia.

Contoh kode

Berikut adalah kutipan dari clsApp saya kelas:

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

Dalam modul standar terpisah, saya mendeklarasikan instance publik dari kelas seperti ini:

Public App As New clsApp

Saya sekarang memiliki cara untuk memeriksa status lukisan layar aplikasi saya. Satu-satunya persyaratan adalah saya tidak akan pernah menggunakan Application.Echo langsung di salah satu kode saya. Saya selalu menggunakan App.Echo untuk mengatur bendera lukisan layar sekarang.

Contoh penggunaan

Ini memungkinkan saya untuk mengubah kode pengubahan ukuran menjadi ini, yang sangat mirip dengan contoh Excel saya sebelumnya:

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. Cara Mengenkripsi Basis Data Terpisah di Access 2016

  2. Atur ulang TreeView Nodes dengan Drag and Drop

  3. Cara Membuka Tabel di Design View di Microsoft Access

  4. Cara Mengekspor Daftar Tabel Tertaut ke Excel dari Access 2016

  5. Bagaimana Profesional Real Estat Dapat Menggunakan Microsoft Access