Chiudi modulo dopo 10 secondi
Domanda
Ho un'applicazione Windows Form che si aprirà altre forme, ma visualizzerà solo i moduli per alcuni secondi (configurabile dall'utente). Io normalmente fare qualcosa di simile threading.thread.sleep (n), ma quando si fa questo le forme controlli non vengono caricati solo lo sfondo bianco spettacoli, e sono stato anche letto che questo non è la migliore pratica per quello che sono dopo come utente ingresso non viene azionato fino a quando il filo si sveglia.
Mi sono imbattuto in persone che utilizzano System.Timers.Timer (n), ma sto lottando per ottenere questo a lavorare per me, il modulo sarà solo aprire e chiudere subito (si può vedere solo un lampo come apre il modulo quindi chiude).
Il codice che sto usando è:
Private Shared tmr As New System.Timers.Timer
aForm.Show()
tmr = New System.Timers.Timer(aSleep * 60 * 60)
tmr.Enabled = True
aForm.Close()
Questo è tutto contenuto all'interno di un sub privato che passa il modulo e il tempo di esecuzione definito.
La mia intenzione è quella di avere l'applicazione principale che va dalla barra delle applicazioni, che poi chiama una delle forme che visualizzeranno per un periodo di tempo definito, chiudere il modulo, quindi chiamare un altro una delle forme.
Qualche materiale in grado di puntare a me nella giusta direzione per il motivo per cui la forma si apre poi chiude senza vedere attraverso il tempo di funzionamento definito (ho testato con 10 secondi), o c'è un modo migliore di fare quello che sto cercando?
Il vostro aiuto è molto apprezzato.
Matt
Soluzione
i documenti dicono che c'è un gestore di eventi Elapsed che viene chiamato quando il tempo è trascorso. Si potrebbe chiudere il modulo nel gestore:
http: // MSDN. microsoft.com/en-us/library/system.timers.timer%28VS.85%29.aspx
Ho appena scritto un piccolo esempio che mostra quello che si avrebbe bisogno di fare a:
http://www.antiyes.com/close-form-after- 10-secondi
Di seguito è riportato il codice in questione, la soluzione completa può essere scaricata da questo articolo.
Modulo 1 codice
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim frm2 As New Form2()
frm2.ShowDialog()
End Sub
End Class
codice Modulo 2
Imports System.Timers
Public Class Form2
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Dim tmr As New System.Timers.Timer()
tmr.Interval = 5000
tmr.Enabled = True
tmr.Start()
AddHandler tmr.Elapsed, AddressOf OnTimedEvent
End Sub
Private Delegate Sub CloseFormCallback()
Private Sub CloseForm()
If InvokeRequired Then
Dim d As New CloseFormCallback(AddressOf CloseForm)
Invoke(d, Nothing)
Else
Close()
End If
End Sub
Private Sub OnTimedEvent(ByVal sender As Object, ByVal e As ElapsedEventArgs)
CloseForm()
End Sub
End Class
Naturalmente per questo codice funzioni avresti bisogno di installazione forme con i tasti.
Altri suggerimenti
Il tuo codice imposta un timer quindi chiude immediatamente la forma. La chiusura deve essere fatto quando l'evento timer.
penso di poter ampliare la risposta di Jonathan un po '.
Nel modulo che si desidera visualizzare per un determinato periodo di tempo, aggiungere un timer (in questo esempio il timer prende il nome Timer1 ... Timer può essere trovato nel toolbax, basta trascinarlo nel form)
Per avere la forma stretta dopo che è stato visualizzato per un determinato periodo di tempo avviare il timer nel metodo OnLoad della maschera:
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Do initialization stuff for your form...
'Start your timer last.
Timer1.Start()
End Sub
Questo farà partire il timer. Quando gli è trascorso di tempo prestabiliti, l'evento Tick scatta mai. In questo luogo il codice evento di chiusura forma:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'Close the form after 1 tick.
Me.Close()
End Sub
Per modificare il tempo che deve trascorrere prima che le zecche timer, modificare la proprietà intervallo del timer.
'Changing the time from outside the Form1 class...
Form2.Timer1.Interval = 2000 '2 seconds, the interval is in milliseconds.
codice completo, form1 ha un pulsante che imposta l'intervallo del timer e quindi apre form2.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.Timer1.Interval = 2000
Form2.Show()
End Sub
End Class
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Do initialization stuff for your form...
'Start your timer last.
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.Close()
End Sub
End Class
Spero che questo aiuta, fatemi sapere se posso ribadire tutto ciò in un modo più chiaro: -)
Just bastone un componente temporale sulla forma e abilitarlo. Nel gestore di eventi zecca, determinare per quanto tempo poiché la forma aperta e se il periodo previsto è trascorso, chiudere il modulo.
Per consentire la maniglia Form_Load per tornare mentre si attende per l'evento Tick, la forma è permesso di dipingere e fare tutto il resto si farebbe normalmente.
Mentre si potrebbe creare il tempo da codice come si sta facendo, io non sono sicuro perché si farebbe. E è assolutamente necessario impostare un gestore per l'evento Tick per poter fare nulla di buono.
Un vero modo semplice di apertura di una maschera per un tempo impostato (in questo esempio) salterà timer se frmTemperatureStatus è chiuso. Sto aprendo frmTemperatureStatus come forma normale non come una finestra di dialogo in caso contrario il codice salti a questa forma e non ritorna fino a quando il form viene chiuso. I DoEvents mantiene frmTemperatureStatus reattivo (Nota: frmTemperatureStatus manterrà perdere la concentrazione se la linea codice di prova per riga come messa a fuoco continua di nuovo andare a Visual Studio).
timeIncubation_End_Time = Now.AddMinutes(1)
Me.Enabled = False
frmTemperature_Status.Show()
Do While frmTemperature_Status.Visible And timeIncubation_End_Time > Now
Application.DoEvents()
Threading.Thread.Sleep(100)
Loop
frmTemperature_Status.Close() ' This line doesn't cause an error if the form is already closed
Me.Enabled = True
MsgBox("End of dialog test")
Public Class Form1
Dim second As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1000
Timer1.Start() 'Timer starts functioning
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = DateTime.Now.ToString
second = second + 1
If second >= 10 Then
Timer1.Stop() 'Timer stops functioning
Me.Close()
MsgBox("Timer Stopped....")
End If
End Sub
End Class