Grundaufgabe: Timer versagt



  • Hallo,

    ich versuche mich an einen Einsteigerbuch von C#. Klappt eigentlich ganz gut. Jedoch funktioniert der Timer leider nicht. Ich habe keine Ahnung, was ich eigentlich falsch mache. Ich habe diese Übungsaufgabe vorläufig übersprungen, will es aber natürlich nicht einfach so stehen lassen. Schaut es euch am besten bitte selbst an. Es ist sehr sehr schlicht, einfach und kurz gehalten:

    namespace MeinErstes
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void cmdHallo_Click(object sender, EventArgs e)
            {
    
               timer1.Enabled = true;
    
            }
    
            private void cmdEnde_Click(object sender, EventArgs e)
            {
    
                timer1.Enabled = false;
    
                //Close();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
    
                lblAnzeige.Text += "x"; // Zum testen
    
                panel1.Location = new Point(panel1.Location.X + 10, panel1.Location.Y);
                panel1.Location = new Point(panel1.Location.X, panel1.Location.Y - 10);
            }
    
        }
    }
    

    Gruß 🙂



  • Hallo.

    Versuch es mal so.

    namespace MeinErstes
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                timer1 = new Timer();
                timer1.Interval = 2000;
    	    timer1.Tick += timer1_Tick;
                timer1.Start();
            }
    
            private void cmdHallo_Click(object sender, EventArgs e)
            {
    
               timer1.Enabled = true;
    
            }
    
            private void cmdEnde_Click(object sender, EventArgs e)
            {
    
                timer1.Enabled = false;
    
                //Close();
            }
    
            void timer1_Tick(object sender, EventArgs e)
            {
    
                lblAnzeige.Text += "x"; // Zum testen
    
                panel1.Location = new Point(panel1.Location.X + 10, panel1.Location.Y);
                panel1.Location = new Point(panel1.Location.X, panel1.Location.Y - 10);
            }
    
        }
    }
    


  • Versuch_1 schrieb:

    Hallo.

    (..)

    Hallo,

    danke. Es klappt so. Im Buch wird das natürlich nirgendwo aufgeführt. Mir ist da ohnehin eine Kleinigkeit aufgefallen.

    Danke nochmals.

    Gruß



  • Zur Vollständigkeit:

    timer1.Start() ist hier nicht erforderlich. Wird nur gebraucht, wenn nach einer Unterbrechung mit
    timer1.Stop() der timer fortgesetzt werden soll. Ansonsten genügen timer1.Enabled = true/false
    zum Starten und Beenden.



  • @berniebutt:
    Enabled = true entspricht Start()
    Enabled = false entspricht Stop()

    Es gibt keinen weiteren Unterschied.

    Und zum Code:
    die Timer-Initialisierung kann man auch - genauso wie bei den Buttons - im Designer vornehmen (so hat es wohl der Buchautor auch angedacht ;-).



  • Th69 schrieb:

    Und zum Code:
    die Timer-Initialisierung kann man auch - genauso wie bei den Buttons - im Designer vornehmen (so hat es wohl der Buchautor auch angedacht ;-).

    Dachte ich mir auch. Jedoch hat es so, wie lt. Buch, nicht funktioniert. Meine Vorgehensweise: Timer ausgewählt, rübergeschoben, und den Code abgetippt.

    Gruß



  • Th69 schrieb:

    @berniebutt:
    Enabled = true entspricht Start()
    Enabled = false entspricht Stop()

    Es gibt keinen weiteren Unterschied.

    Doch, es gibt einen Unterschied, anderenfalls wäre da eine unschöne Redundanz!
    Zur Erläuterung siehe folgendes Beispiel:

    // -------------------------------------------------------------------------------------
    // Funktionsweise eines timers
    // Verwendung von Enabled = true / false und Start() / Stop()
    // Die Listbox protokolliert das Geschehen
    // -------------------------------------------------------------------------------------
    namespace Timer
    {
        public partial class Form1 : Form
        {
            int ticks, intervall = 1000;
    
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                button1.Enabled = true;        // button1: timer wird gestartet
                button2.Enabled = false;       // button2: timer wird beendet
                button3.Enabled = false;       // button3: timer wird unterbrochen
                button4.Enabled = false;       // button4: timer wird fortgesetzt
                timer1.Interval = intervall;   // intervall = 1000 ms = 1 sec
                listBox1.Items.Add("timer intervall        = " + intervall.ToString() +
                                   " ms = " + (intervall/1000).ToString() + " sec");
            }
            private void button1_Click(object sender, EventArgs e)
            {
                ticks = 0;
                listBox1.Items.Add("timer gestartet");
                timer1.Enabled  = true;
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = true;
                button4.Enabled = false;
            }
            private void button2_Click(object sender, EventArgs e)
            {
                timer1.Enabled  = false;
                button1.Enabled = true;
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
                listBox1.Items.Add("timer beendet  " + ticks.ToString());
            }
            private void button3_Click(object sender, EventArgs e)
            {
                timer1.Stop();
                listBox1.Items.Add("timer unterbrochen");
                button4.Enabled = true;
            }
            private void button4_Click(object sender, EventArgs e)
            {
                timer1.Start();
                listBox1.Items.Add("timer fortgesetzt");
            }
            private void timer1_Tick(object sender, EventArgs e)
            {
                ticks++;
                listBox1.Items.Add("timer_Tick     " + ticks.ToString());
            }
        }
    }
    

    }



  • s.a. Timer.Enabled-Eigenschaft

    MSDN schrieb:

    Das Aufrufen der Start-Methode und das Festlegen von Enabled auf true ist vom Ergebnis her identisch. Entsprechend ist auch das Aufrufen der Stop-Methode und das Festlegen von Enabled auf false vom Ergebnis her identisch.

    bzw. besser auf englisch

    MSDN schrieb:

    Calling the Start method is the same as setting Enabled to true. Likewise, calling the Stop method is the same as setting Enabled to false.

    Redundanz - ja. Ist aber nicht ungewöhnlich, daß eine boolsche Eigenschaft intern zwei verschiedene Methoden aufruft, z.B.
    Control.Visible: Show / Hide

    @Schlüsselbund: beim Designer mußt du natürlich auch das Ereignis "Tick" mit der Ereignismethode verknüpfen (d.h. im form.designer.cs muß die Ereignisabonnierung mittels += stehen).



  • Das war das Stichwort: Verknüpfen! Danach hatte ich auch gesucht, bevor ich den Beitrag hier verfasst habe.

    Gruß



  • @berniebutt
    Das Beispiel erleutert gar nichst.
    Was willst du damit?


Anmelden zum Antworten