Вопрос

У меня есть приложение для формы 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top