Guten Morgen zusammen,
vorweg muss ich sagen - und das merkt man bestimmt auch am Code selbst - ich bin absoluter Anfänger ich bin seit ca. 5 Wochen bei C# und darf mich jeden Samstag Abend zwei Stunden damit beschäftigen 😉.
Alles was ich kann und weiß steht auch in dem Code.
Aber es tut sich folgendes Problem auf:
Mein Programm besteht aus X Forms. Eine Hauptform und von dort werden weitere aufgerufen. Einige davon soll man öfters aufrufen können, so auch diese um die es geht.
Rufe ich diese Form das erstemal auf läuft alles genau so wie es mit vorstelle. Erreiche ich in dieser Form das "ende" und rufe Sie dann erneut auf kommt der Fehler.
Es gibt dort einen Timer "myTimer" der dann offenbar zweimal läuft. Das merke ich daran, weil er Counter der mitzählen soll wieviele Buttons auf der Form erstellt wurden dann jede Sekunde +2 zählt statt +1.
Hier der Code:
Aufruf der Form
private void cmdBetrug_Click(object sender, EventArgs e)
{
betrug frmbetrug = new betrug();
frmbetrug.ShowDialog();
}
Und hier tritt der Fehler auf:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace game
{
public partial class betrug : Form
{
//Neuen Timer anlegen
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
//Globale Variablen
public static int varhelpPosX = 0;
public static int varhelpPosY = 0;
public static int varhelpLevel = 0;
public static int varBetrugpunkte = 0;
public static int varBetrugcounter = 0;
//Methode zum erstellen eines neuen Buttons
public void methodeBallonErstellen()
{
//Generierung von Position und Größe(Level)
Random rand = new Random();
int varPosX = rand.Next(50, 390);
int varPosY = rand.Next(50, 390);
int varLevel = rand.Next(1, 6);//Level 1- 5
//Verhindern das die Zufallszahlen gleich den der Vorrunde sind
do
{
varLevel = rand.Next(1, 6);
} while (varLevel == varhelpLevel);
do
{
varPosX = rand.Next(110, 390);
} while (varPosX == varhelpPosX);
do
{
varPosY = rand.Next(110, 390);
} while (varPosY == varhelpPosY);
//Wert in die Hilfsvariable schreiben zum Vergleich in der nä. Runde
varhelpPosX = varPosX;
varhelpPosY = varPosY;
varhelpLevel = varLevel;
//Level bestimmt Grüße des Button
int varSizeW = 0;
int varSizeH = 0;
switch (varLevel)
{
case 1:
varSizeW = 30;
varSizeH = 30;
break;
case 2:
varSizeW = 50;
varSizeH = 50;
break;
case 3:
varSizeW = 70;
varSizeH = 70;
break;
case 4:
varSizeW = 90;
varSizeH = 90;
break;
case 5:
varSizeW = 110;
varSizeH = 110;
break;
default:
varSizeW = 40;
varSizeH = 40;
break;
}
//Button mit Vorgabewerten erzeugen
Button btnOne = new Button();
btnOne.Left = varPosX;
btnOne.Top = varPosY;
btnOne.Height = varSizeH;
btnOne.Width = varSizeW;
btnOne.Text = varLevel.ToString();
btnOne.Click += handleTheClick; //Click Event des neuen Buttons festlegen
this.Controls.Add(btnOne);
//Anzahl der Buttons auf Form erhöhen.
varBetrugcounter++;
lblBetrugButtons.Text = varBetrugcounter.ToString();
//Wenn mehr als oder genau 10 Buttons auf der Form sind
if (varBetrugcounter >= 10)
{
myTimer.Enabled = false; // Time abschalten
myTimer.Stop();
MessageBox.Show("Sie haben verloren. "); //MessageBox ausgeben
this.Close();//Form schließen
}
}
//Click Event für erzeugte Buttons
private void handleTheClick(object sender, EventArgs e)
{
Button btn = sender as Button; //Übergabe welche Button das Event ausgelöst hat
string level = btn.Text;
int varSizeW = 30;
int varSizeH = 30;
int newlevel = Int32.Parse(btn.Text);
newlevel--;
if (newlevel <= 0) //Wenn das neue Level des Buttons kleiner gleich 0 ist
{
btn.Visible = false; //Button unsichtbar machen
varBetrugcounter--; //Anzahl der Buttons auf Form um 1 verringern
varBetrugpunkte++; // Punkte um 1 erhöhren
lblBetrugButtons.Text = varBetrugcounter.ToString();
lblBetrugPunkte.Text = varBetrugpunkte.ToString();
if (varBetrugpunkte >= 20) //Wenn Punkt größer gleich 20 sind
{
myTimer.Enabled = false; //Timer abschalten
MessageBox.Show("Sie haben Ihr Ziel erreicht."); //MassageBox ausgeben
Random rand = new Random();
int varBeute = rand.Next(50, 490);
MessageBox.Show("Sie haben " + varBeute + " EUR erbeutet."); //MassageBox ausgeben
this.Close(); // Form schließen
}
}
else //Wenn das neue Leven größer 0 ist
{
switch (newlevel) //Button größe entsprechend Level anpassen
{
case 1:
varSizeW = 30;
varSizeH = 30;
break;
case 2:
varSizeW = 50;
varSizeH = 50;
break;
case 3:
varSizeW = 70;
varSizeH = 70;
break;
case 4:
varSizeW = 90;
varSizeH = 90;
break;
case 5:
varSizeW = 110;
varSizeH = 110;
break;
default:
varSizeW = 40;
varSizeH = 40;
break;
}
btn.Text = newlevel.ToString();
btn.Width = varSizeW;
btn.Height = varSizeH;
}
}
public betrug()
{
InitializeComponent();
//Anweisungen für Timer festlegen
myTimer.Tick += play; //Event festlegen das beim Ablauf des Timers ausgelöst werden soll
myTimer.Interval = 1000; //Zeitraum festlegen in den der Tick Event ausgelöst wird (Alle x Millisekunden)
myTimer.Enabled = true; //Läuft der Time ja oder nein
}
void play(object sender, EventArgs e) //Methode die der Ticker aufruft
{
methodeBallonErstellen();
}
private void betrug_Load(object sender, EventArgs e) //Aufruf der Form betrug
{
varBetrugpunkte = 0;
varBetrugcounter = 0;
methodeBallonErstellen();
}
}
}
Ich hoffe ich konnte gut erklären wo der Fehler liegt.
Ich habe auch schon verschiedene Befehle aus Google probiert die ich gefunden habe
mytimer.Stop();
mytimer.dispose();
aber leider ändert sich dadurch nichts.
Gruß und danke schon jetzt
Jan
Naja, wenn du aufhörst den Timer static zu verwenden, sollte das klappen. Dein Problem ist, dass der Timer bei "myTimer.Tick += play;" bereits existiert und ein Event gebunden hat. - Beim zweiten Aufruf gibt es eben ein zweiten EventHandler usw.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Danke, aber in was ändere ich das?
Ich kenn den Timer nur so wie ich ihn "eingebaut" habe...
@HardcoreJan
Hat inflames2k doch geschrieben.
Du musst das static Keyword entfernen
// Alt
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
// Neu
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Super, vielen Dank. Genau da war der Fehler.
Ich lese mich dann nochmal etwas mehr in den Modifizierern ein 😃
Hallo HardcoreJan,
man sollte gerade bei static wissen, was es macht und wofür es da ist. Gerade am Anfang benutzt man das gern, weil ja dann die Variablen immer und überall verfügbar sind 😉
Vermeide static, wo es geht. Dann hast du solche Effekte nicht.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code