Newsgroup: it.comp.appl.access
Titolo: Nascondere una form.

Il problema x me e' piu complicato di quello che sembra.
Vi spiego tutto.
Vorrei fare in modo che aprendo cliccando su un pulsante di una form A mi si
apra la form B e mi diventi invisiblie la form A.
io utilizzo la segente sintassi:
    docmd.openform "frm_A",......
    me.visible=false
il problema e che quando chiudo la form B vorrei che mi riapparisse la form
A
    io scrivo form_frm_A.setfocus
e tutto funziona.
MA, se la form B puo essere richiamata da piu' form tipo A,C,D,E come posso
fare i caso della chiusara  della form B a sapere chi e' la chiamante ?
ho pensato: controllo  quale maschera chiamante e' aperta e poi le metto il
focus ma, se ci sono 2 chiamanti aperte ?
Allora mi sono inventato una specie di soluzione tipo STACK
con due funzioni PUSH e POP metto in una tabella il nome della form che ha
chiamato
e in chiusura della form B con il nome della form chiamante la apro
IL problema grosso e' ora:
io ho il nome della form ma e' in formato stringa e non riesco ad usarlo per
aprirla nuovamente .
ho scritto questa funzione ma ho un problema:
Public Function Str2Obj(NameFrm) As AccessObject
    Dim obj As AccessObject, dbs As Object
    Set dbs = Application.CurrentProject
    ' Ricerca oggetti AccessObject aperti in insieme AllForms.
    For Each obj In dbs.AllForms
        If 
obj.name
 = NameFrm Then
            If obj.IsLoaded = True Then
                Set Str2Obj = obj
                Exit For
            End If
        End If
    Next obj
End Function
questa funzione restituisce un'oggetto quindi
scrivendo :
Dim Frm as form
set frm=str2obj("Frm_A")
dovrei ottenere l'effeto desiderato cioe':
frm.visible=false
solo che mi dice che c'e un conflitto di property ....dove sbaglio penso che
sia un problema di variabili giusto ?
ALTRIMENTI se qualcuno di voi ha un'altra soluzione me la dite ?
GRAZIE ADRIANO

 fare i caso della chiusara  della form B a sapere chi e' la chiamante ?
E' una soluzione che uso da molto tempo con successo.
Quando si apre una form con openform si puņ passare un parametro. chiamato
OpenArgs.
Dalla maschera aperta si rintraccia questo parametro con me.OpenArgs.
Pertanto basta che chi apre passi il suo nome e chi č aperto usi openargs
per ritornare alla chiamante: forms(openargs).visibile = true
Antonio

 fare i caso della chiusara  della form B a sapere chi e' la chiamante ?
onestamente non ho letto tutto il msg, spero sia quello che cerchi.
quando apri la form, setta il parametro OpenArgs con il nome della form
chiamante, cioe'
docmd.openform "frm_A", , , , , , Me.Name
Me.Visible = false
a questo punto quando dalla frm_A, vuoi sapere chi la chiamata, trovi il
nome in Me.OpenArgs
Forms(Me.OpenArgs).visible = true
Docmd.close acForm, 
me.name
-- 
Federico
----------------------------------
Rimuovi paperino. per e-mail
----------------------------------
Tutte le richieste che arrivano
in privato, vengono cestinate.
----------------------------------
Sito Comune di it.comp.appl.access
http://www.sitocomune.com
mailto:
webm...@sitocomune.com
----------------------------------

Oltre alle soluzioni proposte, da Antonio e Federico, posso suggerirti
un'alternativa.
Supponendo che il bottone di chiusira della FormB si chiami cmdClose, vai
nel codice della Form (sempre la B) e scrivi questo codice (ne capirai il
significato leggendo quanto ho scritto dopo):
----------------------------------------------------------------------------
---------
Option Compare Database
Option Explicit
Public flgChiudi As Boolean
Public strNomeForm As String
Property Let FormChiamante(NomeForm As String)
    strNomeForm = NomeForm
    txtFormChiamante = strNomeForm
End Property
Property Get FormChiamante() As String
    FormChiamante = strNomeForm
End Property
Property Get Chiudi() As Boolean
    Chiudi = flgChiudi
End Property
Private Sub cmdClose_Click()
    flgChiudi = True
End Sub
Private Sub Initialize()
    flgChiudi = False
End Sub
----------------------------------------------------------------------------
---------
Nel codice della FormA (che conterrà un bottone cmdOpen, per aprire la
FormB), scrivi questo:
----------------------------------------------------------------------------
---------
Option Compare Database
Option Explicit
Private Sub cmdOpen_Click()
    Dim oFormB As Form_FormB
    Set oFormB = New Form_FormB
    Me.Visible = False
    oFormB.FormChiamante = Me.name
    oFormB.Visible = True
    Do Until oFormB.Chiudi
        DoEvents
    Loop
    oFormB.Visible = False
    Set oFormB = Nothing
    Me.Visible = True
End Sub
----------------------------------------------------------------------------
---------
In parole povere, con questo codice, quando clicchi sul bottone cmdOpen
della FormA, viene creata un'istanza della FormB e nascosta la FormA.
Quando chiudi la FormB cliccando sul bottone cmdClose (occhio: in questi
casi ti conviene forse gesti anche l'eneto "Su Chiusura", oppure disattivare
il bottone di chiusura della Form!!!), FormA intercetta il valore della
proprietà "Chiudi" a vero, esce quindi dal Loop, nasconde chiude la Form e
si rende nuovamente visibile.
Questo codice ha di buono una cosa in particolare.
Prova a duplicare FormA e, come etichetta della amschera, metti un altro
nome ("Form A1", per esempio).
Apri sia FormA, sia FormA1 e affiancale, così da renderle visibili entrambe.
Ora premi il bottone cmdOpen di una delle due maschere. Si aprirà FormB:
spostala da dove si trova.
Ora clicca sul bottone cmdOpen  della maschera che è rimasta.
Come potrai vedere, ora hai due istanze della stessa FormB, totalmente
indipendenti (come se avessi due copie perfettamente identiche dalla stessa
Form).
Se adesso premi su uno dei due bottoni cmdClose, si riaprirà la maschera
chiamante e altrettanto succederà quando premerai sull'altro bottone
cmdClose.
Questa soluzione è molto comoda quando devi aprire la stessa Form in più
istanze. Il solo accorgimento da fare è quello della modifica contemporanea
dello stesso record, ma è un controllo facile da fare.
Se hai problemi a capire, posso inviarti, via e-mail, un piccolo esempio.

Grazie a tutti x le risposte ed i consigli...
ma nel vostri esempi ho trovato qualcosa x me interessante...
ho usato forms(nomeform di tipo stringa).visible=true
ho risolto tutto
ho inoltre elaborato il tutto con 2 comode funzioni
ShowHiddenForm
e
HideCurrentForm
x usare queste 2 funzioni ho implementato una tabella a mo' di STACK come si
usava una volta !
con 2 funzioni POP e PUSH
le prime 2 soluzioni sono valide ma io gia' uso in qualche form il metodo
openargs quindi in quei casi
avrei dovuto fare una funz complessa per gestire piu dati in ingresso
il terzo metodo poteva andare bene , ma mia intenzione era di ricreare
quello che effettivamnete avviene nello stack di una cpu.
in questo modo , cioe come ho fatto e con altre modifiche mi potrei gestire
piu metodi per le form...
Vi propongo il codice x le mie funzioni:
Public Sub PushStack(NameFrm, FunzStr, ValStr As String)
    DoCmd.RunSQL "INSERT INTO STACK  (NomeForm,Funzione,Valore) VALUES ('" &
NameFrm & "','" & FunzStr & "','" & ValStr & "')"
End Sub
Public Sub PoPStack(NameFrm, FunzStr, ValStr As String)
    Dim StrSQL As String
    Dim Conn As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Set Conn = CurrentProject.Connection
    Set Rst = New ADODB.Recordset
    StrSQL = "Stack"
    Rst.Open StrSQL, Conn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    With Rst
        .MoveLast
        NameFrm = !NomeForm
        FunzStr = !funzione
        ValStr = !valore
        .Close
    End With
    Conn.Close
    Set Conn = Nothing
    Set Rst = Nothing
End Sub
Public Sub ShowHiddenForm()
    Dim NomeForm, FunzStr, ValStr As String
    PoPStack NomeForm, FunzStr, ValStr
    If FunzStr = "Visible" Then
        Select Case ValStr
            Case "Vero"
                Forms(NomeForm).Visible = True
            Case "Falso"
                 Forms(NomeForm).Visible = False
        End Select
    End If
End Sub
Public Sub HideCurrentForm()
    PushStack 
Screen.ActiveForm.name
, "Visible", "Vero"
     Screen.ActiveForm.Visible = False
End Sub
Public Sub FlushStack()
    DoCmd.RunSQL "DELETE Stack.* FROM STACK;"
End Sub
la tabella deve essere creata cosi:
    Nome tabelle:STACK
Campi:
        NomeForm    testo 100
        Funzione        testo 100
        Valore           testo  50
fine
Spero di essere stato chiaro e magari d'aiuto a qualcuno
CIAO ADRIANO
"koo" <koo@k.k> wrote in message news:9ku1vg$dh3$1...@serv1.iunet.it...
