Countdown reset tramite KeyPress

di il
11 risposte

Countdown reset tramite KeyPress

Ciao Ragazzi,
premetto che sto iniziando da poco a programmare in c# e provengo da Vba (forse quindi ho la mente ancora chiusa allo stile di programmazione usato fin ora).
Ho realizzato un form in cui ho una Label ed un bottone che mi fanno da "Timer".
Vorrei fosse possibile resettare il timer se vengono premuti i tasta a e b della tastiera.
Purtroppo non ci riesco, o meglio, non riesco a capire bene come funzionano le Keypress events.
Dovrei tenerle fuori o dentro al void del Timer_Tick?

Perdonate eventuali cagate astronomiche, riconosco la newbaggine.
Grazie

	private void btnStart_Click(object sender, EventArgs e)
        {
            seconds = 10;
            countdownTimer.Start();
        }

        private void countdownTimer_Tick(object sender, EventArgs e)
        {
            label1.Text = seconds--.ToString();
            if (seconds < 0)
            countdownTimer.Stop();                                  
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                seconds = 10;
            }
            else if (e.KeyCode == Keys.B)
            {
                seconds = 20;
            }
        }
        

11 Risposte

  • Re: Countdown reset tramite KeyPress

    La proprietà KeyPreview del form deve essere true e ovviamente il tasto funziona se il form è attivo, non sempre
  • Re: Countdown reset tramite KeyPress

    oregon ha scritto:


    La proprietà KeyPreview del form deve essere true e ovviamente il tasto funziona se il form è attivo, non sempre
    Già attivato, non worka comunque
  • Re: Countdown reset tramite KeyPress

    Hai fatto debug? Il codice entra nel gestore? Se si, mostra il codice del gestore per "non funziona" non vuol dire proprio nulla...
  • Re: Countdown reset tramite KeyPress

    Sgrubak ha scritto:


    Hai fatto debug? Il codice entra nel gestore? Se si, mostra il codice del gestore per "non funziona" non vuol dire proprio nulla...
    Si fatto debug. Per codice gestore cosa intendi? (scusa l'ignoranza). Il non funziona è relativo al fatto che per come ho riportato su il codice, anche con keypreview attiva, mi aspetto che il timer si resetti a 10 o 20 sec a seconda del tasto premuto


    EDIT: potrebbe essere un problema il fatto che il timer sia legato ad un Panel all'interno del form?
  • Re: Countdown reset tramite KeyPress

    Ho provato e il codice funziona regolarmente.

    Hai impostato un break nella linea della prima if? Si ferma in quella linea quando premi un tasto?
  • Re: Countdown reset tramite KeyPress

    Lebron5 ha scritto:


    EDIT: potrebbe essere un problema il fatto che il timer sia legato ad un Panel all'interno del form?
    Come può essere il timer "legato" al Panel?

    Hai fatto il debug?
  • Re: Countdown reset tramite KeyPress

    oregon ha scritto:


    Lebron5 ha scritto:


    EDIT: potrebbe essere un problema il fatto che il timer sia legato ad un Panel all'interno del form?
    Come può essere il timer "legato" al Panel?

    Hai fatto il debug?
    Dovresti rispondere alla domanda di oregon, se metti un breakpoint alla riga:
    
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    

    breakpoint.png
    breakpoint.png

    poi avviando il codice in debug, il programma si arresta al pallino quando premi un tasto?
    stop.png
    stop.png

    Se questo non accade non hai attivato l'evento: KeyDown (anche se nel titolo ai messo KeyPress)
    Per controllare se l'evento è attivo, quando sei in progettazione (italiano) o design (inglese), devi vedere gli eventi attivi nel form,
    nella finestra delle proprietà, si clicca l'iconcina a forma di fulmine...
    keydown.png
    keydown.png

    se la riga a destra di KeyDown è vuota, basta cliccarla e sceglire la void che vuoi che sia eseguita quando si preme un tasto.
    Se ancora non si è scritta nessuna void, cliccando due volte nello spazio vuoto, VS la crea per te.
  • Re: Countdown reset tramite KeyPress

    Oppure mostra il contenuto della InitializeComponent() del file Form1.Designer.cs ... sempre che tu voglia risolvere ...
  • Re: Countdown reset tramite KeyPress

    Rubik ha scritto:


    oregon ha scritto:


    Lebron5 ha scritto:


    EDIT: potrebbe essere un problema il fatto che il timer sia legato ad un Panel all'interno del form?
    Come può essere il timer "legato" al Panel?

    Hai fatto il debug?
    Dovresti rispondere alla domanda di oregon, se metti un breakpoint alla riga:
    
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    
    breakpoint.png
    poi avviando il codice in debug, il programma si arresta al pallino quando premi un tasto?
    stop.png
    Se questo non accade non hai attivato l'evento: KeyDown (anche se nel titolo ai messo KeyPress)
    Per controllare se l'evento è attivo, quando sei in progettazione (VS2017) o design (VS2019), devi vedere gli eventi attivi nel form,
    nella finestra delle proprietà, si clicca l'iconcina a forma di fulmine...
    keydown.png
    se la riga a destra di KeyDown è vuota, basta cliccarla e sceglire la void che vuoi che sia eseguita quando si preme un tasto.
    Ci sono finalmente.
    Ignoravo totalmente il dover attivare questo evento. Avevo solo impostato il preview su True.
    Ringrazio tutti per l'aiuto!!
  • Re: Countdown reset tramite KeyPress

    In C#, tutti gli eventi devono essere attivati, alcuni come il click o formload, vengono attivati semplicente cliccando due volte il controllo sul form in fase di progettazione. Altri, e ora hai visto che sono molti, si attivano nella finestra delle proprietà/eventi.
    Gli eventi si possono attivare anche da codice es:
    
    listView1.DoubleClick += new EventHandler(listView1_DoubleClick); // evento doubleclick
    
    inserito in form_Load o dopo: InitializeComponent();, attiva l'evento doppio click in una listview.

    In ultimo si possono anche inserire nel designer (Form1.Designer.cs), fortemente sconsigliato metterci le mani quando si è agli inizi
    
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(24, 12);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 3;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
    
    visto che viene automaticamente creato, usando l'interfaccia progettazione...
  • Re: Countdown reset tramite KeyPress

    Molto importante come concetto. Approfondirò studiando (spero più avanti nel corso che sto seguendo).
    Grazie ancora a tutti per gli spunti
Devi accedere o registrarti per scrivere nel forum
11 risposte