Wywołanie funkcji z klasy

0

Witam. Mam taką klasę :

class Gra
    {
        public Gra()
        {
        }

        public void rysuj_plansze()
        {
            Plansza[,] mapa = new Plansza[10, 10];
            for (int i = 0; i < mapa.GetLength(0); i++)
            {
                for (int j = 0; j < mapa.GetLength(1); j++)
                {
                    mapa[i, j] = new Plansza();
                    //mapa[i, j].Parent = this;
                    if (i == 0 && j == 0)
                    {
                        mapa[i, j].Location = new Point(10, 10);
                    }
                    else if (j == 0)
                    {
                        mapa[i, j].Location = new Point(mapa[i - 1, j].Location.X + mapa[i, j].Size.Width, 10);
                    }
                    else
                    {
                        mapa[i, j].Location = new Point(mapa[i, j - 1].Location.X, mapa[i, j - 1].Location.Y + mapa[i, j].Size.Height);
                    }
                }
            }
        }
}

Chciałbym ją wywołać w formie głównej, ale nie działa niestety.
Po napisaniu :

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Gra gamestate = new Gra();
            gamestate.rysuj_plansze();
        }
}

nic się nie dzieje. Próbowałem też tak :

this.Controls.Add(gamestate.rysujplansze()) ale pojawiają się błędy :

Error 2 Argument '1': cannot convert from 'void' to 'System.Windows.Forms.Control'

Proszę o pomoc i z góry dzięki.

0

A co ma sie dziac? Sprawdzales debuggerem, czy rzeczywiscie sie nic nie dzieje?

0

Sprawdzałem. Nic z tego nie wynikło. Generalnie powinna się pojawić tablica paneli na głównej formatce. Nie pojawia się czyli coś jest nie tak, nie mam pojęcia co...

0

A niby na jakiej podstawie powstaja panele? Czymkolwiek jest tablica plansz to musisz te panele do formatki dodac gdzies, nie?

0

Panele powstają w innej klasie :

class Plansza : Panel
    {
        public Plansza()
        {
            this.Width = 25;
            this.Height = 25;
            this.BorderStyle = BorderStyle.FixedSingle;
            this.BackgroundImage = Properties.Resources.kratka;
            this.BackgroundImageLayout = ImageLayout.Stretch;
            Click += new EventHandler(Plansza_Click);
        }

Potem ta klasa wywołana jest w klasie Gra.

0

Ale dalej nigdzie nie dodajesz tych paneli do formularza Form1.

0

Zatem w jaki sposób to zrobić ? możecie mi pomóc ?

0

Np. tak:

public partial class Form1 : Form
    {
         public Form1()
        {
            InitializeComponent();

            Panel p = new Panel();
            p.Size = new Size(500, 500);
            p.Location = new Point(10, 10);
            p.BorderStyle = BorderStyle.Fixed3D;
            p.BackColor = Color.White;
            this.Controls.Add(p);
        }
    }
0

Zrobiłem coś takiego :
Funkcja rysuj_plansze klasy Gra przyjmuje jeden parametr :

class Gra
    {
        public Gra()
        {
        }

        public void rysuj_plansze(Panel [,] mapa)
        {
           
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    mapa[i, j] = new Plansza();
                 
                    if (i == 0 && j == 0)
                    {
                        mapa[i, j].Location = new Point(10, 10);
                    }
                    else if (j == 0)
                    {
                        mapa[i, j].Location = new Point(mapa[i - 1, j].Location.X + mapa[i, j].Size.Width, 10);
                    }
                    else
                    {
                        mapa[i, j].Location = new Point(mapa[i, j - 1].Location.X, mapa[i, j - 1].Location.Y + mapa[i, j].Size.Height);
                    }
                 
                }
            }
        }
}

Wywołanie funkcji wygląda tak:

public Form1()
        {
            InitializeComponent();
            Gra gamestate = new Gra();
            Plansza[,] kratka = new Plansza[10, 10]; // Wywołanie klasy plansza gdzie przechowywane są właściwości obiektu Panel
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                {
                    kratka[i,j] = new Plansza();
                    kratka[i, j].Parent = this;
                    
                }
            gamestate.rysuj_plansze(kratka);
        }

Niestety na formie pojawia się tylko jeden panel, próbowałem też na kilka sposobów ale dalej nie chce działać...

0

Lepiej bedzie jak dasz Controls.Add(kratka[i,j]), po drugie w rysuj plansze nie tworz juz nowej planszy, bo w ten sposob nie zmieniasz wlasciwosci tamtych dodanych. Stad prawdopodobnie pokazuje sie jedna, bo wszystkie maja takie same parametry i wspolrzedne.

0
johny_bravo napisał(a)

Lepiej bedzie jak dasz Controls.Add(kratka[i,j]), po drugie w rysuj plansze nie tworz juz nowej planszy, bo w ten sposob nie zmieniasz wlasciwosci tamtych dodanych. Stad prawdopodobnie pokazuje sie jedna, bo wszystkie maja takie same parametry i wspolrzedne.

Faktycznie, posiadają takie same współrzędne, ale ja chcę wywołać tą planszę z klasy, a nie dodawać do formy nowe kontrolki ( Controls.Add(kratka[i,j]) ). Naprawdę nic już z tego nie kumam.....

0

No ale zrozum. W konstruktorze Form1 dodajesz do formy panele. Po czym wywolujesz ta swoja metode, ktora tworzy nowe panele, ktore z tamtymi nie maja nic wspolnego. Albo usun linijke

mapa[i, j] = new Plansza();

w metodzie rysuj_plansze albo przekaz metodzie referencje na formatke i w niej dodawaj panele po ustawieniu wszystkich wlasciwosci.

0
mapa[i, j] = new Plansza();
  • tego nie mogę usunąć, bo wtedy program po kompilacji krzaczy się i krzyczy : Object reference not set to an instance of an object.

Co do przekazywania referencji, nigdy tego jeszcze nie robiłem, czy mógłbym prosić o jakiś przykład ?

0
public void rysuj_plansze(Form form)
{
  for(...)
  {
  //kod petli
  form.Controls.Add(mapa[i, j])

  }
}

//konstruktor Form1

public Form1()
{
  InitializeComponent();
  Gra gamestate = new Gra();
  gamestate.rysuj_plansze(this);
}

Moglem sie gdzies machnac, bo zmeczony jestem, ale powinno dzialac i idee chyba widac.

0

Dziękuję bardzo za pomoc, nareszcie działa. Pozdrawiam !!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1