Newsgroup: it.comp.appl.access
Titolo: Istanze multiple form

Ho creato un menù ad albero attraverso una treeview basata su due tabelle.
Le foglie di questo albero rappresentano le maschere, i cui nomi sono nel
database. Se le apro attraverso il classico comando docmd.openform tutto va
bene in quanto questa funzione di sistema accetta una variabile stringa che
contiene il nome della maschera prelevato dal db. Ora vorrei poter fare in
modo che se l'utente conferma nuovamente una foglia (che era stata in
precedenza confermata e dunque con la maschera già aperta) access mi
generasse una nuova istanza della maschera. Il codice classico
dim f as form
-------------
set f = new form_nomeform
f.setfocus
non va bene poichè dopo l'enunciato new non posso passare una variabile (il
nome del form)
Qualcuno mi sa dare una mano oppure se avete una soluzione migliore ve ne
sarei grato.
Mille grazie
Michele

> "Michele" [...]:

    Sto studiando anch'io questa possibilita e proprio oggi, pardon, ieri,
ho aperto un 3d col subj:
        [?] DoCmd.OpenForm Vs Set frm =
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 --------
Ma non dormi mai Maurì?
ti becco sempre qui a quest'ora di notte.
Ciao. Fabrizio.

 ti becco sempre qui a quest'ora di notte.
    Sto studiando.
    E tu, invece? Scrivi nel sonno?
--


 --------
Ciao a te . Fabrizio.

 soddisfazione  di aver riempito un po' di più il mio cervello.
    Non vedo l'ora.


 --------
Ciao. Fabrizio
p.s.loop di pecore, perciò me tocca de contà la stessa pecora
"1....1.....1.....1......" si le palle che funziona, sarà un mago de
Access(e), ma non capisce che quello, oppure so io che non c'ho chiaro er
concetto de luuppe ... boh stamo a vedè  "1.....1.......1.....1....."

> "Maurizio Borrelli" [...]:

    Ti propongo un abbozzo che pero' e' impostato piu' in base alle mie
esigenze che alle tue. Ma credo che tutto sommato le differenze non siano
notevoli. La cosa particolare che serve a me e che forse a te non interessa
e' la gestione di una maschera con sottomaschera non associata (in realta'
le sottomaschere saranno piu' di una) la cui determinazione avviene
all'apertura.
' ************************************************************
'
' Form_MPrincipale
'
' Controlli:
'    cdrMaschere  Casella di riepilogo  (ListBox);
'    pdcApri      Pulsante di comando   (CommandButton).
'
' ************************************************************
Option Compare Database: Option Explicit
Private Enum myFormsEnum
  idxFormA = 0
  idxFormB = 1
  idxFormC1 = 2
  idxFormC2 = 3
  idxFormC3 = 4
End Enum
Private m_col   As VBA.Collection
Private m_sDblQ As String
Private Function DoCmdOpenForm( _
) As Boolean
  Static s_lACount  As Long
  Static s_lBCount  As Long
  Static s_lCCount  As Long
  Dim lIndex    As Long
  Dim sCaption  As String
  Dim frm       As Access.Form
  Dim frmC      As Form_MSecondariaC
  Dim lCount    As Long
  Dim bCont     As Boolean
  bCont = True
  With Me.cdrMaschere
    lIndex = .ListIndex
    sCaption = .Column(.BoundColumn, lIndex) & ":"
    Select Case lIndex
    Case idxFormA
      Set frm = New Form_MSecondariaA
      s_lACount = s_lACount + 1
      lCount = s_lACount
    Case idxFormB
      Set frm = New Form_MSecondariaB
      s_lBCount = s_lBCount + 1
      lCount = s_lBCount
    Case idxFormC1, idxFormC2, idxFormC3
      Set frmC = New Form_MSecondariaC
      s_lCCount = s_lCCount + 1
      lCount = s_lCCount
      With frmC
        With .smSecondariaC
          Select Case lIndex
          Case idxFormC1
            .SourceObject = "smSecondariaC1"
          Case idxFormC2
            .SourceObject = "smSecondariaC2"
          Case idxFormC3
            .SourceObject = "smSecondariaC3"
          Case Else
            bCont = False
          End Select
        End With
        If (bCont = True) Then
          .MeResize
        End If
      End With
      Set frm = frmC
      Set frmC = Nothing
    Case Else
      bCont = False
    End Select
  End With
  If (bCont = True) Then
    m_col.Add frm
    With frm
      .Caption = sCaption & Format$(lCount)
      .SetFocus
    End With
  End If
  Set frm = Nothing
  DoCmdOpenForm = bCont
End Function
Private Sub cdrMaschere_DblClick( _
  ByRef Cancel As Integer)
  DoCmdOpenForm
End Sub
Private Sub Form_Load()
  m_sDblQ = Chr$(34)
  Set m_col = New VBA.Collection
  With Me
    .Caption = "Principale"
    With .cdrMaschere
      .RowSourceType = "Elenco valori"
      .RowSource _
        = m_sDblQ & "Maschera A" & m_sDblQ _
        & ";" _
        & m_sDblQ & "Maschera B" & m_sDblQ _
        & ";" _
        & m_sDblQ & "Maschera C1" & m_sDblQ _
        & ";" _
        & m_sDblQ & "Maschera C2" & m_sDblQ _
        & ";" _
        & m_sDblQ & "Maschera C3" & m_sDblQ
      .ColumnCount = 1
      .BoundColumn = 0
      .DefaultValue = 0
    End With
    With .pdcApri
      .Caption = "&Apri"
    End With
  End With
End Sub
Private Sub Form_Unload( _
  ByRef Cancel As Integer)
  Set m_col = Nothing
End Sub
Private Sub pdcApri_Click()
  DoCmdOpenForm
End Sub
' ************************************************************
' ************************************************************
'
' Form_MSecondariaA
'
' ************************************************************
Option Compare Database: Option Explicit
' ************************************************************
' ************************************************************
'
' Form_MSecondariaB
'
' ************************************************************
Option Compare Database: Option Explicit
' ************************************************************
' ************************************************************
'
' Form_MSecondariaC
'
' Controlli:
'    smSecondariaC  Sottomaschera  (SubForm).
'
' ************************************************************
Option Compare Database: Option Explicit
Public Sub MeResize()
  On Error Resume Next
  With Me.smSecondariaC
    .Left = 0
    .Top = 0
    With .Form
      Me.InsideWidth = .Width
      Me.InsideHeight = .Section(acDetail).Height
    End With
    .Width = Me.InsideWidth
    .Height = Me.InsideHeight
  End With
End Sub
Private Sub Form_Load()
  Debug.Print "MSecondariaC.Form_Load"
End Sub
Private Sub Form_Resize()
  MeResize
End Sub
Private Sub Form_Unload( _
  ByRef Cancel As Integer)
  Debug.Print "MSecondariaC.Form_Unload"
End Sub
' ************************************************************
    Le maschere: smSecondariaC1, smSecondariaC2, smSecondariaC3 non
posseggono modulo.
    Meglio testare assegnando un colore diverso allo sfondo di ogni
maschera.
    Fammi sapere qualcosa, grazie.



mah?! guarda se ti puo essere  utile.
Prima due parole per spiegare il contesto
Ho una gestione generalizzata per cui apro sempre la stessa form in cui,
di volta in volta, carico come sottomaschera quella che mi serve. Nella
mia
gestione posso aprire tutte le form che voglio (sono tutte non modali)
Il tutto si basa su
Global FormColl as new Collection
          defmenu.SetArrVar(0) = strPar
**  questa  mi serve poiche' sull'evento open del form generalizzato 
    faccio cose
          NomeForm = defmenu.SetDesc
**  questo e' il nome con cui riconosco il form
          On Error Resume Next
**  questo perche' so che potrei prendere errore nelle due istruzioni
successive
          Set frm = FormColl(NomeForm)
**  vedo se il nome form e' gia' presente sulla collezione 
          bool = SysCmd(acSysCmdGetObjectState, acForm, frm.Name)
**  controllo lo stato del form
          If bool = False And (Err.Number = 0 Or Err.Number = 2467) Then
            Err.Number = 9999
            FormColl.Remove (NomeForm)
**  rimuovo il form dalla collezione
          End If
**  controllo gli errori che interessano
          If Err.Number <> 0 Then
**  vuol dire che il form non era sulla collezione
            Set frm = New [Form_Pannello Dati]
**  faccio partire il form
            FormColl.Add Item:=frm, key:=frm.Caption
**  metto il form sulla collezione
          Else
            frm.SetFocus
** vuol dire che il form gia' c'era e lo rendo attivo
            'DoCmd.Restore
** questa non mi ricordo perche' l'ho tolta, ma era correlata al fatto
se
   il form era iconizzato o meno
          End If
 
          frm.Visible = True
**  rendo visibile il form
mi funziona da anni e anche nel passagggio '97 --> 2000 nessun problema
--
a.cara