none
Timer in C# RRS feed

  • Frage

  • Hallo Community,

    da ich noch ein kompletter C# neuling bin und wir einen timer erstellen müssen der uns einen button mit einstellbarer geschwindigkeit zuerst nach rechts bis zum rand und dann wieder nach links bis zum laufen lassen müssen
    wollte ich fragen ob ihr mir da helfen könnt?

    Danke schon im vorraus
    Freitag, 26. September 2014 13:46

Antworten

Alle Antworten

  • Hallo,
    wir können dir natürlich helfen. Allerdings wird es dir nicht viel bringen wenn wir dir einfach ein paar Codestückchen geben. Erstens, wissen wir nicht, wie weit dein bisherhiges Wissen reicht und zweitens gibt es viele verschiedene Timer-Klassen und Technologien mit denen du eventuell arbeitest.
    Mit was willst du die Aufgabe also lösen (WiNForms, WPF, ...)? Benutzt du irgend einen besonderen Timer oder etwas anderes, außergewöhnliches?

    Zeige bitte auch deinen bisher geschriebenen Code und nenne uns die Probleme die du hast, dann können wir besser auf dich eingehen.

    In der Theorie musst du einfach die Position (bspws. Left- oder Margin-Eigenschaft) des Buttons im Tick-Event des Timers ändern. Ebenfalls über die Position kannst du in jedem Tick-Event prüfen ob der Button am rechten Rand angelangt ist. Sollte er es sein, kannst du eine Variable abändern - die du im Tick-Eventhandler ausließt, um die Verschieberichtung zu bestimmen.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:07
    Freitag, 26. September 2014 14:09
  • Hallo,
    ja ich verstehe. Zu erstens mein bisheriges C# wissen beträgt so gut wie nichts. Zu zweitens ich möchte die aufgabe mit WinForms lösen. Nein ich brauche nur einen normalen Timer

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Bsp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            Button bMeinButton;
            

            private void button1_Click(object sender, EventArgs e)
            {
                bMeinButton = new Button();
                this.Controls.Add(bMeinButton);

                bMeinButton.Text = "mein Button";
                bMeinButton.Top = 200;
                bMeinButton.Left = 300;
                bMeinButton.Width = 50;
                bMeinButton.Height = 50;

                bMeinButton.BackgroundImage = Image.FromFile(@"C:\..\..\..\...");

            }

            private void timer10ms__Tick(object sender, EventArgs e)
            {
                bMeinButton.move();
            }
        }
    }

    das ist das was ich bis jetzt habe.. ich habe als erstes mit der toolbox einen button1 erstellt und programmiert das wenn ich auf ihn klicke das es mir einen 2ten button erstellt mit dieser position und größen dann gebe ich dem button noch ein hintergrundbild.. jetzt kommt es zu meiner frage zu dem timer (und der move funktion)? wie gehe ich nun vor? alles was ich möchte ist das wenn ich auf den button1 klicke der 2te button erstellt wird und von rechts nach links geht und wieder zurück?

    Freitag, 26. September 2014 14:59
  • Dein Ansatz ist schonmal nicht schlecht, dafür das du *nichts* weißt.

    Der Button hat in der Form eine bestimmte Position, diese wird durch die Top- und Left-Eigensschaft bestimmt. Diese weist du beim erstellen auch zu. Du kannst sie nun auch problemlos wieder abrufen und verändern:

    private void timer10ms__Tick(object sender, EventArgs e)
    {
        bMeinButton.Left++;
        //bMeinButton.Left += 1;//Etwas ausführlicher
        //bMeinButton.Left = bMeinButton.Left  + 1;//Ganz ausführlich
    }

    Dadurch wandert der Button beim Auslösen des Timers immer um eins nach rechts.

    Nun kommt das Umdrehen der Bewegungsrichtung ins Spiel. Die Richtung, in die der Button sich momentan bewegt, speichern wir in einer Variablen in der Klasse:

    bool movesForward = true;
    //true = nach rechts
    //false = nach links

    Nun müssen wir entsprechend die timer10ms_Tick-Methode abändern:

    private void timer10ms__Tick(object sender, EventArgs e)
    {
        if(movesForward)
            bMeinButton.Left++;
        else
            bMeinButton.Left--; //subtrahiert 1, wandert also nach links

    So, nun müssen wir noch heraus finden, wann der Button umkehren muss. Dazu kann man die Methode nochmals am Ende ergänzen:

    if(bMeinButton.Left <= 0)
        movesForward = true;//Am linken Rand angekommen
    else if(bMeinButton.Right >= this.ClientSize.Width)//Am mrechten Rand angekommen
        movesForward = false;

    Die Right-Eigenschaft beschreibt den Abstand des rechten Rands zum linken Rand des Containers, hier der Form.

    Im Moment wird der Button immer hin- und her wandern, ohne Ende. Wenn du das den Befehl in der ersten if-Abfrage (movesForward = true;) gegen timer10ms.Stop(); austauschst, wird der Button nach einer Runde stoppen, da der Timer angehalten wird.

    PS: Ich empfehle dir ein Buch über C# zu lesen. So lernst du die wichtigsten GUI (Grafische Benutzeroberfläche) in den Grundlagen kennen und auch die Sprachkonzepte von C#.
    Büche gibt es auch kostenlos im Internet: Visual C# 2012


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Freitag, 26. September 2014 15:13
  • Danke :)

    dan sieht meine alles zum schluss so aus?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace Bsp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }


            Button bMeinButton;
            

            private void button1_Click(object sender, EventArgs e)
            {
                bMeinButton = new Button();
                this.Controls.Add(bMeinButton);

                bMeinButton.Text = "mein Button";
                bMeinButton.Top = 200;
                bMeinButton.Left = 300;
                bMeinButton.Width = 50;
                bMeinButton.Height = 50;

               // bMeinButton.BackgroundImage = Image.FromFile(@"C:\..\..\..\...");

            }


            bool movesForward = true;

            private void timer10ms__Tick(object sender, EventArgs e)
            {
                if (movesForward)
                    bMeinButton.Left++;
                else
                    bMeinButton.Left--;

                if (bMeinButton.Left <= 0)
                    movesForward = true;//Am linken Rand angekommen
                else if (bMeinButton.Right >= this.Width)//Am rechten Rand angekommen
                    movesForward = false;
            }


        }
    }



    Freitag, 26. September 2014 15:36
  • Wenn ich nichts übersehen habe, dann ja.

    PS: Verwende im Vorum bitte Codeblöcke (), um den Code vom normalen Text etwas abzuheben. Danke.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:07
    Freitag, 26. September 2014 15:57
  • dann muss ich aber noch den  private void timer10ms__Tick anlegen im form.designer? das wär dann noch mein problem da ich nicht weiss wie ich das anstelle?

    Das wäre dann auch die eigentliche Frage gewesen wie ich den timer anlege :)

    Freitag, 26. September 2014 16:17
  • Das wäre dann auch die eigentliche Frage gewesen wie ich den timer anlege :)

    Dann schreib das nächstes mal bitte auch.

    Wenn du noch keinen Timer in der Form hast, suche ihn in der ToolBox un ziehe ihn auf die Form.
    Dann markiere den Timer (liegt am unteren Rand der Form in einer extra Leiste) und wechsle ins Eigenschaftenfenster (F4). Dort kannst du im Reiter Ereignisse (-Button) das Tick-Event suchen und auf das Feld neben dem Namen einen Doppelklick machen. Dadurch wird das Event im Designer abonniert und im Codebehind ein Ereignishandler angelegt. Der Name des Eventhandlers ist an sich beliebig, richtet sich standardmäßig aber nach dem Namen des Timers (Name-Eigenschaft).

    Fast jedes Control hat ein Standardevent, welches abonniert wird, wenn du im Designer einen Doppelklick darauf machst. Es würde hier also reichen einen Doppelklick auf das Timer-Symbol zu machen um das Tick-Event zu abonnieren.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert CsharpNeuling Freitag, 26. September 2014 16:53
    • Tag als Antwort aufgehoben CsharpNeuling Freitag, 26. September 2014 16:53
    • Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:08
    Freitag, 26. September 2014 16:24
  • muss ich den timer noch extra starten in meinem code oder startet er ab dem tick event von selbst?
    Freitag, 26. September 2014 16:46
    • Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:08
    Freitag, 26. September 2014 16:56
  • habs geschafft :)
    vielen dank für die hilfe!
    Freitag, 26. September 2014 17:07