Problem z wywołaniem funkcji

0

Witam ma taką funkcję w klasie Gra:

 public void rysuj_statki()
        {
            for (int i = 0; i < mapa.GetLength(0); i++)
            {
                for (int j = 0; j < mapa.GetLength(1); j++)
                {
                   if (sprawdz_statek(i, j))
                   {
                     
                       mapa[i, j].BackgroundImage = Properties.Resources.ship;
                   }
                }
            }
        }

Zadaniem tej funkcji jest narysowanie obiektów na głównej formie.
Problem w tym że chcę to metodę wywołać z poziomu innej klasy.
Jak wywołuję metodę, np. w konstruktorze głównej formy :

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

Wszystko ładnie działa. Ale jak napisałem chcę ją wywołać z innej klasy dla zdarzenia Click :

Gra gamestate = new Gra();
        public int x; // zmienna przechowująca indeks i
        public int y; // zmienna przechowująca indeks j
       
         public Plansza()
        {
           
            this.Width = 25;
            this.Height = 25;
            this.BorderStyle = BorderStyle.FixedSingle;
            this.BackgroundImage = Properties.Resources.kratka;
            this.BackgroundImageLayout = ImageLayout.Stretch;
            MouseClick+=new MouseEventHandler(Plansza_MouseClick);
        }
        
        public virtual void Plansza_MouseClick(object sender, MouseEventArgs e)
        {
            gamestate.rysuj_statki();
        }

Wtedy kompiluje się, ale gdy kliknę na obiekt klasy, program wykrzacza się bo w funkcji rysuj_statki() nie ma ustawionej instancji obiektu. Więc dopisuję:

mapa[i,j] = new Plansza()

Program kompiluje się, ale nic się nie dzieje. Obiekty nie są rysowane. A zatem co jest nie tak ? Trzeba napisać jakieś odwołanie ? referencję ? Jeżeli tak to jaką ? z góry dziękuję za pomoc

0

Cos zaczarowales, bo to nie powinno sie skompilowac. Metodzie rysuj_statki podajesz referencje do okna, a w zadnym z podanych przykladow (ani 'dzialajacym' ani wlasciwym) tak nie robisz. Skoro wywolujesz ta metode z poziomu metody okna to wystarczy rysuj_statki(this).

0

Faktycznie tego tam nie powinno być i już nie ma :) Ale jak sam widzisz próbowałem i w taki sposób ale mimo to z poziomu innej klasy niż Form funkcja nie działa....

0

No to musisz jakos ta referencje podac. Zakladam, ze Form startuje pierwsza, tworzy instancje klasy X, ktora to instancja wywoluje rysuj_statki, tak? Zatem przekaz instancji klasy X referencje do Form (tak jak to robisz w rysuj_statki) i niech ona przekaze dalej. Ten pierwszy etap mozesz zrealizowac tak samo jak teraz - referencja jako argument metody - albo przekazac referencje w konstruktorze i zapamietac w skladowej klasy X. A pozniej z tego skorzystac. Jak nie wiesz jak to na forum bylo multum przykladow.

//edit - literowki

0

Chyba nie do końca się zrozumieliśmy (albo ja Ciebie nie zrozumiałem).
Generalnie wygląda to tak :

W klasie X jest funkcja rysuj_statki,
efekty działania funkcji maja być widoczne na Formie,
Funkcja wywoływana jest w klasie Y.

Postaram się pokombinować z tym refencjami...

0

No to dobrze sie zrozumielismy. Masz forme (klasa Form), klase Gra, zawierajaca metode rysuj_statki i jakas klase X, w ktorej wywolujesz ta metode, tak? Bo tak wynika z drugiego opisu. Jezeli tak, to przeczytaj dobrze moj ostatni post.

0

Muszę przyznać, że zrozumienie tego co napisałeś nie przychodzi mi łatwo. Próbowałem na kilka sposobów, ale dalej nie działa :

public void rysuj_statki(Form1 form)
{...}
public virtual void Plansza_MouseClick(object sender, MouseEventArgs e)
        {
            Form1 form = new Form1();
            gamestate.rysuj_statki(form);
        }

Próbowałem też :

gamestate.rysuj_statki(this);

ale nic z tego. Mógłbyś mi trochę bardziej łopatologicznie to wytłumaczyć ?

0

Ok, inaczej.

  1. W jakiej klasie znajduje sie Plansza_MouseClick?
  2. Jakie jest cialo metody rysuj_statki, bo to co podales jest bez sensu (nie wykorzystuje nigdzie przyjmowanego form).
0
  1. Zdarzenie MouseClick znajduje sie w klasie Plansza. W klasie Gra znajduje się funkcja:
public void rysuj_statki(Form1 form)
        {
            for (int i = 0; i < mapa.GetLength(0); i++)
            {
                for (int j = 0; j < mapa.GetLength(1); j++)
                {
                   if (sprawdz_statek(i, j))
                   {
                       mapa[i, j] = new Plansza();
                       mapa[i, j].BackgroundImage = Properties.Resources.ship;
                   }
                }
            }

,która to ma być wywołana z klasy plansza. Natomiast na Formie powinny pojawić się wyniki działania funkcji

0
  1. metoda, nie funkcja. Tak nazywaja sie funkcje w klasach.
  2. Po co Ci referencja do Form, skoro z niej nigdzie w tej metodzie nie korzystasz?

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