Laden...

Doppelter Timer (bei wiederaufruf einer Form)

Erstellt von HardcoreJan vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.310 Views
H
HardcoreJan Themenstarter:in
3 Beiträge seit 2018
vor 6 Jahren
Doppelter Timer (bei wiederaufruf einer Form)

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

2.298 Beiträge seit 2010
vor 6 Jahren

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 |

H
HardcoreJan Themenstarter:in
3 Beiträge seit 2018
vor 6 Jahren

Danke, aber in was ändere ich das?
Ich kenn den Timer nur so wie ich ihn "eingebaut" habe...

T
2.224 Beiträge seit 2008
vor 6 Jahren

@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.

H
HardcoreJan Themenstarter:in
3 Beiträge seit 2018
vor 6 Jahren

Super, vielen Dank. Genau da war der Fehler.
Ich lese mich dann nochmal etwas mehr in den Modifizierern ein 😃

2.207 Beiträge seit 2011
vor 6 Jahren

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