Benutzer mit den meisten Antworten
Timer in C#

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- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 27. Januar 2015 14:08 Richtiges Unterforum (aus: Visual Basic .NET Express-Edition )
Antworten
-
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- Als Antwort vorgeschlagen Jens Gerber Freitag, 26. September 2014 15:19
- Bearbeitet Tom Lambert (Koopakiller) Montag, 29. September 2014 15:23 ClientSize
- Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:07
-
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
-
Ja, du musst dafür die Start-Methode aufrufen.
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:08
-
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
-
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
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
-
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?
-
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- Als Antwort vorgeschlagen Jens Gerber Freitag, 26. September 2014 15:19
- Bearbeitet Tom Lambert (Koopakiller) Montag, 29. September 2014 15:23 ClientSize
- Als Antwort markiert CsharpNeuling Montag, 29. September 2014 16:07
-
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;
}
}
}
-
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
-
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
-
Ja, du musst dafür die Start-Methode aufrufen.
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:08