Newsgroup: it.comp.appl.access
Titolo: Cambiare stile su controllo attivo

 
          Ciao a tutti,
Ho una maschera di inserimento dati con una serie di controlli.
Vorrei che quando vado a posizionare il cursore sul controllo, lo sfondo
cambiasse e il contenuto fosse visualizzato in grassetto e interamente in
maiuscolo..
Esisterebbe un modo "una tantum" per creare questo effetto?perche nella
maschera i controlli son parecchi,una trentina..
Grazie mille...
Ciao ludo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Una soluzione automatica non c'č.
Potresti perň facilitarti la vita scrivendo due funzioni che vanno bene per 
tutti i controlli e da applicare quando il controllo riceve il focus e 
quando lo perde. Per esempio:
Private Sub ImpostaFormato(CC As Control)
With CC
.BackColor = 255
.ForeColor = 0
.FontWeight = 700
.Value = StrConv(CC.Value, vbUpperCase)
End With
End Sub
Da chiamare quando il campo per esempio ID riceve il focus:
Private Sub ID_GotFocus()
Call ImpostaFormato(Forms!MSQAbi!ID)
End Sub
Private Sub RipristinaFormato(CC As Control)
With CC
.BackColor = -
2147483643
.ForeColor = 0
.FontWeight = 400
End With
End Sub
Da chiamare quando il campo ID perde il focus e ne ristabilisce lo stile:
Private Sub ID_LostFocus()
Call RipristinaFormato(Forms!MSQAbi!ID)
End Sub
In pratica per ciscun controllo e sugli eventi GotFocus e LostFocus dovrai 
scrivere:
Call ImpostaFormato(Forms!TuaForms!TuoControllo)
e
Call RipristinaFormato(Forms!TuaForms!TuoControllo)
Di piů non sň.
Ciao, Carlo

Oltre al suggerimento di Carlo, per complicarti un pò la cosa potresti
farlo con
una Classe.
Su evento Load della Form iterando l'insieme Controls istanzi tante
Classi
quanti sono i controlli da gestire.
Nella Classe dichiarata WithEvents una variabile Oggetto di tipo
TextBox
della quale applichi gli eventi e li gestisci.
Gli eventi sono sempre quelli che ti ha suggerito Carlo.
Sembra complesso ma è estremamente semplice e ti consente di
realizzare la cosa scrivendo poche righe di codice su Load della
Form.
Il vantaggio è che puoi applicarlo a tutte le Form che vuoi scrivendo
solo
la parte di gestione dei controlli inserita nel Load e centralizzando
in questo modo la gestione degli effetti.
Un Esempio:
A livello di Modulo di Form:
Private cTBox          As clsTextBox
Private colControls   As New Collection       ' Collection delle nostre
Classi
Private Sub Form_Load()
   Dim ctl as Access.Control
   For Each ctl In Me.Control
           Select Case ctl.ControlType
                      Case acTextBox
                              Set cTBox = New clsTextBox
                              cTBox.SetControl ctl
                              colControls.Add cTBox
                              Set cTBox = Nothing
           End Select
   Next
End Sub
Private Sub Form_Unload(Cancel as Integer)
  Set colControls=Nothing
End Sub
Ora crea una Classe(chiamata  [clsTextBox]) in cui servirà la gestione
del Metodo "SetControl"
Private WithEvents mC as Access.TextBox
Public Sub SetControl(ctl as Access.Control)
     Set mC=ctl
     mC.GotFocus="[Event Procedure]"
     mC.LostFocus="[Event Procedure]"
End Sub
Private Sub mC_LostFocus()
  With mC
     .BackColor = -
2147483643
     .ForeColor = 0
     .FontWeight = 400
  End With
End Sub
Private Sub mC_GotFocus()
  With mC
    .BackColor = 255
    .ForeColor = 0
    .FontWeight = 700
    .Value = StrConv(CC.Value, vbUpperCase)
  End With
End Sub
Ho buttato giù un pò di codice a braccio ma la metodologia è
questa ed è estremamente solida e funzionale, purtroppo non è
così consueto l'utilizzo delle Classi per gli Accessisti, quindi
potrebbe
risultare un pò ostico da comprendere.
@Alex

@Alex
Molto professionale...e si vede che č a braccio.
Alcune inesattezze:
mC.OnGotFocus = "[Event Procedure]"
mC.OnLostFocus = "[Event Procedure]"
al posto di
mC.GotFocus="[Event Procedure]"
mC.LostFocus="[Event Procedure]"
e
For Each ctl In Me.Controls
al posto di
For Each ctl In Me.Control
Ciao, Carlo

Perfetto...!
Grazie Carlo per le correzioni, in effetti non ho avuto assolutamente
modo
di provarlo, ma ho solo buttao li un'idea.
In realtà la cosa più semplice sarebbe usare 2 Classi, con la prima
passando l'oggetto Form come riferimento gestire l'istanza della 2°.
In questo modo si ridurrebbe ad una sola riga nell'evento Load il
codice
da inserire nelle Form oltre ovviamente l'istanza della Classe
principale.
Se mi rimane un pò di tempo butto giù un Demo da aggiungere alla
sezione General dove ho inserito 2 demo(abbastanza complessi) sulle
classi.
@Alex

principale.
Certamente e sarebbe così applicabile a tutte le maschere con meno spreco di 
energie.
Andrebbe inoltre implementata una gestione degli errori perchè, per esempio, 
i controlli numerici si arrabbierebbero per una funzione che imposta a 
maiusculo o minuscolo il loro carattere...
Ciao, Carlo

Già...!
Ho pubblicato ora un DEMO molto semplificato proprio di quanto
detto.
http://www.mantuanet.it/alessandro.baraldi/
2.3 Formattazione del DataEntry(uso semplice Classi)
Se dai uno sguardo a questo potrebbe anche piacerti:
2.2 Validazione DataEntry(uso avanzato Classi) 
 
Ciao
@Alex