Condividi tramite

Maschera di sola lettura

Anonimo
2015-08-30T10:29:57+00:00

Ciao a tutti,

ho letto altri post, con soluzioni più complesse per le mie esigenze e non alla mia portata.

Ho una maschera dove all'apertura della stessa ho inserito:

    Me.AllowDeletions = False

    Me.AllowEdits = False

    Me.AllowAdditions = False

per renderla di sola lettura. (un pulsante mi permette di sbloccare/bloccare:  false > true)

E tutto funziona.

Ho alcuni pulsanti, associati a macro, che mi permettono di aprire altre maschere e non rimangono bloccati (Per le mie esigenze risulta essere corretto).

Ho un unico controllo nella mia maschera, un cboBox e vorrei che rimanesse "sbloccato" come i pulsanti appena menzionati. Tale cbobox seleziona dei report. 

Ho provato con : Me.cboReports.Locked = False

subito dopo le istruzioni sopra citate ma il cbobox rimane bloccato impedendomi di aprire i vari report.

Avete una soluzione?

Grazie in anticipo

Sergio

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-09-01T11:54:18+00:00

ciao Sergio,

[...]

confermo che la soluzione di cambiare il tipo di recordset

"...recorsetType, impostandolo a snapshot di default e poi lo si modifica con il command button...."

funziona perfettamente.

bene.

Unico neo che lascia inserire un nuovo nome della cboBox ma senza salvarlo. Potrebbe disorientare l'utilizzatore ma non è importante.

la combo è impostata a solo in elenco e quindi anche se inserisci un valore non presente in elenco non lo inserisci nell'origine dati sottostante.

si potrebbe valutare di gestire l'errore anziché far comparire il messaggio di default di access.

Private Sub Superiore_NotInList(NewData As String, Response As Integer)

If Len(NewData) > 0 Then

    Response = acDataErrContinue

    MsgBox NewData & " non è in elenco e non lo puoi aggiungere", vbCritical, "avviso"

Else

    Response = acDataErrDisplay

End If

End Sub

Avevo trovato anche la soluzione di modificare le proprietà di ogni casella (e anche il mio cboBox) in "bloccato = si " e poi di utilizzare due pulsanti per modificare il suo stato in Bloccato = no".

Procedura lunga, se le caselle sono tante.

non servono due bottoni. Prova a vedere la maschera impiegati, gestisci il tutto con un solo command button ed impostando un ciclo sui controlli decidi quali bloccare e quali no, anche in base al tipo di controllo stesso.

Il sistema che mi hai suggerito è ottimo.

prego, mi fa piacere averti aiutato.

Sergio

ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-08-30T20:29:30+00:00

    ciao Sergio,

    mi è venuta in mente un'altra cosa...

    se la combo box non dovesse essere associata all recordSource della form, ( se apri la maschera impiegati2 in visualizzazione struttura vedi che la combobox superiore ha la dicitura non associato)

    si potrebbe molto banalmente agire sul recorsetType, impostandolo a snapshot di default e poi lo si modifica con il command button.

    se apri la maschera sempre in visualizzazione struttura e guardi la scheda dati della form impiegati2  vedi che ora è snapshot, la form impiegati invece è dynaset.

    Non so però se sei in questo scenario.

    codice  sul command button :

    Option Compare Database

    Option Explicit

    Private bool As Boolean

    Private Sub cmdSet_Click()

    Dim strCaption As String

    bool = Not bool

    If bool Then Me.RecordsetType = 4 Else Me.RecordsetType = 3

    strCaption = IIf(bool, "Sbloccata", "Bloccata")

    MsgBox "Ora sono :" & strCaption

    Me.cmdSet.Caption = strCaption

    End Sub

    demo :http://1drv.ms/1KwaBes sergio2.accdb

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-08-30T16:45:00+00:00

    ciao Sergio,

    credo tu debba lavorare esclusivamente con la proprietà locked ed impostarla a true o false con il command button.

    Le proprietà AllowDeletions, AllowEdits, AllowAdditions lavorano sulla form e non sui singoli controlli, quindi, anche la combo che ti interessa è coinvolta, e nella fattispecie, quando  la allowEdits  è false non la puoi modificare (la combo) ed impostando le proprietà su apertura della form ovviamente resta "bloccata" anch'essa (sempre la combo).

    demo modificata : http://1drv.ms/1MVWSOk sergio.accdb

    spiegazione:

    su caricamento della form :

    Private Sub Form_Load()

    lockedControls Me, True

    End Sub

    lanci la sub lockedControls che agisce sulla form stessa passando true, in modo da bloccare i controlli settando la proprietà locked a true escludendo la combo superiore ( qui ho previsto di bloccare i controlli di eventuali sottomaschera si può eliminare se vuoi...)

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

    Dim ctl As Access.Control

      For Each ctl In frm.Controls

           If ctl.Name <> "superiore" Then

               Select Case ctl.ControlType

                 Case acCheckBox, acComboBox, acListBox, acTextBox, acOptionButton

                     ctl.Locked = bool

                 Case acSubform

                      lockedControls ctl.Form, bool

                End Select

             End If

     Next

    Set ctl = Nothing

    End Sub

    su dopo aggiornamento della combo superiore andrai a salvare il records se la maschera è con i controlli bloccati :

    Private Sub Superiore_AfterUpdate()

    If Me.Dirty And bool = False Then Me.Dirty = Not Me.Dirty

    End Sub

    e su click del command button andrai a bloccare/sbloccare i controlli a seconda del fatto che siano bloccati o sbloccati : se sono bloccati li sblocchi se sono sbloccati li blocchi, modificando la caption del command button per individuare lo status dei controlli.

    Anche qui salvi il record a seconda dello status della form.

    Private Sub cmdSet_Click()

    Dim strCaption As String

    If Me.Dirty Then Me.Dirty = Not Me.Dirty

    lockedControls Me, bool

    bool = Not bool

    strCaption = IIf(bool, "Sbloccata", "Bloccata")

    MsgBox "Ora sono :" & strCaption

    Me.cmdSet.Caption = strCaption

    End Sub

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-08-30T14:56:47+00:00

    Ciao Sandro,

    ho visionato il programma di Fabrizio47.

    Ho provato ad adattare la routine al mio programma ... senza successo.

    Allora, ho provato ad aggiungere l'istruzione:

    Me.Superiore.locked = False

    al programma di Fabrizio per vedere il risultato.

    Ma anche in questo caso, senza risultato. Rimane bloccata la casella "Superiore" senza permettere nessun inserimento o utilizzo della casella.. Solo dopo aver premuto il pulsante si sblocca (Il principio è lo stesso della mia cboBox che seleziona dei reports).

    Sono al punto di partenza.

    Hai qualche altra idea?

    Sei comunque sempre gentilissimo. Grazie

    Sergio

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-08-30T11:10:53+00:00

    ciao Sergio,

    forse qualcosa non va nell'impostazione della proprietà allowEdits...

    prova a vedere questo esempio : http://1drv.ms/1Ky8xhN fabrizio47.accdb.

    non include la proprietà locked, ma puoi provare a gestirla semplicemente digitando me.superiore.locked=true nell'evento click cmdSet_Click per bloccarla ( lo so stai chiedendo di sbloccarla, ma è giusto per farti capire il concetto)

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento