Creare una funzione da utilizzare in tutto il Db di Access 2010 creato che mi blocchi e sblocchi i controlli sia sulle maschere che sulle sottomaschere collegate.

Anonimo
2015-05-06T09:41:50+00:00

Buongiorno a tutti gli amici della community, avrei bisogno di creare una funzione pubblica da usare il tutto il progetto di Access 2010 che mi blocchi e sblocchi i vari controlli ( sono solo TEXTBOX,COMBOBOX,LABEL, COMMANDBUTTON e LISTBOX) in tutte le maschere e le sottomaschere create. In rete ho letto di effettuare un ciclo segnando con un carattere particolare il TAG di ogni controllo, ho letto pure  di questo Me.AllowEdits = False.

Il mio DB è gia in uso da 3 utenti ed in rete, a voi chiedo il consiglio ed il codice migliore per poter ottenere quanto vi chiedo gentilmente.

Datemi per favore un consiglio e uno spunto di partenza scegliendo in base alla mia esigenza se è più funzionale  e valido effetture un ciclo sui controlli oppure altra soluzione.

Attendo fiducioso un vostro aiuto.

Ciao Nicola.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-05-11T07:49:57+00:00

ciao Nicola,

la domanda era legata al datatype se associato o no...

Comunque...per rendere maggiormente fruibile il codice da tutte le forms e evitare ridondanze, crea due moduli di classe. ho bastao il tutto sugli esempi suggeriti in precedenza e non sul  tuo  db, credo sia facile per te adattarli.

uno chiamato clsControls:

Sub setCtrl(ByVal frm As Access.Form, ByVal bool As Boolean)

Dim ctl As Access.control

For Each ctl In frm.Controls

     Select Case ctl.controlType

      Case acCheckBox, acComboBox, acListBox, acTextBox, acOptionButton

       If ctl.Name <> "checkLocks" Then

            ctl.Locked = Not bool

       End If

       Case acSubform

            'checkBondeded ctl.Form, bool

            setCtrl ctl.Form, bool

    End Select

Next

Set ctl = Nothing

End Sub

un altro chiamato clsWithEvents con questo codice:

Option Compare Database

Option Explicit

Private WithEvents frm As Access.Form

Private WithEvents chk As Access.CheckBox

Private p_frm As clsControls

'

Public Property Set Form(frmCalling As Access.Form)

Set frm = frmCalling

End Property

Public Property Set chekbox(chkCalling As Access.CheckBox)

Set chk = chkCalling

End Property

Private Sub chk_Click()

p_frm.setCtrl frm, chk.Value

End Sub

Private Sub Class_Initialize()

Set p_frm = New clsControls

End Sub

Private Sub Class_Terminate()

Set p_frm = Nothing

Set frm = Nothing

Set chk = Nothing

End Sub

Private Sub frm_Load()

p_frm.setCtrl frm, chk.Value

End Sub

nella maschera in cui hai bisogno di attivare la procedure istanzi le classi e guidi, per così dire gli eventi... :

Option Compare Database

Option Explicit

Private e_ctl As New clsWithEvents

'

Private Sub checkLocks_Click()

Me.checkLocks.OnClick = "[event procedure]"

End Sub

Private Sub Form_Close()

Me.OnClose = "[event procedure]"

Set e_ctl = Nothing

End Sub

Private Sub Form_Open(Cancel As Integer)

Set e_ctl.Form = Me

Set e_ctl.chekbox = Me.checkLocks

Me.OnLoad = "[event procedure]"

End Sub

in questo modo demandi alle classi tutto il lavoro, non generi codice ridondante e il codice nelle forms si riduce davvero a poche righe....

questo l'esempio :  http://1drv.ms/1EvlB40  bloccoNicola5.accdb.

ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-05-06T12:14:38+00:00

    Ciao Sandro, ciao Mimmo, innanzitutto grazie per il vostro gentile e prezioso intervento.

    Per Mimmo: io in realtà ho pensato (dopo la creazione della Sub o Function di blocco e sblocco dei controlli) di inserire il codice nel pulsante di creazione nuovo record, Annulla  e Salva cosi come mi consigli tu, oppure inserire il codice di blocco di tutti i controlli all'apertura della maschera e sottomaschera d'interesse per poi sbloccarli con pulsanti di comando  che fanno questo. 

    Per Sandro: ho impostato secondo le tue indicazioni il codice che ti posto ma compare questo messaggio di errore: errore di compilazione argomento non facoltativo, come risolverlo?

     Ho richiamato la Sub da un pulsante di comando che dovrebbe bloccarmi i controlli della maschera e della sottomaschera in argomento in queso modo: Call blocca_controlli

    'Blocca Maschera --------------

     Sub blocca_controlli(mask)

    Dim Valore

    Dim ctl As Object

    'questo valore può anche estrapolato da un altra tabella/controllo

    'e serve per attivare la presenza o no dei pulsanti di modifica sulle maschere,

    'ad esempio io lo prelevo da una tabella chiamata SETUP

    'Valore= -1 pulsante visibile e maschera bloccata,

    'Valore=0 pulsante invisibile e maschera sbloccata.

    Valore = -1

    Forms(FrmFinanziarie).AllowEdits = Not (Valore)

    ' blocca anche ogni sottomaschera

    For Each ctl In Forms(FrmFinanziarie).Controls

        'Debug.Print ctl.Name

        If ctl.ControlType = acSubform Then

            Forms(FrmIndirizzo).Form(ctl.Name).Locked = Valore

        End If

    Next ctl

    End Sub

    P.S. FrmFinanziarie è la maschera principale e FrmIndirizzo è la sottomaschera collegata.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-05-06T11:14:17+00:00

    Ciao Nicola,

    normalmente io mi limito a disabilitare solo il pulsante di aggiornamento previsto dalle maschere di inserimento/aggiornamento avendo l'accortezza di disattivare il pulsante di chiusura. In definitiva con questo rendo la maschera di sola visualizzazione a fronte di certe condizione (es. utente non abilitato, fattura consolidata ecc..).

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-05-06T11:01:13+00:00

    Ciao Nicola,

    alla funzione o meglio solo sub secondo me devi passare il parametro della form.

    in pratica mask deve essere l'oggetto form su cui agire.

    affinché agisca anche sulla sub form se presente devi richiamarla in modo ricorsivo passando la subform.

    Oltre al blocco devi prevedere anche lo svolgimento sblocco...

    prova a vedere se con queste indicazioni riesci a modificare la routine.

    facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-05-06T09:51:59+00:00

    Allego il codice che ho trovato in rete ma non so per quale motivo non blocca nulla sia sulla maschera che sulla sottomaschera collegata.

    Mi spiegate il motivo di questo problema per favore.

    Vi saluto e vi ringrazio per l'aiuto che vorrete darmi.

     'Blocca Maschera --------------

    Public Function bloccaon(mask)

    Dim Valore

    Dim ctl As Object

    'questo valore può anche estrapolato da un altra tabella/controllo

    'e serve per attivare la presenza o no dei pulsanti di modifica sulle maschere,

    'ad esempio io lo prelevo da una tabella chiamata SETUP

    'Valore= -1 pulsante visibile e maschera bloccata,

    'Valore=0 pulsante invisibile e maschera sbloccata.

    Valore = -1

    Forms(mask).AllowEdits = Not (Valore)

    ' blocca anche ogni sottomaschera

    For Each ctl In Forms(mask).Controls

        'Debug.Print ctl.Name

        If ctl.ControlType = acSubform Then

            Forms(mask).Form(ctl.Name).Locked = Valore

        End If

    Next ctl

    End Function

    La risposta è stata utile?

    0 commenti Nessun commento