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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top