Newsgroup: it.comp.lang.visual-basic
Titolo: Withevents con MDI Form

Bene, il giochino di dichiarare una variabile con il suo stesso
nome e con la proprietà withevents per poter dire alla fine
set miavar = nothing ed effettivamente distruggere un oggetto,
chissà per quale motivo con le mdiform non funziona.
Non ci sta verso di riuscire a sapere quando una mdiform
viene scaricata ... ed impostarla effettivamente a nothing.
Risultato, se da una form di login faccio per la seconda volta
dopo una logoff di programma frmmain.show beh il metodo
initialize viene tranquillamente ignorato perchè per il vb la form
è già stata inizializzata seppur scaricata dal suo stesso unload.
Bene ... come ca00o faccio a risolvermi sta bega?
-- 
Saluti
Andrea Moro
Sito Comune : 
http://www.it-lang-vb.net

Bene ... come ca00o faccio a risolvermi sta bega?
IMHO il problema e' da un'altra parte.
Se non mi si scarica un form, MDI, child o normale vuol dire che mi e'
scappato qualcosa.
-- 
ciao, hal

hal1961 (
aldoc...@inwind.it
) ha scritto, tanto per cambiare ...

No ... non è che non mi si scarica ... quello lo fa perfettamente, tanto
che se poi premo sul fatidico cancel della login form, il controllo
viene restituito al vb senza una piega.
Il problema - ripeto - è lo stesso già riscontrato con le form normali.
Se provi a fare un progetto vuoto, con due form, dentro a form1 ci
metti due bei pulsanti uno con form2.show e poi un
unload form2 ... e qualche cosa dentro
al metodo initialize di form2, tipo una textbox e nell'initialize text1.text
= "ciccio",
vedi che la seconda volta che fai lo show di form2, il metodo initialize
viene tranquillamente ignorato.
*** codice di form1
Option Explicit
Private Sub Command1_Click()
  form2.Show
End Sub
Private Sub Command2_Click()
  Unload form2
End Sub
*** codice di form2
Option Explicit
Private Sub Form_Initialize()
  Text1.Text = "ciccio"
End Sub
Questo perchè quel cazzone di vb si accorge che la classe, nello scope
del progetto, è già stata inizializzata e secondo lui non  necessita di
reinizializzazioni, nonostante ne sia stato fatto l'unload.
Bene, ora facciamo un paio di modifiche per farti vedere quello che
intendo (ti manderei volentieri un esempio sul ng, ma non si accettano
binari, quindi mi astengo).
*** codice di form1
Option Explicit
Private WithEvents form2 As form2
Private Sub Command1_Click()
  Set form2 = New form2
  form2.Show
End Sub
Private Sub Command2_Click()
  Unload form2
End Sub
Private Sub form2_Unload()
  Set form2 = Nothing
End Sub
*** codice di form2
Option Explicit
Event Unload()
Private Sub Form_Initialize()
  Text1.Text = "ciccio"
End Sub
Private Sub Form_Unload(Cancel As Integer)
  RaiseEvent Unload
End Sub
Adesso, se tu apri e chiudi form2 ... vedrai che ogni sacrosantavolta
passa per il metodoinitialize, questo perchè con quell'impostazione
a nothing, vb scarica completamente l'oggetto dal suo scope.
Attenzione, è necessario che l'oggetto withevents abbia lo stesso identico
nome della form. Anche se in pochi lo sanno, vb quando si apre si
crea una variabile nascosta con lo stesso nome della form, con la quale
poi ci permette di gestire gli eventi.
Ok. detto questo, se tu applichi lo stesso concetto ad un form mdi,
il giochino non funziona. O eviti - come ho fatto io per risolvere - di
usare l'initialize della form mdi, opppure aspetti che qualcuno più bravo
di me sul ng risponda :(


End Sub
Mai, mai, mai, mai e poi mai accedere a controlli e/o proprieta'
intrinseche di un form durante il suo Initialize, perche' ne scateni
automaticamente il Load.
-- 
ciao, hal

 più bravo di me sul ng risponda :(
Nessuno è più bravo di nessuno!!!
è solo una questione di cercare il difficile nel facile ,IMHO
In un progetto con
MDIFORM
2 FORM MDICHILD=true
Form1 ->form di avvio
Form1
2 pulsanti
Dim f As Form2
Private Sub Command1_Click()
Set f = New Form2
f.Show
End Sub
Private Sub Command2_Click()
Unload f
Set f = Nothing
End Sub
Form2
Private Sub Form_Initialize()
MsgBox "initialize"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MsgBox "unload"
End Sub
Ciao
Alessandro
--
Morfeus®
Free Joint
 :PII

hal1961 (
aldoc...@inwind.it
) ha scritto, tanto per cambiare ...

Ok ... su questo ci siamo, ma quello è un esempio che ti ho fatto per
mostrarti
che comunque volente o nolente, il form2 viene scaricato e reinizializzato
alla successiva chiamata di show -> load -> initialize
E comunque non è il mio caso ... nel mio mdiform initialize ho
un set miavar = new oggetto e un paio di variabili che resetto al loro
valore originale, quindi nessuna proprietà di oggetti esposti fisicamente
sul form ....


No ... il problema non è qui ... il problema è l'unload
del form mdi non dei suoi child.


 del form mdi non dei suoi child.
Cioè fammi capire io ho un form mdichild=false
due pulsanti all'interno del form
il primo fà lo show del MdiForm
il Secondo l'unload
giusto?
Se si prova il codice da me precedentemente postato e
riparliamo...
te lo riscrivo per vedere se ho capito ma il problema
rimane che le cose facili sono facili...
*********MDIForm1
Private Sub mdiForm_Initialize()
MsgBox "initialize"
End Sub
Private Sub mdiForm_Unload(Cancel As Integer)
MsgBox "unload"
End Sub
**********Form1
Dim f As MDIForm1
Private Sub Command1_Click()
Set f = New MDIForm1
f.Show
End Sub
Private Sub Command2_Click()
Unload f
Set f = Nothing
End Sub


 End Sub
proprio lui ... il problema - mio - in questo caso č che
appena un oggetto toolbar datadynamics (ma penso anche
qualsiasi altro oggetto) va a fare f.toolbar.bands(1).tool(2).visible =
false
o qualsiasi altra cosa ... vb mi dice impossibile dichiarare mdiform1
2 volte ...
ed inoltre se vai a dichiarare con il withevents f ... e tento un f =
nothing
la volta successiva che lo ricarichi, ti da lo stesso errore poc'anzi detto.


 detto.
Senti o la dici tutta o non si capisce una mazza.Mi ripeto il codice di cui
sopra
il msgbox "Initialize" te lo fa vedere ad ogni click sul Command1....


sul form ....
E gli oggetti che istanzi, cosa fanno a loro volta?
-- 
ciao, hal

 il msgbox "Initialize" te lo fa vedere ad ogni click sul Command1....
Il tuo codice funziona, quando lo vado ad inserire dentro al mio progetto.
Ma non ti sò dire il come ed il perchè ... mi da quel diavolo di messaggio
che la form mdi è già stata caricata e non la si può caricare due volte.


 può caricare due volte.
O eviti di rispondere o provi prima o aspetti
l'avevi detto tu,ma non l'hai detto perchè ne sei convinto...
;)
Molto probabilmete a te non funziona a Logni effettuato ma io non posso
indovinarle
ste cose...:(
La variabile f deve avere maggiore visibilità
Publica in un modulo
e nell'evento unload del tuo MDIFORM
metti
Unload f
set f=Nothing
Ciao
Alessandro


Beh uno è una dll, mia che si preoccupa di fare il middletier con il db.
Chiaramente quello che fa nella new è solo di caricarsi e mettere
il valore di default alle proprietà.
L'altro è un oggetto dd, la toolbar, che mi fa vedere un pò di bottoni.
Per il resto sono tutte variabili impostate e basta.
Ma il problema credo di averlo risolto ... anzi risolto ... è che tentavo
di acchiappare gli eventi di formmain, con una routine che rifletteva
le proprietà di formmain con la byref ... in sostanza era come fare
private withevents f as mdiform dentro alla form mdiform ....
non si può ...
Grazie per l'inutile quisquilia a cui vi ho sottoposti.


MorfeusŽ (
DonDiego...@hotmail.com
) ha scritto, tanto per cambiare ...
Lascia perdere ... ho trovato l'inghippo ... leggi sopra


 Lascia perdere ... ho trovato l'inghippo ... leggi sopra
Bravo...


 scappato qualcosa.
Ci sono forse Timer ? 
Recordset lasciati aperti ? 
MaledettoAutoshowChildrem a true ? 
-- 
<Gigio2K>
Sito Comune
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/