Maschere con istanze multiple

di il
10 risposte

Maschere con istanze multiple

Creando maschere con istanze multiple, ed avendo nella maschera principale delle sottomaschere non riesco ad identificare le maschere istanziate.

Nel caso debba usare  Forms!MascheraPrincipale!Sottomaschera!Campo1 funziona se la maschera è utilizzata singolarmente.

Quando si usano istanze diverse   la  maschera principale non viene riconosciuta Forms!MascheraPrincipale!Sottomaschera!Campo1.

Qual'è il metodo corretto per identificarla?

Grazie

10 Risposte

  • Re: Maschere con istanze multiple

    Ovviamente… se non hai salvato le istanze in una Collection poi non sai cosa stai facendo…

    Quando si istanziano Oggetti devi gestire una Collection di Oggetti, oppure una Classe che ingloba l'oggetto, con tutte le proprietà necesarie incluso l'hWnd che serve a te, ed una Collection di Classi, questo a seconda di cosa devi fare.

    Prova avedere questo DEMO (fatto in MDB, ma si apre con A365 e lo puoi convertire):

    https://1drv.ms/u/s!Are2sGzrs4WCqgFTdbJhUs6grc86?e=cbiufC

  • Re: Maschere con istanze multiple

    Grazie Alex,

    sto guardando la demo, probabilmente devo dedicare un pò di tempo a capire meglio.

    Io ho creato una collection di questo tipo

        Dim msk As Form
       Set msk = New Form_PreparVendita
       msk.Visible = True
       msk.Caption = "Scontrino  " & "Ora   " & Time
       clnClient.Add Item:=msk, Key:=CStr(msk.hWnd)

       Set msk = Nothing

    Tutto funziona, apro le maschere in modo indipendente.

    Il problema si pone nelle sottomaschere, come nel caso  Forms!MascheraPrincipale!Sottomaschera!Campo1 , dove al posto di 

    !mascheraprincipale! devo inserire un identificatore. Ho provato ad inserire la hwnd ma non credo sia il metodo corretto , perche non riconosce la maschera.

    Se ti và, di darmi qualche altra informazione. Nel frattempo cerco di approfondire la demo che ho scaricato.

    Ancora grazie

  • Re: Maschere con istanze multiple

    Grazie Alex,

    sto guardando la demo, probabilmente devo dedicare un pò di tempo a capire meglio.

    Io ho creato una collection di questo tipo

        Dim msk As Form
       Set msk = New Form_PreparVendita
       msk.Visible = True
       msk.Caption = "Scontrino  " & "Ora   " & Time
       clnClient.Add Item:=msk, Key:=CStr(msk.hWnd)

       Set msk = Nothing

    Tutto funziona, apro le maschere in modo indipendente.

    Il problema si pone nelle sottomaschere, come nel caso  Forms!MascheraPrincipale!Sottomaschera!Campo1 , dove al posto di 

    !mascheraprincipale! devo inserire un identificatore. Ho provato ad inserire la hwnd ma non credo sia il metodo corretto , perche non riconosce la maschera.

    Se ti và, di darmi qualche altra informazione. Nel frattempo cerco di approfondire la demo che ho scaricato.

    Ancora grazie

  • Re: Maschere con istanze multiple

    Ciao,

    Un pò di info che magari possono tornarti utili:

    Forms Collection [Access 2003 VBA Language Reference] | Microsoft Learn

    Collections, controls, and objects (Microsoft Forms) | Microsoft Learn

    Quindi se vuoi creare una collection per oggetti form dovrai prima di tutto creare una Collection … 
    per esempio: myFormCollection as Collection

    poi dovrai semplicemente prendere gli oggetti form che intendi mettere nella collection …
    per esempio; Set myForm1 = New Form_MyForm1  e  a questo punto aggiungi alla collection il tuo oggetto …
    per esempio: myFormCollection.Add myForm1, "FORM1" e così via dicendo per le altre form :  myFormCollection.Add myForm2, "FORM2"
    etc etc etc , dove FORM1 e FORM2 rppresentano l'indice per rintracciare l'oggetto form nella collection.

    Adesso hai una collection di oggetti Form che puoi usare in un qualsiasi mometo e metodo.
    Per esempio puoi renderle visibili o nascondere le form riferendoti alla collection: 
    esempio: myFormCollection ("FORM1").Visible = True oppure myFormCollection ("FORM1").Visible = False

    Per esempio puoi fare riferimento ad una form attraverso la collection:
    esempio: Set form1 = myFormCollection ("FORM1") … idem per la subform di Form1: Set subForm1= form1!tuoNomeSubForm.Form

    E se si vuole fare riferimento per esempio ad una texbox della subform …
    esempio: RetrieveValue = subForm1!TuoNomeTextBox.Value 
    oppure :  subForm1!TuoNomeTextBox.Value = "TuoNuovoValore"

    etc etc etc… 

    Una cosa di questo tipo, se non erro e se non ricordo male … nel caso l'ottimo Alex mi correggerà.  ;-)


     P

  • Re: Maschere con istanze multiple

    Ciao,

    molto interessante e credo che con queste informazioni posso trovare la soluzione. Adesso mi analizzo bene quanto mi hai mandato e anche la demo di Alex. Grazie. Devo dire che questo sito e chi ci collabora è veramente una risorsa importante.

    Appena possibile darò i risultati del mio lavoro! 

  • Re: Maschere con istanze multiple

    Buongiorno,

    ho analizzato le informazioni della risposta ma non sono riuscito a trovare la mia soluzione.  Provo a dare qualche altro dato.

    Questo è il modulo per la collezione:

    Option Compare Database

    Option Explicit
    Public clnClient As New Collection  'Instanze di PreparVendita.

    Function OpenAClient()

       'Apre un'istanza indipendente
       Dim msk As Form  
       'Apre una nuova istanza e cambia la caption.
       Set msk = New Form_PreparVendita
       msk.Visible = True
       'Definisce la caption
       msk.Caption = "Scontrino  " & "Ora   " & Time

       'Aggiunge alla collezione
       clnClient.Add Item:=msk, Key:=CStr(msk.hWnd)

        Set msk = Nothing
    End Function

    Questa è la maschera che viene aperta:

    Private Sub Form_Load()

       Dim Nrec As Long
       Nrec = DCount("*", "TabArticoliMarkup") 'Conta record
       Dim NrecMK As Long
       NrecMK = DCount("*", "TabMarkup") 'Conta record
      

    A questo punto va in errore perchè non riconosce la maschera PreparVendita
     Forms!PreparVendita!NrArtic = Nrec

     Forms!PreparVendita!ArticoliTabMarkup!NrArtic = Nrec
     Forms!PreparVendita!CasellaCombinata1410 = Me.CodiceCliente
       
    End Sub

    Questo problema si ripropone in ogni occasione dove la maschera deve essere identificata.

    Ho lo stesso problema nelle query se devo fare riferimento ad una maschera nei criteri di selezione, ad esempio

    [Maschere]![PreparVendita]![NrScontrino] mi va in errore perche la maschera richiamata risulta sconosciuta.

    Tutto funziona correttamente se non utilizzo istanze multiple.

    Ringrazio anticipatamente per l'aiuto!  

  • Re: Maschere con istanze multiple

    Gestire le Istanze Multiple richiede una analisi preventiva di come farlo, se sia possibile farlo conoscendo le specificità di come si gestiscono le Istanze e mi pare tu stia commettendo diversi errori di approccio, la collection la crei ma non la usi, quindi non hai capito a cosa serve.

    Quando apri una Maschera in MultiIstanza questa dovrebbe essere INDIPENDENTE non può condizionare una QUERY è un errore concettuale, ed ovviamente impossibile possa funzionare in quanto la Query non può accedere all'istanza con la sintassi che continui ad usare, eventualmente dall'interno della Form si deve condizionare la proprietà FILTER, poi la SubForm essendo Legata Campi Master/Secondari seguirà.

    Da codice quando recuperi l'istanza dalla Collection, hai già l'Oggetto Form, dando per assunto che tutte le istanze contengono la SubForm dovrai riferirti partendo dall'oggetto in collection.

    Dim mF As Access.Form
    
    ' Recuperi l'istanza
    Set mF=clnClient.Item(tuaKEY)
    mF!NrArtic = Nrec
    mF!ArticoliTabMarkup!NrArtic = Nrec
    mF!CasellaCombinata1410 = Me.CodiceCliente

    In ogni caso sforzati di rendere le Istanze indipendenti e di non doverci tornare a TelePilotarle da fuori… non ha senso, perchè mai devi andare a modificare quei dati dal codice chiamante…?

    Perchè non doti l'Oggetto Form di Properties e le usi come si fa con le classi…?
    L'uso di Istanze multiple si deve rifare ai canoni di programmazione OOP… che non hai usato.

  • Re: Maschere con istanze multiple

    Si hai ragione, eviterò di utilizzare query per filtrare i dati. Mi farebbe piacere se mi indicassi un manuale completo di VBA da acquistare o visualizzare online, Ho acquistato ultimamente “Access 2019 Programmazione VBA” ma non è esaustivo, e in ogni caso non ho trovato informazioni su istanze multiple, è la prima volta che le uso.  

    Sul pezzo di codice che mi hai suggerito ho provato a recuperare l'istanza

    'aggiungo alla collezione

    
    clnClient.Add Item:=msk, Key:=CStr(msk.hWnd)

    ‘Recupero l’istanza

    Set mF=clnClient.Item(CStr(msk.hWnd))

    ma evidentemente sto sbagliando, perchè l'istruzione successiva 

    mF!NrArtic = Nrec

    produce un errore.

    Grazie per il tempo e la pazienza. 

  • Re: Maschere con istanze multiple

    Come ti ho provato a spiegare la logica da usare è quella della OOP, o programmazione Object Oriented, che non stai usando…!

    Di norma le Classi hanno Proprietà, Metodi, ed eventi… tu vuoi accedere ad un oggetto interno in modo esplicito, io non lo farei, ma doterei la Classe di Form di Metodo o Proprietà che poi fanno quello che serve…!

    Nella Form:

    Public Function SetNRec(Value as Long) As Boolean
    	Me!NrArtic=Value
    End Function
    
    oppure
    
    Public Property Let SetNRec(Value As Long)
        Me!NrArtic=Value
    End Property
    

    e tu la richiami come si deve:

    Set mF=clnClient.Item(CStr(msk.hWnd))
    mF.SetNRec Nrec
    oppure se property
    mF.SetNRec=Nrec

    Libri specifici sulle Classi VBA non so se ci sono, io non ne ho trovati 20anni fa, ma se ci sono sono superficiali… ti suggerisco di studiare BENE il mio demo, nel sito che ho usato per farti scaricare l'esempio ci sono vari esempi molto avanzati delle Classi e di cosa si può fare con il VBA di Access.

  • Re: Maschere con istanze multiple

    Grazie Alex, con le informazioni e la demo che mi hai mandato sto utilizzando finalmente le istanze multiple.

    Adesso funziona come speravo. Ho ancora diversi argomenti da approfondire ed è molto probabile che richiederò aiuto.

    Alla prossima e grazie di tutto.

Devi accedere o registrarti per scrivere nel forum
10 risposte