Function dopo la chiusura di una form\report

di il
12 risposte

Function dopo la chiusura di una form\report

Ho l'esigenza di aprire una maschera alla chiusura di una form\report nel caso in cui nessuna altra form\report siano aperti. Dato che è un'esigenza che si applica a piu form\report vorrei ottenere un codice "generico" che si possa applicare a tutte le situazioni

Per fare questo ho scritto questa function molto semplice:
Function Apri_main()

On Error Resume Next

formAttiva = Screen.ActiveForm.Name
ReportAttivo = Screen.ActiveReport.Name

If formAttiva = "" and ReportAttivo = "" Then DoCmd.OpenForm "Main", acNormal

End function
il problema è come associare questo evento perche "su chiusura" esegue il codice prima della chiusura e quindi non va, mi servirebbe qualcosa per lanciarlo "dopo chiusura"

Come posso fare a fargli eseguire questo codice dopo l'effettiva chiusura della maschera?

12 Risposte

  • Re: Function dopo la chiusura di una form\report

    bean_bandit ha scritto:


    Ho l'esigenza di aprire una maschera alla chiusura di una form\report nel caso in cui nessuna altra form\report siano aperti. Dato che è un'esigenza che si applica a piu form\report vorrei ottenere un codice "generico" che si possa applicare a tutte le situazioni

    Per fare questo ho scritto questa function molto semplice:
    Function Apri_main()
    
    On Error Resume Next
    
    formAttiva = Screen.ActiveForm.Name
    ReportAttivo = Screen.ActiveReport.Name
    
    If formAttiva = "" and ReportAttivo = "" Then DoCmd.OpenForm "Main", acNormal
    
    End function
    il problema è come associare questo evento perche "su chiusura" esegue il codice prima della chiusura e quindi non va, mi servirebbe qualcosa per lanciarlo "dopo chiusura"

    Come posso fare a fargli eseguire questo codice dopo l'effettiva chiusura della maschera?
    Inserisci un pulsante per la chiusura della maschera, il cui codice sarà:
    Private Sub cmdChiudi_Click()
    DoCmd.Close acForm, "NomeDellaTuaMaschera"
    Call Apri_main
    End Sub
  • Re: Function dopo la chiusura di una form\report

    Non mi piace molto come soluzione, ho diverse maschere e report in visualizzazione di stampa e dovrei fare altrettanti pulsanti, mi serve come detto di legare l'evento dopo l'effettiva chiusura della form\report, non esiste nulla di simile?
  • Re: Function dopo la chiusura di una form\report

    Non ho capito nulla...!
  • Re: Function dopo la chiusura di una form\report

    @Alex ha scritto:


    Non ho capito nulla...!
    Semplicemente voglio lanciare una function dopo la chiusura di una form o un report, non su chiusura, ma dopo quando la form\report sono effettivamente chiusi, è possibile?
  • Re: Function dopo la chiusura di una form\report

    bean_bandit ha scritto:


    @Alex ha scritto:


    Non ho capito nulla...!
    Semplicemente voglio lanciare una function dopo la chiusura di una form o un report, non su chiusura, ma dopo quando la form\report sono effettivamente chiusi, è possibile?
    Secondo te, il codice che ti ho postato, cosa fa?
  • Re: Function dopo la chiusura di una form\report

    ettore56 ha scritto:


    bean_bandit ha scritto:


    @Alex ha scritto:


    Non ho capito nulla...!
    Semplicemente voglio lanciare una function dopo la chiusura di una form o un report, non su chiusura, ma dopo quando la form\report sono effettivamente chiusi, è possibile?
    Secondo te, il codice che ti ho postato, cosa fa?
    Forza la chiusura, sicuro sia quello che ha chiesto...?
  • Re: Function dopo la chiusura di una form\report

    bean_bandit ha scritto:


    @Alex ha scritto:


    Non ho capito nulla...!
    Semplicemente voglio lanciare una function dopo la chiusura di una form o un report, non su chiusura, ma dopo quando la form\report sono effettivamente chiusi, è possibile?
    Facciamo una premessa... per rendere questo processo indipendente dall'oggetto(Form/Report) servirebbe che l'oggetto venisse aperto in modalità SINCRONA, questo significa usando il parametro [acDialog].
    In questo modo il codice, dopo l'OPEN si sospende e riprende alla chiusura naturale dell'oggetto stesso.
    Questo è il modo che normalmente si usa.
    
    DoCmd.OpenForm "NomeForm", , , , , acDialog
    ' Quì il codice riprende SOLO dopo la chiusura della Form
    Se questa modalità non dovesse andare bene, ci sono alcune implicazioni grafiche ma di solito non ci si accorge...(ad esempio il Bordo anche se messo assente si visualizza come se fosse POPUP), serve creare una procedura sincrona di attesa... che è meno simpatica
    
    'Nella Funzione chiamante
        DoCmd.OpenForm "NomeForm"
    
        Do
            DoEvents '** VERY important ...
        Loop Until Currentproject.AllForms("NomeForm").IsLoaded
    Ora se vuoi scrivere una Funzione GENERICA, puoi affidarti benissimo ad un minimo di interazione con il VBA...
  • Re: Function dopo la chiusura di una form\report

    @Alex ha scritto:


    ettore56 ha scritto:


    bean_bandit ha scritto:


    Forza la chiusura, sicuro sia quello che ha chiesto...?
    Ciao Alex.
    No, non sono sicuro di avere interpretato correttamente la richiesta, anche perché effettivamente non era molto chiara.
    Ho pensato che volesse semplicemente verificare, dopo la chiusura di una maschera, che non ce ne fossero altre aperte e, in tal caso, volesse procedere con l'apertura di un'altra form.
  • Re: Function dopo la chiusura di una form\report

    ettore56 ha scritto:


    @Alex ha scritto:


    ettore56 ha scritto:


    Forza la chiusura, sicuro sia quello che ha chiesto...?
    Ciao Alex.
    No, non sono sicuro di avere interpretato correttamente la richiesta, anche perché effettivamente non era molto chiara.
    Concordo pienamente, ancora adesso non sono certo di aver capito.

    ettore56 ha scritto:


    Ho pensato che volesse semplicemente verificare, dopo la chiusura di una maschera, che non ce ne fossero altre aperte e, in tal caso, volesse procedere con l'apertura di un'altra form.
    Il tuo codice secondo me va bene per la parte di verifica di eventuali Forms/Reports aperti, ma forza la chiusura mentre, per quanto ho capito io, la verifica deve essere fatta in autonomia su ogni chiusura di Form o Report...
    Quindi va bene quello che hai proposto va modificato, su evento Close di Ogni Form/Report si deve chiamare una Function Public che fa quel lavoro...!

    Personalmente andrei a controllare la Collection Forms e Reports che espongono la proprietà Count, che come si sa essendo una Collection di Oggetti istanziati, contiene solo il Numero delle Form Aperte.
    
    Function OpenDefault()
        If Forms.Count=0 And Reports.Count=0 then
            Docmd.OpenForm "DefaultForm"
        End if
    End Function
    Su Evento Close di ogni Form/Report scrive
    
    =OpenDefault()
  • Re: Function dopo la chiusura di una form\report

    @Alex ha scritto:


    Facciamo una premessa... per rendere questo processo indipendente dall'oggetto(Form/Report) servirebbe che l'oggetto venisse aperto in modalità SINCRONA, questo significa usando il parametro [acDialog]. [...]
    Alla fine ho optato per questa soluzione perche andare a cambiare la modalita di apertura di tutte le form e report non so quanto mi conveniva.
    In ogni caso la lascio la mia soluzione per chi dovesse trovarsi in una situazione analoga alla mia, chiaramente va bene per aggirare questo problema nel caso si debba poi eseguire un codice che richiede effettivamente la chiusura :
    Function Apri_main()
    
    On Error Resume Next
    
    '*** Verifico le form aperte
    Dim FormAperte As Form
    FormAttiva = Screen.ActiveForm.Name
        
    For Each FormAperte In Forms
        If FormAperte.Name <> FormAttiva Then Exit Function
    Next FormAperte
    
    '*** Verifico i report aperti
    Dim ReportAperto As Report
        
    ReportAttivo = Screen.ActiveReport.Name
        
    For Each ReportAperto In Reports
        If ReportAperto.Name <> ReportAttivo Then Exit Function
    Next ReportAperto
    
    '*** Apro il Main Menu
    DoCmd.OpenForm "Main", acNormal
    
    End Function
    In questo modo pur legando la function all'evento "su chiusura" escludo dalle form\report aperti quello che sto chiudendo e controllo se c'è ne sono altri aperti.

    @ettore56 ha scritto:


    Secondo te, il codice che ti ho postato, cosa fa?
    Come ti ho detto non voglio passare da un pulsante e volevo poter eseguire un codice dopo la chiusura della form, visto quello che comportava farlo ho preferito avendone la possibilità ripiegare sul metodo che ho indicato.
  • Re: Function dopo la chiusura di una form\report

    Non serve a nulla quello che hai fatto...!!!!! (tralascio commenti su [On Error Resume Next])
    Cerca di ragionare, perchè fai un ciclo...?

    Se la Collection Forms o Reports ha più di 1 Elemento di certo ci sono altre Forms/Reports oltre a quella che chiudi...!!!!
    
    Function Apri_main()
        Dim nOggetti    As Integer
        Dim mObj        As Object
        Set mObj = Application.CodeContextObject
        If TypeOf mObj Is Form Then
            nOggetti = Forms.Count - 1 + Reports.Count
        Elseif TypeOf mObj is Report Then
            nOggetti = Forms.Count + Reports.Count - 1
        End If
        If nOggetti = 0 Then
            DoCmd.OpenForm "Main", acNormal
        End If
    End Function
  • Re: Function dopo la chiusura di una form\report

    @Alex ha scritto:


    ettore56 ha scritto:


    @Alex ha scritto:


    ettore56 ha scritto:


    Il tuo codice secondo me va bene per la parte di verifica di eventuali Forms/Reports aperti, ma forza la chiusura mentre, per quanto ho capito io, la verifica deve essere fatta in autonomia su ogni chiusura di Form o Report...
    Quindi va bene quello che hai proposto va modificato, su evento Close di Ogni Form/Report si deve chiamare una Function Public che fa quel lavoro...!
    Personalmente andrei a controllare la Collection Forms e Reports che espongono la proprietà Count, che come si sa essendo una Collection di Oggetti istanziati, contiene solo il Numero delle Form Aperte.
    
    Function OpenDefault()
        If Forms.Count=0 And Reports.Count=0 then
            Docmd.OpenForm "DefaultForm"
        End if
    End Function
    Su Evento Close di ogni Form/Report scrive
    
    =OpenDefault()
    Validissima soluzione alternativa.
Devi accedere o registrarti per scrivere nel forum
12 risposte