[C#] Schlaufe mit Time-Delay

meisti94

Erfahrenes Mitglied
#1
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++;
                }

                
            }
 
#2
Hallo,

dafür kann man einen Timer verwenden.

Gruß
MCoder
 
#6
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
 

meisti94

Erfahrenes Mitglied
#7
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.
 
#8
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
 

meisti94

Erfahrenes Mitglied
#9
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
        }
    }
}
 
#10
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
 

meisti94

Erfahrenes Mitglied
#11
Danke schonmal.

Wie muss ich das PCBS Array hinzufügen? Also was für ein Datentyp muss ich nehmen?

hab da an "private Object[] pcbs = new Object { pcb1, pcb2, pcb3, pcb4, pcb5 };" gedacht, ****t aber nicht.

"Ebenfalls als Klassenmember werden Indexvariablen für "Cards" und "pcbs" erzeugt." - Das verstehe ich nicht.
 
#12
Hallo,

ich hab mal versucht, das auf die Schnelle in deinen Code reinzuschreiben. Da dürften noch jede Menge Bugs drinnen sein, aber ich hoffe, du verstehst dann, was ich meine.

Gruß
MCoder

C#:
public partial class frmMain : Form
{
    private List<Card>    Cards = new List<Card>();
    private PictureBox [] pcbs  = new PictureBox[] { pcb1, pcb2, pcb3, pcb4, pcb5 };   
    private int           nIndexCards;
    private int           nIndexPcbs;
    private int           a;

    ...
    
    private void fillPictures(bool firsttime)
    {
        nIndexCards = 0;
        nIndexPcbs  = 0;
        a           = 0;
        
        tmrCards.Start();
    }
    
    private void tmrCards_Tick(object sender, EventArgs e)
    {
        string imagename = "_" + Cards[nIndexCards].number + Cards[nIndexCards].type;
        PictureBox t = pcbs[nIndexPcbs];
        
        if (firsttime == false)
        {
            if (nIndexPcbs < pcbs.Length )
            {
                if (Cards[nIndexCards].held == false)
                {
                    t.Image = null;
                }
                
                if (t.Image == null)
                {
                    t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                }
                
                nIndexPcbs++
                nIndexCards++;
            }
            else
            {
                tmrCards.Stop();
            }
        }    
        else
        {
            if (t.Tag == null)
            {
                t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                t.Tag = "done";
            }
            
            nIndexPcbs++;
            
            if( nIndexPcbs == pcbs.Length )
            {
                nIndexPcbs = 0;
                nIndexCards++;
            }
        }
        
        if( nIndexCards == Cards.Count )
        {
            tmrCards.Stop();
        }
    }
}
 

meisti94

Erfahrenes Mitglied
#13
Hey, vielen Dank schonmal!

Ist mir einigermassen ersichtlich.

" private PictureBox [] pcbs = new PictureBox[] { pcb1, pcb2, pcb3, pcb4, pcb5 };" Diese Zeile spackt nach wie vor rum. Hab da gestern auch schon probiert das "var" zu ersetzen, brings aber nicht hin.

Hättest du da noch ne Idee?

Edit:

public frmMain()
{
InitializeComponent();

pcbs[0] = pcb1;
pcbs[1] = pcb2;
pcbs[2] = pcb3;
pcbs[3] = pcb4;
pcbs[4] = pcb5;
}


So. Probier mal den Code zum Laufen zu bringen, meld mich falls ich noch was brauch ;)


Edit2: Funktioniert alles wunderbar. Die Picturebox werden jetzt entsprechend dem Delay gefüllt. Vielen Dank! :*

Sieht nun so aus:

Code:
private int nIndexCards;
        private int nIndexPcbs;
        private int a;
        private bool firsttime = true;
        private PictureBox[] pcbs;

        public frmMain()
        {
            InitializeComponent();

            pcbs = new PictureBox[5] { pcb1, pcb2, pcb3,pcb4, pcb5};
        }
...

Code:
private void tmrCards_Tick(object sender, EventArgs e)
        {
            string imagename = "_" + Cards[nIndexCards].number + Cards[nIndexCards].type;
            PictureBox t = pcbs[nIndexPcbs];

            if (firsttime == false)
            {
                if (Cards[nIndexCards].held == false)
                {
                    tmrCards.Interval = 350;

                    if (Cards[nIndexCards].backimage == false)
                    {
                        t.Image = (Image)Properties.Resources.ResourceManager.GetObject("back");

                        Cards[nIndexCards].backimage = true;

                        return;
                    }
                    else
                    {
                        t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                    }
                }

                if (Cards[nIndexCards].held == true)
                {
                    tmrCards.Interval = 1;
                }                
                nIndexPcbs++;
                nIndexCards++;

                if (nIndexPcbs == pcbs.Length)
                {
                    tmrCards.Stop();
                }
            }
            else
            {
                if (t.Tag == null)
                {
                    t.Image = (Image)Properties.Resources.ResourceManager.GetObject(imagename);
                    t.Tag = "done";
                }

                nIndexCards++;
                nIndexPcbs++;

                if (nIndexPcbs == pcbs.Length)
                {
                    nIndexPcbs = 0;
                    nIndexCards++;
                }
            }

            if (nIndexCards == Cards.Count)
            {
                tmrCards.Stop();
            }
        }
 
Zuletzt bearbeitet: