none
Nekonečné vytváření objektů

    Dotaz

  • Dobrý den,

    pokouším se udělat program, ve kterém se budou při určité události vytvářet objekty (panely), ale nevím jak na to. Prvně jsem vytvořil metodu, která vytvářela panely, ale nemohl jsem u nich upravit jejich vlastnosti.

            int souřadniceX = 0, souřadniceY = 0, num = 0;
    
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void FormMain_Click(object sender, EventArgs e)
            {
                num++;
                souřadniceY += 20;
    
                Generator(num, souřadniceX, souřadniceY);
            }
    
            void Generator(int počet, int x, int y)
            {
                Panel panel = new Panel();
    
                panel.Name = "panel" + počet;
                panel.Width = 10;
                panel.Height = 10;
                panel.Location = new Point(x, y);
                panel.BackColor = Color.FromArgb(200 + počet, 20, 20);
                panel.Parent = this;
            }

    Poté mě napadlo použít list <Panel>, ale tady jsem se potýkal s naznámým problémem, kde se vytvořil pouze jeden panel a ten se choval, jako by byl nově vytvořen.

            List<Panel> listObjekty = new List<Panel> { };
    
            Panel objekt = new Panel();
    
            int i = -1;
    
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void FormMain_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Space)
                {
                    i++;
    
                    listObjekty.Add(objekt);
    
                    listObjekty[i].Parent = this;
                    listObjekty[i].Location = new Point(40 * i, 150);
                    listObjekty[i].Width = 30;
                    listObjekty[i].Height = 30;
                }
            }

    Pokud někdo zná řešení, tak prosím, ať odpoví. Pokud je potřeba více informací, klidně je doplním a pokud nikdo neví, tak nevadí, budu pátrat hlouběji.

    Předem děkuji za odpověď.

    11. května 2012 19:40

Odpovědi

  • Problém byl v tom, že nový panel vytváříš pouze jednou. Zkusil jsem toto a funguje to, zkus:

            private void button1_Click(object sender, EventArgs e)
            {
                foreach (Panel p in listObjekty)
                {
                    p.BackColor = System.Drawing.Color.Azure;
                    p.BorderStyle = BorderStyle.Fixed3D;
                }
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                i++ ;
                Panel objekt = new Panel(); //vytvoření nového panelu
                objekt.Location = new Point(40 * i, 150);
                objekt.Width = 30;
                objekt.Height = 30;
                objekt.Parent = this;
                listObjekty.Add(objekt);
            }

    • Označen jako odpověď DISCOVERY.2 26. května 2012 16:00
    24. května 2012 10:29

Všechny reakce

  • Problém byl v tom, že nový panel vytváříš pouze jednou. Zkusil jsem toto a funguje to, zkus:

            private void button1_Click(object sender, EventArgs e)
            {
                foreach (Panel p in listObjekty)
                {
                    p.BackColor = System.Drawing.Color.Azure;
                    p.BorderStyle = BorderStyle.Fixed3D;
                }
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                i++ ;
                Panel objekt = new Panel(); //vytvoření nového panelu
                objekt.Location = new Point(40 * i, 150);
                objekt.Width = 30;
                objekt.Height = 30;
                objekt.Parent = this;
                listObjekty.Add(objekt);
            }

    • Označen jako odpověď DISCOVERY.2 26. května 2012 16:00
    24. května 2012 10:29
  • před tím než zavoláš

      listObjekty.Add(objekt);

    musíš nový panel vytvořit.

    objekt = new Panel();

    listObjekty.Add(objekt);

    Neustále jsi přidával a měnil jeden a tentýž panel.

    25. května 2012 5:54
  • Skvělé, děkuji mockrát.

    Neuvěřitelné, že chyba je většinou v takové jednoduché věci ...

    26. května 2012 16:05