ciao Mirax55,
secondo me, la soluzione migliore, se i controlli sono tanti, e se si vuole che il cambio colore possa essere flessibile e trasversale su tutte le forms del db, è bene appoggiarsi ad una o meglio due classi che gestiscano il cambio colore in base all'oggetto
in cui si trova il focus.
Il tutto caricando i controlli in una collections ereditando proprietà ed eventi, per questi ultimi l'evento onGotFocus e onLostFocus.
Il codice della form resta quasi nullo e si demanda alle classi il lavoro del cambio colore.
Certo, forse un po' complicata, ma per certo efficiente.
Prova come segue:
su caricamento della form in cui desideri il cambio colore, istanzi la classe
clsControls e su scaricamento la distruggi :
Option Compare Database
Option Explicit
Private clsStart As clsControls
Private Sub Form_Load()
Set clsStart = New clsControls
clsStart.kickoff frm:=Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set clsStart = Nothing
End Sub
crea un modulo di classe chiamandolo clsControls, mi raccomando al nome scrivilo esattamente come indicato e copi/incolli il codice che segue :
Option Compare Database
Option Explicit
Private objCtl As clsControl
Private col
As VBA.Collection
Public Sub kickoff(ByVal frm As Access.Form)
Dim iCtl
As clsControl
Dim ctl
As Access.Control
For Each ctl In frm.Controls
If TypeName(ctl) = "textBox" Or TypeName(ctl) = "combobox" Then
Set iCtl = New clsControl
iCtl.populate ctl
col.Add iCtl, ctl.Name
End If
Next
Set iCtl = Nothing
Set ctl = Nothing
End Sub
Private Sub Class_Initialize()
Set col = New VBA.Collection
End Sub
Private Sub Class_Terminate()
Set col = New VBA.Collection
End Sub
crei una nuova classe e la chiami clsControl, come prima occhio al nome salva la classe come indicato e copia incolla il codice che segue :
Option Compare Database
Option Explicit
Private WithEvents mytxt
As Access.TextBox
Private WithEvents myCbo
As Access.ComboBox
Private Const defaultBackcolor As Long = 16777215
Public Sub populate(ByVal ctl As Access.Control)
Select Case TypeName(ctl)
Case "ComboBox"
Set myCbo = ctl
myCbo.OnGotFocus = "[Event Procedure]"
myCbo.OnLostFocus = "[Event Procedure]"
Case "textBox"
Set mytxt = ctl
mytxt.OnGotFocus = "[Event Procedure]"
mytxt.OnLostFocus = "[Event Procedure]"
End Select
End Sub
Private Sub Class_Terminate()
Set myCbo = Nothing
Set mytxt = Nothing
End Sub
Private Sub myCbo_GotFocus()
myCbo.BackColor = vbYellow
End Sub
Private Sub myCbo_LostFocus()
myCbo.BackColor = defaultBackcolor
End Sub
Private Sub mytxt_GotFocus()
mytxt.BackColor = vbGreen
End Sub
Private Sub mytxt_LostFocus()
mytxt.BackColor = defaultBackcolor
End Sub
Ancora, i due moduli devono essere moduli di classe.
Ora al cambio del focus, evidenzierai la textbox con il colore verde e la combo con il colore giallo, ovviamente se non ti piacciono cambia pure i colori con quelli che più ti piacciono.
Come dicevo, per applicare lo stesso comportamenti circa i colori basti che istanzi la classe clsControls nelle varie forms della tua applicazione.




Facci sapere.
ciao, Sandro.