Newsgroup: it.comp.lang.visual-basic
Titolo: Grave bug VB6 con LostFocus

Ciao a tutti, non so se questo bug è noto, ma mi ha fatto arrabbiare
alquanto.
E' molto semplice: quando scatta un evento LostFocus, e voi ne prendete il
controllo, in realtà non ne prendete completamente il controllo, ma in
certi casi vi sfuggirà di mano.
Create una form con due TextBox, Text1 e Text2.
Digitate il codice che segue.
Fatelo partire e cliccate su Text1.
Successivamente premete Tab per passare su Text2 e... miracolosamente
perdete il controllo dell'evento LostFocus di Text1, dato che partira'
anche l'altra routine!!!
Qualcuno mi da' qualche delucidazione?
In ogni caso, ho chiuso con VB6 :-(
Ciao!
Saverio M.
	Codice:
Private Sub Text1_LostFocus()
MsgBox "Text1_LostFocus Event"
Text1.SetFocus 'QUI SI PERDE IL CONTROLLO!!!!
End Sub
Private Sub Text2_LostFocus()
MsgBox "Text2_LostFocus Event ALSO!!!"
End Sub

 In ogni caso, ho chiuso con VB6 :-(
Per così poco?
Prova a sostituire il tuo codice con questo e a guardare nella finestra di
debug:
Private Sub Text1_GotFocus()
    Debug.Print "Text1_GotFocus"
End Sub
Private Sub Text1_LostFocus()
    Debug.Print "Text1_LostFocus Event"
    Text1.SetFocus
    Debug.Print "Forzato il focus su Text1"
    Debug.Print "Ma finché non esco da questa sub"
    Debug.Print "non si può innescare alcun altro evento in coda"
    Debug.Print "Esco da Text1_LostFocus"
End Sub
Private Sub Text2_GotFocus()
    Debug.Print "Text2_GotFocus"
End Sub
Private Sub Text2_LostFocus()
    Debug.Print "Ora sì che si innesca il Text2_LostFocus!"
End Sub
Ripeti il test. Ora è più chiaro?
In pratica:
- Quando premi TAB si accodano 2 eventi, il LostFocus del Text1 e il
GotFocus di Text2
- Il primo ad essere servito è Text1_LostFocus: in questa sub però si
riforza il focus su Text1. Di conseguenza si accodano altri 2 eventi,
Text2_LostFocus e Text1_GotFocus
- quando si esce dalla routine evento Text1_LostFocus possono essere
processati gli altri 3 eventi in coda
Text2_GotFocus
Text2_LostFocus
Text1_GotFocus
Come vedi la sequenza sarà anche un po' intricata ma è deterministica e non
si perde alcun controllo.
Bye
Raf

 Text1.SetFocus 'QUI SI PERDE IL CONTROLLO!!!!
Cioè, nella lostfocus tu fai partire una MsgBox, che in ogni caso
toglierebbe il focus alla textbox, e poi cerchi di ridare il focus alla
textbox alla quale l'avevi appena tolto... e ti lamenti che nel frattempo
il sistema ha effettivamente dato, e poi tolto (ovviamente) il focus
alla text2, proprio come tu gli hai detto di fare, cliccando qui e lì...
giusto ? :-)))))
Facciamo così, spiega cosa stai *davvero* cercando di fare e poi
se ne riparla, OK ?
Bye, G.

ciao, intanto grazie la risposta :-)
si sono delle cose che non quadrano, e per questo ho parlato di bug.
ehm, non č che sia poi cosě grande in effetti.
comunque passerň a Java e C#, mica abbandono la programmazione :-))))
[ ti pongo anche un'altra domanda nel frattempo, hai idea dei requisiti
minimi per delle applicazioni elementari (interfacce con una decina di
textbox e poca elaborazione, per iniziare) in C#? ]
PRIMO CASO:
Private Sub Text1_LostFocus()
debug.print "Text1_LostFocus Event"
Text1.SetFocus
End Sub
Private Sub Text2_LostFocus()
debug.print "Text2_LostFocus Event"
End Sub
se eseguito regolarmente, fa scattare Text2_LostFocus.
se fai il debug, NON scatta Text2_LostFocus.
questo non mi sembra sensato (effettivamente c'erano dei trucchi in
assembler anti-debugging che avevano effetti simili... ;-) )
SECONDO CASO:
Private Sub Text1_LostFocus()
Debug.Print "Text1_LostFocus Event"
Text1.SetFocus
MsgBox "Dummy MsgBox"
End Sub
Private Sub Text2_LostFocus()
Debug.Print "Text2_LostFocus Event"
End Sub
Sempre supponendo una esecuzione regolare, questa volta non scatta
Text2_LostFocus, a causa del MsgBox posto alla fine di Text1_LostFocus.
Se invece di MsgBox metti Debug.print, Text2_LostFocus scatta.
Potrei supporre che MsgBox sposta il focus, ma Text1_GotFocus (e quindi
successivo LostFocus) dovrebbero essere in coda!
Ciao e grazie!
Saverio M.

 Saverio M.
Bye
Raf

 textbox e poca elaborazione, per iniziare) in C#? ]
Cosě a occhio avrai gli stessi problemi.
Alcune cose non dipendono dal lignuaggio, ma dal sistema operativo.
In genere tendo sempre ad evitare i LostFocus proprio perchč non hanno un
comportamento "stabile".
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 comunque passerò a Java e C#, mica abbandono la programmazione :-))))
...già che ci sei passa alla cassa e compra anche un libro !!!
Che palle!
Passi da vb6 a C# perchè c'è il C vero...???
se si fosse chiamato KL# non ci saresti passato!!!
Potete dir tutto della Microsoft...ma hanno un GRANDE direttore marketing!!!