Newsgroup: it.comp.lang.visual-basic
Titolo: apertura e chiusura di form

buon giorno
in un progetto in 
vb.net
 ho alcuni form.
uno di questi lo creo all'inizio con il comando
Public myForm As New FormPippo
che ho messo in un modulo.
per visualizzare o nascondere il form uso i comandi
myForm.Show()
myForm.Hide()
il problema e' che se il form viene chiuso utilizzando la
croce in alto a destra il sistema non funziona piu', perche'
prima di usare il metodo Show() devo ricreare il form con il
comando
Public myForm As New FormPippo
come posso fare per sapere se a un certo punto il myForm esiste ?
grazie
Inviato da 
www.mynewsgate.net

 come posso fare per sapere se a un certo punto il myForm esiste ?
io proverei con:
 if myform is nothing then
    myform = new classfotm
 end if
ma su msdn non ho trovato conforto per la mia tesi...
prova, e facci sapere.
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
ciao
grazie!
ho appena provato ma mi da un errore del tipo
Impossibile accedere all'oggetto eliminato di nome "ClassForm".
io mi aspettavo che l'errore fosse del tipo "myform non esiste"
invece sembra che sia stata eliminata la classe!!
mah ... non capisco
Inviato da 
www.mynewsgate.net

 mah ... non capisco
neanche io, ma non è poi così strano essere confusi :-)


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 0 Then ' se l'utente ha premuto la X
 Cancel=True ' non effettua l'unload
 Me.Hide ' nasconde la form
 Exit Sub ' esce dalla funzione (opzionale (sono un po fissato))
End If
End Sub

--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 esattamente, su quale riga di codice si è verificato l'errore?
si blocca quando tenta di riaprire la finestra
nella riga myform.show()
Inviato da 
www.mynewsgate.net

 
ciao
sto provando con questo metodo
per ora mi da il solito errore, ma riprovo ancora un po
 errore: Impossibile accedere all'oggetto eliminato di nome "FormClient".
ciao
grazie
Inviato da 
www.mynewsgate.net

 End Sub
ciao
la tua subroutine va messa nel codice del form stesso, vero ?
almeno io l'ho messa li
ciao
Inviato da 
www.mynewsgate.net

 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Si parlava di VB.net, non VB6.
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 ha scritto nel messaggio

Premetto che secondo me stai sbagliando approccio al problema.
Comunque
1) per evitare che un form si chiuda basta che nell'evento QueryClose (se
non ricordo male il nome) imposti e.Cancel = True.
2) Per sapere se un controllo non è valido non basta controllare che sia
Nothing, ma devi controllare anche che myControl.IsDisposed = False.
Oppure una volta disposto lo forzi comunque a Nothing (nel tuo caso non è
possibile, a meno che non si tratti di form modali).
3) Il metodo corretto è quello di scaricare sempre un form e ricaricarlo
ogni volta, per vari motivi che non ti sto a spiegare.
Se vuoi che la tua classe sia instanziata una sola volta puoi renderla un
Singleton (se cerchi in Google troverai decine di esempi per la sua
implementazione che è tutto sommato banale).


 implementazione che è tutto sommato banale).
ora provo questo metodo
ti ringrazio molto
ciao
Inviato da 
www.mynewsgate.net

scusate
non si era capito



 
ciao
e se volessi ricaricare da capo il form senza rendere la classe un
Singleton, cosa dovrei fare oltre a dare i comandi
myform = new FormClass
myform.Show()
voglio dire, cosa dovrei fare per evitare questo errore ?
 -->Impossibile accedere all'oggetto eliminato di nome "FormClass".
scusa per le domande sicuramente banali, ma non sono ancora 
riuscito a farlo funzionare
ciao
Inviato da 
www.mynewsgate.net

  -->Impossibile accedere all'oggetto eliminato di nome "FormClass".
Con il codice che indichi myform è un form bello nuovo quindi mi pare strano
che se passi da lì tu abbia errori del genere.
Qual è il codice dell'errore?
Hai guardato cosa dice MSDN in proposito?
Ti sei ricordato di fare prima la Dispose() del vecchio form?
Quando un oggetto è IDisposable è buona norma richiamarla, e i Control sono
tutti IDisposable.
Eventualmente puoi provare una cosa del genere (che corrisponde a un
Singleton)
Public Class MyFormDispenser
    Private Shared _MyForm As MyForm1
    Public Shared Property ReadOnly MyForm
        Get
            If Not _MyForm Is Nothing Then
                If Not _MyForm.IsDisposed Then
                    _MyForm.Dispose()
                End If
            End If
            _MyForm = New MyForm1
            Return _MyForm
        End Get
    End Property
End Class
Ogni volta che richiamerai
MyFormDispenser.MyForm.Show()
ti si mostrerà un form nuovo (almeno questa è la teoria, non l'ho provato).


 che se passi da lì tu abbia errori del genere.
ciao
scusa, a furia di fare prove ho fatto un sacco di errori.
ora sono ripartito da capo e effettivamente funziona, 
anche se non penso di aver fatto una cosa sensata
vi scrivo un pezzo del codice che ora funziona, magari
se trovate dei grossi errori puo' essere utile farli vedere a tutti
a scopo didattico
 
ho fatto cosi':
nel form in questione (di nome fc, classe FormClient):
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
                   System.EventArgs) Handles Button1.Click
    fc.Hide()    ' forse non serve, basta il dispose (?)
    fc.Dispose()
End Sub
nel form principale invece:
Private Sub MenuItem10_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles MenuItem10.Click
    If fc.Visible = False Then
        fc.Dispose()    ' forse e' un errore visto che ho messo il dispose 
                        ' anche nella Sub Button1_Click, pero' ho preferito
                        ' metterlo, e poi sembra non dia problemi
        fc = New FormClient
        fc.MdiParent = Form.ActiveForm
        fc.Show()
    Else
        fc.Hide()
        fc.Dispose()
    End If
End Sub
Inviato da 
www.mynewsgate.net

 End Sub
Mi sembra molto pasticciato.
Inoltre se fc è disposta fc.Visible potrebbe andare in errore, e l'uso di
fc.Visible implica che ti fidi dell'implementazione di FormClient che
nasconde il form prima di distruggerlo.


 nasconde il form prima di distruggerlo.
no ho capito bene l'ultima cosa, comunque provo a correggere
ciao
Inviato da 
www.mynewsgate.net

 no ho capito bene l'ultima cosa, comunque provo a correggere
Non devi confondere la classe con l'istanza.
