[C#] Schlaufe mit Time-Delay

meisti94

Erfahrenes Mitglied
Grüezi

Ich habe eine schlaufe wo ich 5 Bilder in eine Picturebox abfülle. Diese möchte ich nun "Zeitversetzt" abfüllen.

Also wenn man das Programm offen hat und auf einen Knopf klickt, füllt es z.B alle 0.5 das nächste Bild ab.

Wie kann ich sowas realisieren?

Code:

Code:
foreach (var c in Cards)
            {               
                    imagename = "_" + c.number + c.type;

                    foreach (PictureBox t in pcbs)
                    {
                        if (t.Tag == null)
                        {
                            t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                            t.Tag = "done";
                            break;
                        }
                    }
                    a++;
                }

                
            }
 
Der Timer hat ein Intervall jedoch noch keine Funktion eingebunden.

Den Code vom Knopf hab ich eingebunden, im Timer_tick ist noch kein Code.
 
Hallo,

im Timer_tick gibt du jeweils ein Bild aus und zählst einen Counter o.ä. für's Weiterschalten zum nächsten Bild hoch.

Gruß
MCoder
 
Das grundlegende Prinzip wie es funktionieren sollte, habe ich verstanden. Jedoch mache ich ein durcheinander mit den Schlaufen und dem Timer und kann diese nicht kombinieren.
 
Hallo,

bei Verwendung des Timers brauchst du keine andere Schleife mehr.

Jedoch mache ich ein durcheinander mit den Schlaufen und dem Timer und kann diese nicht kombinieren.
Wenn wir hier weiterkommen wollen, musst du schon etwas konkreter werden, etwa mit Codestellen die nicht funktionieren.

Gruß
MCoder
 
Hier mal der gesamte Code:

Code:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Video_Poker
{
    public partial class frmMain : Form
    {
        private List<Card> Cards = new List<Card>();

        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            LoadCards();
        }

        private void LoadCards()
        {
            Random random = new Random();
            for (int i = 0; i < 10; i++)
            {
                Card card = new Card();
                card.number = random.Next(1, 14).ToString();
                card.type = random.Next(1, 5).ToString();
                switch (card.type)
                {
                    case "1":
                        card.type = "H";
                        break;

                    case "2":
                        card.type = "E";
                        break;

                    case "3":
                        card.type = "S";
                        break;

                    case "4":
                        card.type = "K";
                        break;

                    default:
                        break;
                }

                Card card2 = new Card();

                card2 = Cards.Find(x => (x.number == card.number && x.type == card.type));

                if (card2 != null)
                {
                    i -= 1;
                    continue;
                }

                Cards.Add(card);
            }

            fillPictures(true);
        }

        private void btnHeld_Click(object sender, EventArgs e)
        {
            Button btnHeld = sender as Button;
            string tag = btnHeld.Tag.ToString();
            int card;
            int.TryParse(tag, out card);
            card -= 1;
            Cards[card].held = true;
        }

        private void btnNewCards_Click(object sender, EventArgs e)
        {
            int i = 9;

            foreach (var c in Cards)
            {
                if (c.held != true)
                {
                    c.number = Cards[i].number;
                    c.type = Cards[i].type;
                }

                i--;
            }

            fillPictures(false);
        }

        private void fillPictures(bool firsttime)
        {
            string imagename = string.Empty;

            bool end = false;

            int a = 0;

            var pcbs = new Object[] { pcb1, pcb2, pcb3, pcb4, pcb5 };

            foreach (var c in Cards)
            {
                imagename = "_" + c.number + c.type;

                if (firsttime == false)
                {
                    if (a < 5)
                    {
                        PictureBox t = (PictureBox)pcbs[a];
                        if (c.held == false)
                        {
                            t.Image = null;
                        }
                        if (t.Image == null)
                        {
                            t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                        }
                        a++;
                        continue;
                    }

                    end = true;
                }
                else
                {
                    foreach (PictureBox t in pcbs)
                    {
                        if (t.Tag == null)
                        {
                            t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                            t.Tag = "done";
                            break;
                            //NACH JEDEM BILD SOLL 0.5 SEKUNDEN GEWARTET WERDEN. SOZUSAGEN ALS ÜBERGANG
                        }
                    }
                    a++;
                }
            }
        }

        private void tmrCards_Tick(object sender, EventArgs e)
        {
              //HIER FEHLT EINE FUNKTION
        }
    }
}
 
Hallo,

hier ein paar Stichpunkte:

Das "pcbs"-Array kommt aus "fillPictures" raus und wird ein Klassenmember.

Ebenfalls als Klassenmember werden Indexvariablen für "Cards" und "pcbs" erzeugt.

"fillPictures" macht ->
die Indexvariablen 0 setzen und den Timer starten

"tmrCards_Tick" macht ->
anhand der Indexvariablen die aktuelle Picturbox und das Card-Image ermitteln, das Bild ausgeben, den Index hochzählen, prüfen, ob beide Indizes durchgelaufen sind und dann den Timer stoppen.

Gruß
MCoder
 
Zurück