Закрыть форму через 10 секунд
Вопрос
У меня есть приложение для формы Windows, которое откроет другие формы, но отобразит формы только в течение нескольких секунд (пользователь настраивается). Обычно я бы делал что -то вроде потока. Ввод не будет действовать до тех пор, пока нить не разбудет.
Я столкнулся с людьми, использующими System.Timers.Timer (n), но я изо всех сил пытаюсь заставить это работать для меня, форма только сразу откроется и закрывается (вы можете увидеть только вспышку, когда форма открывается, затем закрывается) Анкет
Код, который я использую,:
Private Shared tmr As New System.Timers.Timer
aForm.Show()
tmr = New System.Timers.Timer(aSleep * 60 * 60)
tmr.Enabled = True
aForm.Close()
Все это содержится в частном подборе, которая проходит форму и определенное время выполнения.
Мое намерение состоит в том, чтобы основное приложение было запущено из строки задач, которая затем вызывает одну из форм, которые будут отображаться в течение определенного периода времени, закройте форму, а затем вызовут еще одну из форм.
Может ли что -нибудь указывать мне в правильном направлении, почему форма открывается, затем закрывается, не видя определенное время выполнения (я тестировал с 10 секунд), или есть лучший способ сделать то, что я ищу?
Ваша помощь очень ценится.
Матт
Решение
Документы говорят, что есть истекший обработчик событий, который называется, когда время истекает. Вы закроете форму в обработчике:
http://msdn.microsoft.com/en-us/library/system.timers.timer%28vs.85%29.aspx
Я только что написал небольшой пример, который показывает, что вам нужно сделать на:
http://www.antiyes.com/close-form-fter-10-seconds
Ниже приведен соответствующий код, полное решение можно загрузить из статьи.
Форма 1 код
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
Форма 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
Конечно, чтобы этот код работал, вам понадобится настройка форм с помощью кнопок.
Другие советы
Ваш код устанавливает таймер, а затем немедленно закрывает форму. Закрытие должно быть сделано, когда зажигает событие таймера.
Я думаю, что я могу немного расширить ответ Джонатана.
В той форме, которую вы хотите отобразить в течение определенного количества времени, добавьте таймер (в этом примере таймер назван таймером1 ... Таймеры можно найти в баксе для инструментов, просто перетащите его в форму)
Чтобы форма была близко после того, как она была отображена в течение определенного количества времени, запустите таймер в методе нагрузки формы:
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
Это начнет ваш таймер. Когда выйдет на предварительное время, событие Tick будет увольнять. В этом случае поместите код закрытия формы:
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
Чтобы изменить, сколько времени должно пройти до того, как таймер будет тикать, измените свойство интервала таймера.
'Changing the time from outside the Form1 class...
Form2.Timer1.Interval = 2000 '2 seconds, the interval is in milliseconds.
Полный код, Form1 имеет кнопку, которая устанавливает интервал таймера, а затем открывает 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
Я надеюсь, что это поможет, дайте мне знать, если я смогу что-нибудь повторить более четким образом :-)
Просто наклейте на компонент времени и включите его. В обработчике событий Tick определите, как давно с момента открытия формы и, если намеченное время истекает, закройте форму.
Позволяя вернуть ручку Form_load, пока вы ждете события Tick, форма разрешена рисовать и делать все остальное, что обычно.
Хотя вы могли бы создать время из кода, как вы делаете, я не уверен, почему вы бы. И вам определенно нужно установить обработчик для такового события, чтобы он сделал хорошее.
Настоящий простой способ открыть форму для установленного времени (и в этом примере) пропустит таймер, если Frmtemperaturestatus закрыт. Я открываю frmtemperaturestatus как обычную форму, а не как диалог, в противном случае код прыгает в эту форму и не возвращается, пока форма не будет закрыта. DOEVENTS сохраняет отзывчивый FrmTemPeratrestatus (Примечание: FrMTemPeraturestatus будет продолжать терять фокус, если вы тестируете линию кода по линии, поскольку фокус продолжает возвращаться к 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