Fermer le formulaire après 10 secondes
Question
J'ai une application sous forme de fenêtres qui ouvrira d'autres formes, mais affiche uniquement les formes pendant quelques secondes (configurable par l'utilisateur). Je normalement faire quelque chose comme threading.thread.sleep (n), mais lorsque vous faites cela, les formes de contrôle ne se charge pas seulement les émissions de fond blanc, et je l'ai aussi lu que ce ne est pas la meilleure pratique pour ce que je suis après que l'utilisateur entrée ne seront pas traitées jusqu'à ce que le fil se réveille.
Je suis venu à travers les personnes qui utilisent System.Timers.Timer (n), mais je me bats pour obtenir ce travail pour moi, la forme ne ouvrir et fermer tout de suite (vous ne pouvez voir un flash comme la forme ouvre puis ferme).
Le code que j'utilise est:
Private Shared tmr As New System.Timers.Timer
aForm.Show()
tmr = New System.Timers.Timer(aSleep * 60 * 60)
tmr.Enabled = True
aForm.Close()
Tout cela est contenu dans un sous privé qui passe la forme et la durée de fonctionnement défini.
Mon intention est d'avoir la principale application en cours d'exécution de la barre des tâches, qui appelle ensuite l'une des formes qui affiche pour une période de temps définie, fermez le formulaire, puis appeler un autre des formes.
est une mesure de me diriger dans la bonne direction pour pourquoi la forme ouvre puis ferme sans voir à travers le temps d'exécution défini (j'ai testé avec 10 secondes), ou est-il une meilleure façon de faire ce que je cherche?
Votre aide est grandement appréciée.
Matt
La solution
les docs disent qu'il ya un gestionnaire d'événements qui est appelé Elapsed lorsque le temps est écoulé de. Vous fermez le formulaire dans le gestionnaire:
http: // msdn. microsoft.com/en-us/library/system.timers.timer%28VS.85%29.aspx
Je viens d'écrire un petit exemple qui montre ce que vous devez faire à:
http://www.antiyes.com/close-form-after- 10 secondes
Voici le code correspondant, la solution complète peut être téléchargée à partir de l'article.
Formulaire 1 code
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
Code formulaire 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
Bien sûr, pour ce code fonctionne, vous auriez besoin d'une configuration de formulaires avec les boutons.
Autres conseils
Votre code définit une minuterie puis ferme immédiatement la forme. La fermeture doit être fait lorsque l'événement se déclenche la minuterie.
Je pense que je peux développer la réponse un peu de Jonathan.
Sur la forme que vous souhaitez afficher pour une quantité donnée de temps, ajouter une minuterie (dans cet exemple, la minuterie est nommé Timer1 ... Timers se trouvent dans le toolbax, juste faites-le glisser sur le formulaire)
Pour avoir la forme étroite après avoir été affiché pendant un certain laps de temps démarrer la minuterie dans la méthode onload du formulaire:
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
Cela va démarrer votre minuterie. Lorsque le temps est écoulé de présélection, l'événement tique se déclenche. Dans ce lieu de l'événement de votre code de fermeture de formulaire:
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
Pour changer combien de temps devrait s'écouler avant que les tiques de la minuterie, modifiez la propriété intervalle de minuterie.
'Changing the time from outside the Form1 class...
Form2.Timer1.Interval = 2000 '2 seconds, the interval is in milliseconds.
code complet, form1 a un bouton qui définit le intervalle de minuterie et ouvre alors 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
J'espère que cette aide, laissez-moi savoir si je peux répéter quoi que ce soit d'une façon plus claire: -)
Il suffit de coller un composant de temps sur la forme et l'activer. Dans le gestionnaire d'événements tick, déterminer depuis combien de temps la forme ouverte et si la période prévue a, fermez le soit écoulé sous forme.
En permettant à la poignée de Form_Load revenir pendant que vous attendez pour l'événement Tick, la forme est autorisé à peindre et faire tout le reste il le ferait normalement.
Alors que vous pouvez créer le temps à partir du code que vous faites, je ne sais pas pourquoi vous. Et vous avez certainement besoin de définir un gestionnaire pour l'événement Cochez pour lui faire du bien.
Une façon simple réelle d'ouvrir un formulaire pour un temps de jeu (et dans cet exemple) sautera minuterie si frmTemperatureStatus est fermé. J'ouvre frmTemperatureStatus comme une forme normale non pas comme une boîte de dialogue sinon le code passe à ce formulaire et ne retourne pas jusqu'à ce que le formulaire est fermé. Les DoEvents maintient frmTemperatureStatus réactif (Note: frmTemperatureStatus gardera perdre le focus si vous ligne de code de test en ligne comme mise au point continue de retourner à 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