Sottomaschere continue sovrapposte

di il
8 risposte

Sottomaschere continue sovrapposte

Ciao a tutti,
ho un db con una maschera principale che contiene due sottomaschere continue.
In particolare la subform1 è molto larga e utilizziamo la barra di scorrimento orizzontale per visualizzare ed editare i dati
Per ragioni di utilizzo, entrambe devono essere visibili contemporaneamente.
Per agevolare l'inserimento e la visione dei dati in tutta la loro interezza, sto pensando ad una soluzione del tipo che in fase di inserimento del primo campo la sottomaschera possa allargarsi sovrapponendosi alla subform2 e una volta terminato possa ridimensionarsi come in origine.. Suggerimenti sulla proprietà/ azione da utilizzare? grazie

8 Risposte

  • Re: Sottomaschere continue sovrapposte

    Se la cosa per te è soddisfacente si può fare... tuttavia fai attenzione a come...!

    Ci sono 2 tranelli in questa cosa...
    1) L'evento da usare... quando una FORM è SUBFORM, gli EVENTI non reagiscono proprio come ci si aspetta da una FORM...
    quindi devi metterti di pazienza e PROVARE tutti gli eventi, prima di tutto se si generano e poi se la loro eventuale attivazione ti soddisfa.

    2) Trovato l'evento se scrivi il codice nella SubForm hai un problema.... in quanto tu non devi modificare le dimensioni della Form ma quelle della SubForm ovvero del Container che dall'interno non sai come trovare.

    Mi spiego meglio, nella Form hai un'oggetto Container(di tipo SubForm) che ingloba la Form come SubForm, ma sono 2 Oggetti differenti, il Container sarà raggiungibile come:
    
    Me!nomeContainerSubform
    Mentre la Form interna
    
    Me!nomeContainerSubform.Form....
    Dall'interno della SubForm se testi il Me.Parent trovi la Main Form e non il Container quindi di fatto non esiste un legame tracciabile tra il Container e la Form inglobata leggibile dalla Form stessa.
    Serve un giochetto simile all'interno della SubForm
    
    Function MyContainer() As Access.Control
        Dim ctl As Access.Control
        Dim frm As Access.Form
        Set frm = Me.Parent
        For Each ctl In frm.Controls
            If TypeOf ctl Is SubForm Then
                If ctl.Form Is Me Then
                    Set MyContainer = ctl
                    Exit For
                End If
            End If
        Next
    End Function
    Quindi trovato l'evento, puoi fare così:
    
    Dim mContainer As Access.Control
    Set mContainer=MyContainer() 
    mContainer.With=NuovaLarghezza
    Se tutto questo invece lo fai dalla Form è tutto più semplice...
  • Re: Sottomaschere continue sovrapposte

    Ovviamente il processo non è il massimo, soprattutto se la MainForm ha molti Control... si può ottimizzare... generando una Collection nella MainForm on Load che carica la 1° volta solo i container...
    Esempio
    
    Private mSubForms As VBA.Collection
    
    Public Property Get Subforms() As VBA.Collection
       Dim ctl As Access.Control
       If mSubForms Is Nothing Then
          Set mSubForms = New VBA.Collection
          For Each ctl In Me.Controls
             If TypeOf ctl Is Subform Then mSubForms.Add ctl
          Next
       End If
       Set Subforms = mSubForms 
    End Property
    Poi nella SubForm per recuperarlo interroghi la Collection della MainForm:
    
    Private Sub NomeButtonTest_Click()
       MsgBox GetParentSubformControl.Name
    End Sub
    
    Private Function GetParentSubformControl() As Control
       Dim ctrl As Control
       For Each ctrl In Me.Parent.Subforms
          If ctrl.Form Is Me Then
             Set GetParentSubformControl = ctrl
             Exit For
          End If
       Next
    End Function
  • Re: Sottomaschere continue sovrapposte

    is Me

    c'è sempre da imparare! io mi sarei "complicato" la vita passando il nome del chiamante come parametro della function ... :S

    Ne approfitto per chiedere una cosa se posso ... siccome mi è capitato di utilizzare sia il primo che l'altro metodo ... un pò a sentimento ... trovo che il gestire tutto da form sia sì + semplice come dici tu però col rischio di replicare lo stesso codice su tutte le form che eventualmente utilizzano la subform. Sto pensando ad un caso che ho in un mio software in cui per diversi contesti si possono allegare file, quindi la subform di gestione allegati è "modulare" e utilizzata su + form in base al contesto, ad esempio allegati all'anagrafica Azienda, piuttosto che al Dipendente, piuttosto che alla visita.
    Secondo me ci sarà sempre codice "dedicato al contesto" che è meglio mettere sulla form apposita e codice "generalizzato" da mettere sulla subform perchè sempre lo stesso.
    Che ne pensi @Alex?
  • Re: Sottomaschere continue sovrapposte

    [IS] è usato per il confronto di Oggetti, usato molto nella gestione delle classi... soprattutto in caso di Collection ed istanze Multiple gerarchiche è utilissimo, in questo caso è uguale, se l'Oggetto Me(Form) IS OggettoControl.Form diventa vera solo quanto l'oggetto comparato coincide ma non come TIPO quanto proprio come POINTER, altrimenti 2 istanze di classe o di Form darebbero sempre TRUE, cosa non utile... per quello si usa TypeName, che restituisce il Nome della Classe, quindi se istanzi 2 o N Form come subForm interrogando gli Oggetti con TypeName otterrai sempre lo stesso Nome di Classe Oggetto.

    Per la tua domanda direi che il tema da contestualizzare... e mi spiego meglio....

    Se la Funzione è Public, si può recuperare il CHIAMANTE con CodeContextObject, ed è una soluzione che utilizzo spesso ma va confinata al metodo di fruizione, ovvero Form che chiama PublicFunction.

    Altrimenti serve perforza scambiare un dato, se però gli oggetti sono interdipendenti, come Form SubForm si può ottimizzare.
    Ad esempio se sappiamo che quelle Form sono SOLO usate come SubForm, pi può dotare la Form di una Public Property da valorizzare su Load della MainForm... ovvero siccome una Form può essere usata come SubForm in diverse MainForm, l'unico parametro che ti manca è il Container in quanto il riferimento alla Main lo hai sempre con Me.Parent.

    Non so se ho risposto, ma per essere più concreto dovrei nello specifico capire l'ambito.
  • Re: Sottomaschere continue sovrapposte

    @Alex
    CodeContextObject l'ho imparato sempre da te qualche anno fa e lo uso con grande soddisfazione (prima facevo giri inutili)
    IS lo uso nei SELECT CASE o chiaramente in SQL .. in effetti lo uso anche come "IS NOTHING" quindi in effetti potevo anche arrivarci che si potesse usare per confrontare oggetti
    Sei stato molto chiaro nella spiegazione grazie!
  • Re: Sottomaschere continue sovrapposte

    @Alex ha scritto:


    Se la cosa per te è soddisfacente si può fare... tuttavia fai attenzione a come...!

    Ci sono 2 tranelli in questa cosa...
    1) L'evento da usare... quando una FORM è SUBFORM, gli EVENTI non reagiscono proprio come ci si aspetta da una FORM...
    quindi devi metterti di pazienza e PROVARE tutti gli eventi, prima di tutto se si generano e poi se la loro eventuale attivazione ti soddisfa.

    2) Trovato l'evento se scrivi il codice nella SubForm hai un problema.... in quanto tu non devi modificare le dimensioni della Form ma quelle della SubForm ovvero del Container che dall'interno non sai come trovare.

    Mi spiego meglio, nella Form hai un'oggetto Container(di tipo SubForm) che ingloba la Form come SubForm, ma sono 2 Oggetti differenti, il Container sarà raggiungibile come:
    
    Me!nomeContainerSubform
    Mentre la Form interna
    
    Me!nomeContainerSubform.Form....
    Dall'interno della SubForm se testi il Me.Parent trovi la Main Form e non il Container quindi di fatto non esiste un legame tracciabile tra il Container e la Form inglobata leggibile dalla Form stessa.
    Serve un giochetto simile all'interno della SubForm
    
    Function MyContainer() As Access.Control
        Dim ctl As Access.Control
        Dim frm As Access.Form
        Set frm = Me.Parent
        For Each ctl In frm.Controls
            If TypeOf ctl Is SubForm Then
                If ctl.Form Is Me Then
                    Set MyContainer = ctl
                    Exit For
                End If
            End If
        Next
    End Function
    Quindi trovato l'evento, puoi fare così:
    
    Dim mContainer As Access.Control
    Set mContainer=MyContainer() 
    mContainer.With=NuovaLarghezza
    Se tutto questo invece lo fai dalla Form è tutto più semplice...
    Grazie Alex come sempre per la risposta, proverò a mettere in pratica le tue indicazioni.
    Se quando scrivi "se per te è soddisfacente si può fare" intendi dire che ci sono altre soluzioni più efficienti al problema? Nel caso sono ovviamente interessato, grazie.
  • Re: Sottomaschere continue sovrapposte

    No intendo dire che dipende dalla modalità operativa che preferisci avere...
    Io metterei un Pulsante nella Forn molto basic ma molto funzionale.
  • Re: Sottomaschere continue sovrapposte

    Capito, grazie!
Devi accedere o registrarti per scrivere nel forum
8 risposte