Newsgroup: it.comp.os.win.vista
Titolo: Vista - Problemi con DoEvents in applicativo a 16 bit (VB3)

Ho una applicazione in VB6 che utilizza ancora un modulo (eseguibile)
scritto in VB3, il quale funziona perfettamente con 2K o XP e su
alcuni PC con Vista Businness.
Da alcuni giorni su alcuni PC con Vista (sia Businness che Home
Premium) la parte in VB3 mi crea dei problemi.
Ho verificato che il problema si genera al momento dell'uscita da una
Form;
l'esecuzione del codice dopo l'istruzione DoEvents non prosegue, come
se lo scatenarsi di qualche evento non faccia più ritornare il
controllo del codice all'istruzione successiva al DoEvents.
Come effetto la mia form non viene chiusa, solo usando la [X] in alto
a destra sparisce ma il modulo VB rimane attivo (lo vedo con Task
Manager sotto NTVDM).
Naturalmente ho provato a togliere il DoEvent e l'applicativo si
chiude normalmente, ma ciò mi genera altri problemi nel funzionamento
(aggiornamento di controlli ecc...); siccome la riscrittura del modulo
non è immediata vorrei vedere prima se qualcuno ha qualche idea !

non è immediata vorrei vedere prima se qualcuno ha qualche idea !
Secondo me quella e' la strada da seguire (a prescindere): cioe' leva quel 
doevents da li dentro.
Con la X esci e chiudi il tuo programma abbandonando qualunque operazione in 
corso (a fronte di conferma ovviamente).
Se devi uscire confermando dei dato o comunque facendo particolari 
operazioni che richiedono una doeventrs (una presentazione comunque 
all'utente dei risultati) fallo con un pulsante di conferma. Poi all'interno 
del pulsante se hai tutte le condizioni a posto per uscire dal programma 
metti un me.unload o una end.
-- 
Gugu
OIBABOI! (Tutti insiem OiBaBoi)

1) L'applicazione che mi dà il problema è in VB3, ma viene richiamata
da un'altra in VB6 (probabilmente il VB6 non c'entra ma l'ho
specificato nel caso possa servire a dar l'idea dell'insieme)
2) Il problema preciso avviena nell'evento click di un pulsante della
toolbar.
In questa fase, per ogni pulsante premuto, viene messo il fuoco in una
textbox e poi viene richiamato il suo evento Lostfocus in quanto la
textbox è bounded e nell'evento lostfocus vengono aggiornati altri
controlli (tra cui un paio di datacontrol), per riuscire a scatenare
questo meccanismo occorre usare DoEvents, il metodo UNLOAD è solo
l'ultima istruzione nel caso che si prema il tasto per uscire, ma lo
stesso problema ce l'ho con gli altri tasti della toolbar
3) Se elimino il DoEvent in quella fare non mi vengono aggiornati
correttamente gli altri controlli generandomi altri problemi in
maschere successive
Spero di essere stato un pò più chiaro ora, prima ho provato a postare
un messaggio più breve per vedere comunque se qualcuno avava già
riscontrato comportamenti diversi con VISTA

 maschere successive
[cut]
Cazpita che OT :)
Fammi capire, il doevents e' nell' evento unload del form ?
Se si, e' possibile che i controlli del form vengano chiusi
prima che il doevents li faccia "scattare", l'hook del sistema
non trovando il modulo manda il loop il programma, soluzione:
Interrompi l'unload, esegui il doevents in un do-loop che
intercetta una flag o un timer o contatore , quando la
flag e' attivata o il timer/contatore scatta, l'applicazione
si chiude.
Apri VB, crea un form con due bottoni,
una textbox e un timer
apri il codice e incollaci questo:
Private FlagOraChiudi As Boolean
Private Sub Command1_Click()
 Unload Me
End Sub
Private Sub Command2_Click()
 FlagOraChiudi = True
End Sub
Private Sub Form_Load()
 Timer1.Interval = 1000
 Timer1.Enabled = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
 Cancel = True
 Do
  DoEvents
 Loop Until FlagOraChiudi = True
 End
End Sub
Private Sub Timer1_Timer()
Text1.Text = Time
End Sub
Il bottone 1 chiede la chiusura
dell'applicazione, ma l'applicazione non
chiudera' (l'orologio viene aggiornato)
finche' non cliccherai il bottone 2.
---
Va' da se che se devi attendere (esempio)
che 10 controlli vengano aggiornati, puoi
dichiarare FlagOraChiudi come numero, quando
viene premuto il bottone "chiudi" viene messo
a ZERO, ed ogni evento incrementa di 1 il
FlagOrachiudi controllando che se supera
un numero X viene riazzerato per evitare
overflow, es:
Private sub TextboxCheDeveAggiornarsi_lostfocus()
 FlagOrachiudi=FlagOraChiudi +1
 If FlagOrachiudi > 30 then FlagOraChiudi =0
End Sub
QUindi nell'evento unload il do-loop
diviene
 Do
  DoEvents
 Loop Until FlagOraChiudi < 10
Oppure generi l'uscita ritardando con un timer
Private Sub Form_Unload(Cancel As Integer)
 Dim TimerChiudi
 Cancel = True
 TimerChiudi= Timer + 5 ' Aspetta 5 secondi
 Do
  DoEvents
 Loop Until TimerChiudi < timer
 End
End Sub
Se usi questo metodo pero' ricorda
che c'e' un problema a mezzanotte: il timer
viene rimesso a ZERO, quindi il conteggio
andrebbe a farsi benedire, va' aggiunto
un controllo supplementare:
Private Sub Form_Unload(Cancel As Integer)
 Dim TimerChiudi
 Cancel = True
 TimerChiudi= Timer + 5 ' Aspetta 5 secondi
 If TimerChiudi > 86400 then 'e' quasi mezzanotte ?
  Timerchiudi = Timerchiudi - 86400 'reimposta il timerchiudi
 End If
 Do
  DoEvents
 Loop Until TimerChiudi < timer
 End
End Sub 

questo meccanismo occorre usare DoEvents
Io non mi fiderei di questi meccanismi: la programmazione ad eventi e' per
sua natura indeterminata e andarla a scatenare manualmente per svolgere
particolari compiti e' assai rischioso.
Piuttosto togli il codice che hai nei vari eventi (LostFocus) e mettilo in
SUB che puoi richiamare manualmente quando vuoi, non avrai in questo modo
bisogno della doevents. Se ti fai un giro per la rete scopri che la doevents
non piace molto non solo a :-(


 sua natura indeterminata ...
Quello che più mi preme di capire è il "differente" comportamento tra
Vista e XP non tanto l'uso di DoEvent o degli Eventi (che lo conosco
perfettamente!)
Grazie comunque per il disturbo