Riferimento a NomeMaschera in una maschera di spostamento

di il
7 risposte

Riferimento a NomeMaschera in una maschera di spostamento

Buona sera e salve a tutti.

la cosa forse sarà bannale ma da due giorni che ci sbatto la testa.

ho un database con diverse maschere e sto cercando di inglobarle in una maschera di spostamento.

Tutto funziona nelle singole maschere; Inserendo le singole maschere nei pulsanti di spostamento, nel riferirsi alla singola maschera bisogna cambiare il Riferimento alla maschera da “NomeMaschera” a  “SottomascheraSpostamento”, questo perche access crea l'oggetto contenitore automaticamente con questo nome.!

cosi facendo, ho sempre cambiato

Me.NomeMiaMaschera.NomeControllo

in

Forms!MenuM!SottomascheraSpostamento.Form.NomeControllo…etc etc…

Ora il mio problema e Che devo passare “il Nome della maschera Singola ad una Function, che mi fa dei cicli nelle varie maschere, evitandomi di scrivere tanto codice,

scrivo solo come esempio.

Call CheckControlli(Me.FormName, "v", "Locked", "True")

 quindi dalla sottomascheraSpostamento devo passare alla function il Nome che ora ha la maschera, ma non ci riesco. le ho provate tutte ma, non trovo il modo.

Gradirei qualche suggerimento. 

Grazie

Sotto il codice della function


Function CheckControlli(StrForm As String, StrTag As String, StrProp As String, BolValue As Boolean)
 On Error GoTo Err_GestioneErrori
    Dim Ctrl As Control
    For Each Ctrl In Forms(StrForm).Controls
        Select Case StrProp
        Case "Enabled"
            If Ctrl.tag = StrTag Then Ctrl.Enabled = BolValue
        Case "Visible"
            If Ctrl.tag = StrTag Then Ctrl.Visible = BolValue
        Case "Locked"
            If Ctrl.tag = StrTag Then Ctrl.Locked = BolValue
        End Select
    Next
Exit_GestioneErrori:
    Exit Function
Err_GestioneErrori:
    Select Case Err.Number
    Case Else
        MsgBox "Attenzione.!!!" & vbCrLf & vbCrLf & "Errore nº     : " & Err.Number & vbCrLf & vbCrLf & "Descrizione : " & Err.Description, 48, " Errore"
    End Select
    Resume Exit_GestioneErrori
End Function

7 Risposte

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    Maschera, sottomaschera, controllo sottomaschera… sembra un accanimento in questi giorni. Ma quelli sono affari miei.

    Dove scrivi la chiamata alla funzione? In teoria non cambia niente se la chiami dall'interno di una maschera, quella vera che sta dentro il controllo sottomaschera. Dà errore adesso che hai creato la maschera di spostamento? Perché Me.FormName? è una (immagino) casella di testo con il nome di una maschera specifica? 

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    Grazie dell'interesse…

    (chiamiamo le cose per nome)… hai ragione

    La funzione la chiamo  con il nome maschera (“DaSaldareM”) oppure la chiamo Me.FormName, sempre da dentro la maschera.

    se la chiamo da dentro la maschera Me.FormName e lo stesso che se la chiamo per il suo vero nome.

    Private Sub Form_Load()
    Call CheckControlli("DaSaldareM", "b", "Locked", "True")
    End Sub		
    'oppure
    Private Sub Form_Load()
    Call CheckControlli(Me.formName, "b", "Locked", "True")
    End Sub		

    ora, se vado ad aprirla dentro la maschera di spostamento, mi da “errore 2450 - Impossibile trovare la maschera ”DaSaldareM"

    giustamente perche si aspetta che la chiami per nome e cognome, in questo caso sarebbe:

    Private Sub Form_Load()
    Call CheckControlli(Forms!MenuM!SottomascheraSpostamento.Form.FormName, "b", "Locked", "True")
    End Sub

    se provo nella finestra immediata mi restituisce il nome della maschera, ma come vedi non funziona

    ?Forms!MenuM!SottomascheraSpostamento.Form.FormName
    DaSaldareM
    ?Forms!MenuM!SottomascheraSpostamento.Form.DaSaldareM

     mi da errore 2450 - impossibile trovare la maschera “DaSaldareM”

    allora, ho pensato che volesse la stringa, quindi se messa nella finestra immediata, fra virgolette:

    ?"Forms!MenuM!SottomascheraSpostamento.Form.FormName"
    Forms!MenuM!SottomascheraSpostamento.Form.FormName

    ma comunque data in pasto alla funzione, mi da errore: errore 2450 - impossibile trovare la maschera…

    Private Sub Form_Load()
    Call CheckControlli("Forms!MenuM!SottomascheraSpostamento.Form.FormName", "b", "Locked", "True")
    End Sub

    Come vedi sto impazzendo…

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    21/10/2024 - Philcattivocarattere ha scritto:

    (chiamiamo le cose per nome)… hai ragione

    Ah, se è per quello che ho scritto nella prima riga della risposta precedente, non farci caso, non era riferita al te o al thread, è che in questo periodo sono a contatto continuo con l'argomento. Penso sempre che tutti capiscano quello che penso o scrivo.

    Andando al sodo. FormName non esiste, quindi è una proprietà che hai creato tu o è un controllo che si chiama FormName e che contiene il nome della maschera. Per usare quella funzione la maschera sulla quale vuoi agire deve essere aperta, altrimenti non la troverà mai nella collection Forms e a te serve che sia lì, vista la riga

    For Each Ctrl In Forms(StrForm).Controls

    Ecco, a tal proposito, è qui che si ferma con l'errore segnalato? Ah, no, hai la gestione degli errori quindi vedi solo il messaggio e non il punto in cui si verifica. Commenta le righe della gestione degli errori nella funzione CheckControlli così sappiamo dove è il problema anche se penso che la riga incriminata sia quella scritta sopra.

    Secondo me sta tutto nel fatto che la maschera non è aperta, né autonomamente né come sottomaschera. Il nome da usare, poi, è indipenente dalle strutture varie. A meno che non lanci la funzione da vari punti e la sua esecuzione deve prendere in considerazione una maschera ben specifica ma relativa alla posizione in cui ci si trova, Se ho una maschera che si chiama “MascheraUno”, la troverò sempre se la cerco con Forms("MascheraUno"), purché ovviamente sia aperta, indipendemente dal fatto che sia aperta come maschera autonoma, come sottomaschera o sotto-sottomaschera e chi più ne ha più ne metta.

    Lancia questa funzione e guarda i risultati nella finestra immediata

    Public Function ElencaMaschere()
        Dim i As Integer
        With Application.CurrentProject.AllForms
            For i = 0 To .Count - 1
                Debug.Print i & " = " & .Item(i).Name
            Next
        End With
    End Function

    Questi sono gli unici nomi che puoi usare. Appurato se è un errore di nome o del fatto che la maschera non era aperta, poi vediamo di tarare l'eventuale riferimento relativo. E magari passare a CheckControlli non tanto il nome della maschera quanto l'oggetto.

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    Mmmmmmm….

    se chiamo la function dalla form stessa, e perche è gia aperta, certo se la form e fuori della maschera di spostamento imposto come nome form “Me.Form.Name” cioe il nome della mia form dove sto lavorando e chiamando la function.

    Avevo scritto Me.formName,invece è Me.form.name, e mi scuso, non ho di sicuro nessun controllo con quel nome!

    il nome della maschera DaSaldareM e corretto, e non c'è nelle altre maschere che possa generare confusione.

    ora mi viene un dubbio se la function deve ricevere il nome della Maschera!Sottomaschera come stringa in forms(NomeMaschera), deve arrivare il nome come forma di: Forms!MenuM!SottomascheraSpostamento….altro

    oppure  senza l'inizio forms! e cioè: MenuM!SottomascheraSpostamento….altro?

    oppure generare una variabile tipo NomeMaschera =Forms!MenuM!SottomascheraSpostamento….altro, e nella chiamata alla function inserire la variabile: NomeMaschera?

    infatti penso pure io che la riga:

    For Each Ctrl In Forms(StrForm).Controls

    sia quella incriminata….e scritta male? mi correggo, ce' altro modo pre chiedere il nome della form?

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    Quando si scrive una Funzione che deve essere richiamabile da tutte le Form, non si passa il nome della Form…!!!

    CodeContextObject è un oggetto molto interessante, se si mette la funzione in un modulo e viene chiamata dalla Form, CodeContextObject è l'oggetto chiamante, quindi la Form.

    Sotto la modifica del codice…

    Function CheckControlli(StrTag As String, StrProp As String, BolValue As Boolean)
     On Error GoTo Err_GestioneErrori
        Dim Ctrl As Access.Control
        Dim frm	As Access.Form
     
        Set frm	= Application.CodeContextObject
        If frm Is Nothing Then Exit Function
    
        For Each Ctrl In frm .Controls
            Select Case StrProp
            	Case "Enabled"
                	If Ctrl.tag = StrTag Then Ctrl.Enabled = BolValue
            	Case "Visible"
                	If Ctrl.tag = StrTag Then Ctrl.Visible = BolValue
            	Case "Locked"
                	If Ctrl.tag = StrTag Then Ctrl.Locked = BolValue
            End Select
        Next
    Exit_GestioneErrori:
        Exit Function
    Err_GestioneErrori:
        Select Case Err.Number
        	Case Else
            	MsgBox "Attenzione.!!!" & vbCrLf & vbCrLf & "Errore nº     : " & Err.Number & vbCrLf & vbCrLf & "Descrizione : " & Err.Description, 48, " Errore"
        	End Select
        Resume Exit_GestioneErrori
    End Function

    Non ho ben compreso se il TAG passato poi sia quello del controllo attivo… anche li… altre considerazioni

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    Eccolo, grazie.

    come credevo non era un problema di riferimenti, ma la function.

    No; il tag, non necessariamente e quello al momento della chiamata quello attivo.

    esempio: voglio aprire una form che nasconda all'apertura certi controlli, oppure a seconda delle scelte fate, ne nasconda, blocchi o visualizzi altri….

    come fa la function, blocca/sblocca, abilita/disabilita, nascondi/scopri….

    funziona perfettamente, e non sai quante righe di codice mi risparmio di scrivere!!!

    come sempre sei di grande aiuto!!!!

    Sarei curioso di sentire quello che accennavi sul tag del controllo attivo o meno.

    dopo di che potremmo chiudere il post come RISOLTO.

  • Re: Riferimento a NomeMaschera in una maschera di spostamento

    21/10/2024 - Sarri ha scritto:


    Sarei curioso di sentire quello che accennavi sul tag del controllo attivo o meno.

    dopo di che potremmo chiudere il post come RISOLTO.

    Se il Controllo non è solo quello attivo ma un gruppo allora così può andare.

    Nel caso i gruppi di controlli abbiano logiche definite, una ulteriore possibilità è quella di usare il Controllo a Schede come Container(uno per ogni Gruppo di controlli), impostandolo come SINGOLA PAGINA.

    In questo modo ti basta VISUALIZZARE o meno il il Controllo a schede senza ciclare tutti i controlli, chiaramente questa opzione si usa se i controlli sono tanti e se graficamente la gestione è fissa.

Devi accedere o registrarti per scrivere nel forum
7 risposte