Prblema con Application.DoEvents

mercoledì 04 maggio 2016 - 20.43
Tag Elenco Tags  VB.NET  |  Windows 7  |  Visual Studio 2010  |  Access (.mdb)

Italo_vb6 Profilo | Newbie

Come ho già detto nel precedente thread, sto cercando convertire una mia applicazione da vb6 a vbNet.
Qualcuno sa dirmi perché per far intercettare l'evento in sub GestioneErrori devo premere uno dei due button due volte ???
Questo è il codice:

Private Sub GestioneErrori()
CkErrore = True
Risposta = ""
Beep()
LblMessaggio.Visible = True
BntNo.Visible = True
BntSi.Visible = True
DisabilitaPulsanti()
Do Until CkErrore = False
Thread.Sleep(5)
Application.DoEvents()
Loop
End Sub
_____________________________________________________________________________________________________________

Private Sub BntNo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntNo.Click
WsQuestion = False
Risposta = "No"
BntNo.Visible = False
BntSi.Visible = False
LblMessaggio.Text = ""
AbilitaPulsanti()
CkErrore = False
End Sub
_____________________________________________________________________________________________________________

Private Sub BntSi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntSi.Click
WsQuestion = False
Risposta = "Si"
BntNo.Visible = False
BntSi.Visible = False
LblMessaggio.Text = ""
AbilitaPulsanti()
CkErrore = False
End Sub

AntCiar Profilo | Expert

ciao.

l'affermazione "perché per far intercettare l'evento in sub GestioneErrori devo premere uno dei due button due volte" è un poco ambigua e vedendo il codice l'unica anomalia (non so fino a che punto sia una anomalia oppure vuoi proprio che sia così) che noto è questa:

Nell sub GestisciErrore hai alla fine questo pezzo di codice

Do Until CkErrore = False
Thread.Sleep(5)
Application.DoEvents()
Loop

In pratica inizia un loop infinito fino a che non diventa a true la variabile 'CkErrore '
Il problema è che all'interno del blocco 'do until' non c'è niente che possa far cambiare il valore di CkErrore e uscire dal ciclo.
Dal codice che hai postato l'unico modo per uscire dal ciclo è cliccare su uno dei due bottoni.
Cristian Barca

Italo_vb6 Profilo | Newbie

Ciao AntCiar, scusa il ritardo ma ho avuto dei problemi......

Perché l'affermazione "perché per far intercettare l'evento in sub GestioneErrori devo premere uno dei due button due volte" è un poco ambigua ?
Cliccare due volte sul button significa proprio cliccare due volte ( la prima volta il programma non intercetta l'evento)
Hai capito bene; per uscire dal loop l'unico modo è cliccare su uno dei button ed è proprio questo che voglio.
Il problema e che i click sul button devono essere DUE.
Posto il codice completo per una maggiore comprensione.

Private Sub BntUscita_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntUscita.Click
ConfermaUscita()
If CkUscita Then
ChiudiConnessione()
End
End If
End Sub

Private Sub ConfermaUscita()
CkUscita = False
WsQuestion = True
LblMessaggio.Text = "Uscire dall'applicazione ?"
GestioneErrori()
If Risposta = "Si" Then
Risposta = ""
CkUscita = True
End If
End Sub

Private Sub GestioneErrori()
CkErrore = True
Risposta = ""
Beep()
LblMessaggio.Visible = True
If WsQuestion = True Then
BntSi.Visible = True
BntNo.Visible = True
Else
BntOk.Visible = True
End If
DisabilitaPulsanti()
Do Until CkErrore = False
Thread.Sleep(50)
Application.DoEvents()
Loop
End Sub

Private Sub BntNo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntNo.Click
WsQuestion = False
Risposta = "No"
BntNo.Visible = False
BntSi.Visible = False
BntOk.Visible = False
LblMessaggio.Text = ""
AbilitaPulsanti()
CkErrore = False
End Sub

Private Sub BntSi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntSi.Click
WsQuestion = False
Risposta = "Si"
BntNo.Visible = False
BntSi.Visible = False
BntOk.Visible = False
LblMessaggio.Text = ""
AbilitaPulsanti()
CkErrore = False
End Sub

Private Sub BntOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BntOk.Click
WsQuestion = False
Risposta = "Ok"
BntNo.Visible = False
BntSi.Visible = False
BntOk.Visible = False
LblMessaggio.Text = ""
AbilitaPulsanti()
CkErrore = False
End Sub

L'applicazione sulla quale sto lavorando per convertirla da Vb6 a Net, è visibile in questi due link di presentazione:
https://youtu.be/4SXhPb-ck2s
https://youtu.be/f-xSW86Muog
Chi volesse può anche approfondire l' argomento, magari aprirò un' altro thread.

Qui tutto funziona alla grande compreso il famigerato Application.DoEvents() ( semplicemente DoEvents in Vb6)

AntCiar Profilo | Expert


>Perché l'affermazione "perché per far intercettare l'evento
>in sub GestioneErrori devo premere uno dei due button due volte"
>è un poco ambigua ?

Perchè all'interno del metodo GestioneErrori non avevi nessun "ascolto" di eventi e perciò non riuscivo a capirela tua domanda.

Per quanto riguarda i bottoni invece è strano e a dirla tutta quasi impossibile che al primo click non scateneni il relativo handler.
Il codice è corretto (parlo dell'handler dei bottoni).
Hai provato a mettere un breakpoint sull'evento di uno dei bottoni per vedere se effettivamente si scatena?
Non è che da qualche altra parte nel codice non fai un 'remove handler' proprio dell'evento dul bottone e poi da qualche altra parte fai un add handler?

Cristian Barca

Italo_vb6 Profilo | Newbie

Breakpoint sull'evento di uno dei bottoni provato e effettivamente l'evento si scatena, ma al SECONDO click.

Escludo che da qualche altra parte nel codice venga attivato il 'remove handler' dei button perché l'inconveniente si manifesta anche solo con questa parte di codice. Se vuoi capirci di più puoi fare come ho già fatto io.

Apri una Nuova Applicazione Windows Form contenente:
1 Label (LblMessaggio)
1 Button (BntUscita)
1 Button (BntNo)
1 Button (BntSi)
1 Button (BntOk)


Imports System.Threading (Per lo Sleep)

Public Class Form1

dichiara la variabili :
Dim Risposta As String
Dim CkUscita, WsQuestion,CkErrore As Boolean

incolla il codice postato senza le chiamate a AbilitaPulsanti e DisabilitaPulsanti() (sennò chiaramente ti dà errore) e fallo girare
Vedrai che se non clicchi due volte su uno dei due pulsanti non succede niente.
Perché ?

P.S.
Ho letto sul tuo profilo che sei appassionato di musica. Hai dato un' occhiata ai link ?
Mi piacerebbe conoscere il tuo parere sul mio lavoro.

Italo

AntCiar Profilo | Expert

Ho provato.
In pratica la prima volta funziona bene.
le volte successive il loop fa si che quando clicchi su Si o No il bottone non prende subito il focus e quindi sembra che devi fare doppio click per farlo funzionare.
per risolvere basta che sposti il focus su uno dei due bottoni all'interno del metodo GestioneErrori.

If WsQuestion = True Then
BntSi.Visible = True
BntNo.Visible = True
BntNo.Focus()
Else
BntOk.Visible = True
End If

Io per prova l'ho spostato sul bottone No
Cristian Barca

Italo_vb6 Profilo | Newbie

Bravo Cristian !!!
Mi hai aiutato molto; anche se fare come dici tu non risolve il problema, perchè obbliga l'utente a cliccare solo sul button con il focus.
Se però uso l'istruzione Me.Focus() tutto va alla grande.
Rimane il mistero del perchè durante il loop, il form perda il focus...... indagherò
ciao e grazie della disponibiltà.

P.S.
non hai risposto al precedente P.S.

Italo

AntCiar Profilo | Expert

ciao.
Non ho ancora avuto modo di vedere i link su youtube.
Appena risco ci do una occhiata.
Cristian Barca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5