Newsgroup: it.comp.lang.visual-basic
Titolo: [?] form.show vbmodal in modo ciclico

Ciao a tutti,
ho un problema che.....booo!?!?
Mi spiego:
in Form_Activate di una form ho:
Riparti:  --> etichetta
    CaricaList    --> aggiorno la ListView
    If bChiudi = False Then
        frmVenditeCorpo.Show 1
        GoTo Riparti
    End If
... anche a mo non piace il goto ma sono stato costretto.
La gestione è questa: dalla form in questione, visualizzo la from
frmVenditeCorpo in modale e da quest'ultima inserisco le righe di vendita.
Ogni volta poi chiudo la form frmVenditeCorpo e SOLO se premo il tasto
"ABBANDONA" la var "bChiudi" diventa TRUE e non la visualizzo più.
Se uso il debug la cosa funziona, altrimenti mi dice che il Form è già
visualizzato.
Perchè?
Come posso ovviare?
Grazie a tutti.
Ciao.
Paolo

     CaricaList    --> aggiorno la ListView
      frmVenditeCorpo.Show vbModal '(e non 1!!!)
      bChiudi = frmVenditeCorpo.ModalResult
      unload frmVenditeCorpo
      Set frmVenditeCorpo = Nothing
Loop
Cosě hai diversi vantaggi, tra cui la "pulizia" del codice:
bChiudi non č piů globale ma locale.
ModalResult č una var. pubblica a livello di form, che setti a seconda della
scelta fatta.
Ovviamente frmVenditeCorpo viene solo nascosta al momento della chiusura (č
una pratica pessima quella di fare l'unload da dentro il form modale
stesso), e solo dopo il .Show vbModal viene scaricata.
Ciao

 visualizzato.
Innanzi tutto, puoi tranquillamente eliminare il GOTO e sostituire la
chiamata cosi'
Do While Not bChiudi
    CaricaList    --> aggiorno la ListView
    frmVenditeCorpo.Show vbModal
Loop
a questo punto, supponendo come credo che 'bChiudi' sia una variabile
pubblica a livello di progetto, devi solo assicurarti che il tasto ABBANDONA
della seconda finestra esegua qualcosa di simile a
bChiudi = True
Unload Me
fin qui probabilmente non ti ho detto niente di nuovo; il problema reale e'
il fatto di caricare la seconda form nel Form_Activate della prima... quello
che succede e' l'Activate viene scatenato non solo dopo il caricamento
iniziale, ma anche dopo la prima chiusura della finestra figlia (infatti
essendo modal, viene 'riattivata' la finestra chiamante, che stava dietro) e
questo evidentemente succede prima che frmVenditeCorpo venga considerata
chiusa, con conseguente sovrepposizione degli eventi, che puoi notare dando
un'occhiata allo stack delle chiamate.
Se puoi, cerca di rivedere la logica con cui visualizzi le due finestre in
modo da evitare di basare tutto sull'evento Activate...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:3ca97d9c$1...@news.cis.it...

Grazie per la risposta ma...
NON ho capito il funzionamento del  ModalResult
Ciao.
Paolo


 un'occhiata allo stack delle chiamate.
Ma come posso forzare la chiusura definitiva della form figlia
Ciao.
Paolo


 NON ho capito il funzionamento del  ModalResult
1) bChiudi la dichiari locale nella sub del loop
2) In frmVenditeCorpo dichiari una Public ModalResult As Boolean
3) Nel Ok_Click metti ModalResult = True
E' il form chiamato che deve informare di cosa è stato scelto senza intrecci
con variabili pubbliche di moduli esterni.
Ciao

 ha scritto nel messaggio
news:3ca9...@news.cis.it...

Grazie ancora, ho seguito i tuoi consigli, ma l'errore 400 me lo da cmq.
Sembra che voglia un po di tempo per chiudere la frm figlia (infatti con il
debug funziona)
Non capisco.
Ciao.
Paolo

 Non capisco.
Neanch'io.
Ciao

 DoEvents? Se sì, dove?)
Non so neanche cosa sia DoEvent ora vado a vedere la spiegazione.
Grazie ancora.
Ciao.
Paolo.


 nell'Activate del form chiamante?!?
[SNIP]
Come gia' ti accennavo nell'altro messaggio, il problema e' esattamente
quello... in pratica stai facendo un ciclo in un punto in cui il programma
e' gia' in una situazione di Loop implicita
il fatto di caricare e scaricare una finestra modale nell'evento Activate
della prima form implica che, nella stessa, verranno scatenati una serie di
eventi fintanto che non si verifica una condizione esterna; nel tuo caso la
condizione esterna e' il flag bChiudi (per inciso, segui il suggerimento di
Zanna riguardo al .ModalResult) ma non serve sia innestato in un altro
ciclo, che sia un Loop o un GoTo poco importa...
In pratica, se proprio devi lavorare sull'Activate, e' sufficiente questo:
Private Sub Form_Activate()
If Not bChiudi
    CaricaList
    frmVenditeCorpo.Show vbModal
End If
'Nel momento in cui frmVenditeCorpo viene chiusa si scatena un nuovo evento
'Activate, perche' la prima form prende nuovamente il focus, lo perde dopo
il
'nuovo .Show e lo riprende ancora alla successiva chiusura...
'il ciclo "nascosto" si interrompe quando bChiudi viene impostata.
End Sub


 End If
Finalmente, funziona!!!
Grazie
Ciao.
Paolo.
