PDA

View Full Version : [VB.NET 2010] Eseguire ciclo una sola volta


rocketA
16-12-2010, 12:03
salve a tutti,
ho rinvenuto questo codice che dopo un tot di tempo d'inattivita' da parte dell'utente (per prova ho impostato 3 secondi), dovrebbe aprire un nuovo form.
Ho creato 2 form (Form1, Form2) e un timer (Timer1)


Public Class Form1
Private Structure POINTAPI
Dim X As Integer
Dim Y As Integer
End Structure

Dim MousePos As POINTAPI 'holds mouse position
Dim mdtLastKBorMouseEvent As Date
Dim mbIsIdle As Boolean
Dim sysLogOffSecs As Integer = 3

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Public Sub subDetectIdle()
Dim bIsIdle As Boolean
Dim tCurrentPos As POINTAPI
Dim lDiff As Integer
bIsIdle = True
tCurrentPos.X = CInt(Windows.Forms.Cursor.Position.X.ToString)
tCurrentPos.Y = CInt(Windows.Forms.Cursor.Position.Y.ToString)
'Mouse Moved?
If (MousePos.X < tCurrentPos.X) Or (MousePos.Y <>
tCurrentPos.Y) Then
bIsIdle = False
MousePos.X = tCurrentPos.X
MousePos.Y = tCurrentPos.Y
End If
If Not bIsIdle Then 'Not idle...
'Not idle... Update Current Time variable
mdtLastKBorMouseEvent = Now
'Make sure the module level var is set correctly
mbIsIdle = False
Else
'Currently Idle. See how long
If mbIsIdle = False Then
'Number of seconds elapsed?
lDiff = DateDiff(Microsoft.VisualBasic.DateInterval.Second, mdtLastKBorMouseEvent, Now)
If lDiff >= sysLogOffSecs Then
mbIsIdle = True
End If
End If
End If
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Call subDetectIdle()
If mbIsIdle = True Then
Dim frm As New Form2()
frm.ShowDialog()
End If
End Sub

End Class


Detto questo, vorrei far si' che una volta aperto il Form2, tutto si fermi, ovvero che ne venga aperta una sola istanza e stop.
Mi scuso per la banalita' della richiesta, ma proprio non ne vengo fuori.
Prego risposte terra-terra, ho cominciato con vb... ieri.
grazie

MarcoGG
16-12-2010, 14:03
Mi sembra un codice molto prolisso...
Inoltre mi basta vedere una riga come :
lDiff = DateDiff(Microsoft.VisualBasic.DateInterval.Second, mdtLastKBorMouseEvent, Now)
per pensare un po' maluccio...

Domanda : ma alla chiusura di Form2 il ciclo di controllo deve riprendere ?
Cioè, se passano altri 3 sec. la Form2 viene mostrata di nuovo ?

rocketA
16-12-2010, 14:10
no, non deve riprendere.

MarcoGG
16-12-2010, 14:13
E l'azione del mouse va controllata solo in relazione a Form1 o anche se l'utente muove il mouse al di fuori dei limiti di Form1 ?

rocketA
16-12-2010, 14:19
anche al di fuori del form.
diciamo che impostato un tempo d'inattivita', devo aprire un form a tutto schermo. avevo fatto una cosa del genere tirando in ballo lo screensaver (verifica se il file xxx.scr e' in esecuzione), ma anche li' mi si aprivano form multipli, uno al secondo... e soprattutto quest'operazione interrompeva lo screensaver, che in realta' poteva anche starci.

MarcoGG
16-12-2010, 14:35
La soluzione con minore impatto su quanto hai già scritto, posto che tutto il resto funzioni come deve, è questa :
If mbIsIdle = True Then
Timer1.Enabled = False
Dim frm As New Form2()
frm.ShowDialog()
End If
In pratica disabilitare il Timer con Timer1.Enabled = False, subito PRIMA le istruzioni per l'istanza di Form2.

rocketA
16-12-2010, 14:45
...ma certo!!! :doh:

grazie 1000, preziosissimo!