Użycie kontrolki Button w kodzie

Odpowiedz Nowy wątek
2015-01-06 01:48
0

Witam!
Pisze gre saper i napotkalem pewien probrem logistyczny. Pomyślałem że zle zaplanowalem swoja aplikacje, ale w programowaniu wiele chwytow jest dozowlonych wiec postanowilem zapytac na forum przed przebudową kodu. Napisalem najpierw mechanike gry, losowania bomb, ustalania ile bomb jest w poblizu, odkrywania terenu gdzie nie ma bomb itp. Szkielet mam gotowy. Pomyslalem wiec ze sprobuje swoich sił w dorobieniu do tego interfejsu bardzo podobnego do tego z klasycznego sapera. Narobilem 100 przycisków, bo nie wiedzialem jak inaczej moge to rozwiazac. Do kazdego dodalem po kliknieciu wywolanie metody ktora sprawdza po numerze buttona w jakim znajduje sie polozeniu (konwertuje nazwe buttona np. button86 na pozycje w tablicy dwuwymiarowej (pole gry jest reprezentowane przez tablicę 10x10)). Wiec dochodzę do punktu w ktorym moge dany przycisk polaczyc z konkretna metoda w programie - mam pozycje na polu gry, sprawdzam czy jest bomba, lub czy to puste miejsce, jesli nie to chce zmienic text buttona na liczbe min dookola oraz jego styl. Jednak wymaga to zaprogramowania reakcji na kazdy przycisk 100 razy. Tu pojawia sie do was pytanie. Czy w metodzie niezwiazanej z danym przyciskiem, wiedzac co chce zrobic i majac w zmiennej nazwe przycisku moge to jakos zaprogramowac? Czytalem ze musialbym uzyc runtime compilera, jednak nie wiem jak to zrobic, a innego rozwiazania nie znalazlem. Jakies pomysly?

W skrocie chodzi o to by moc swobodnie zaprogramowac w jednej metodzie zmiany na 100 przyciskach znajac nazwe przycisku i majac ja w zminnej typu string.

Dziekuje za pomoc, pozdrawiam.

edytowany 1x, ostatnio: Goliblazej, 2015-01-06 01:51

Pozostało 580 znaków

2015-01-06 08:16
0

Ktoś już odpowiedział na twoje pytanie. Wystarczy zmienić zachowanie w zdarzeniu.


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-01-06 09:20
0

Nie wystarczy. Moge wszystkie 100 przyciskow obsluzyc jedna metoda w zdarzeniu click. Tylko jak w tej metodzie napisac ze ten przycisk ktory akurat ktos nacisnal zmienia swoje wsrtosci? Bo jednak piszac np this.button1.text = "cos"; musze odniesc sie do konkretnego przycisku. A chce napisac metode dzialajaca dla kazdego z tych 100 tak samo. Bo inaczej czeka mnie powielanie kazdej metody button_click 100 razy dla kazdego przycisku..

edytowany 1x, ostatnio: Goliblazej, 2015-01-06 09:25

Pozostało 580 znaków

2015-01-06 09:25
2
void anyButton_Click(object sender, EventArgs e)
{
    var button = (sender as Button);
    button.Text = "bar"; //Tekst zmieni się dla przycisku który został kliknięty.
}

GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-01-06 09:52
2

Ja bym zrobił że każde pole do kolejny obiekt posiadający składową button i bomb a zdarzenie onclick jako metoda tej klasy i 0 problemów ;)

A mógłbyś jakoś rozwinąć swój pomysł, najlepiej o najprostszy schemat w kodzie? :) Bo ja obiektówke dopiero zaczynam ruszać, więc ciężko mi to zrozumieć w moim przypadku. - Goliblazej 2015-01-06 15:51

Pozostało 580 znaków

2015-01-06 15:44
0

Wszystko ok. Ale teraz np mam metodę która wywołuje jako odkryj plansze, rekurencyjnie. Ona odpowiada za to czy dane pole powinno zostać odkryte (jak wiadomo po jednym kilknieciu w saperze odkrywa sie obszar dookoła). Dlatego musze zmienic atrybuty przycisków, które odpowiadają polom na tym obszarze. Wiem np. że po klikniecu button65 button 68,69,70,71 ma zostać zmieniony, innym razem zmienione maja byc buttony 98,99,100. W jaki sposób mogę w polecenie wcisnąć tą nazwę? Wywołując twoja funkcje mogę ustawić polecenia tylko dla konkretnego przycisku. Chce po prostu nazwy Button67 w stringu móc używać jako elementu. Jest to w ogóle możliwe?

edytowany 1x, ostatnio: Goliblazej, 2015-01-06 15:45
Dlatego mój sposób lepszy tylko wymaga sporych zmian w twoim kodzie ;) Robisz tablice 2-wymiarową zawierającą obiekty które są polami takimi jak podałem wyżej i wsio :p - mr_jaro 2015-01-06 15:47
No tak właśnie zrobię bo mój sposób nie prowadzi do niczego. - Goliblazej 2015-01-06 15:53

Pozostało 580 znaków

2015-01-06 15:58
1

Tak jak napisałem już, masz gdzieś tablice dwuwymiarową (symulacja planszy), która przechowuję kolejne obiekty typu pole. klasa pole zawiera składową button składową mine dodatkowo możesz dodać składową która ci bedzie przechowywała te informacje o punktach lub zrobić to na jednej składowej poprzez -1 mina, 0 nic nie ma, liczby dodanie punkty. w tej klasie masz też metodę onclick zrobioną którą podpinasz do przycisku w konstruktorze, do konstruktora przekazujesz referencyjni formę i w konstruktorze również "kładziesz" przycisk na forme.

Pozostało 580 znaków

2015-01-06 16:06
0
class Pole
        {
            Button button;
            int wartosc;
        }
        Pole[,] tablica = new Pole[10,10];

wartość to składowa w której jest przechowywana informacja o tym co jest na danym polu. 9 - mina, 0 - puste pole, 1-8 - liczba min w pobliżu. Ale co dalej?
"w tej klasie masz też metodę onclick zrobioną którą podpinasz do przycisku w konstruktorze, do konstruktora przekazujesz referencyjni formę i w konstruktorze również "kładziesz" przycisk na forme." - tego fragmentu nie jestem w stanie pojąć :(

edytowany 4x, ostatnio: Goliblazej, 2015-01-06 16:12

Pozostało 580 znaków

2015-01-06 16:10
1

Napisałem ci co masz zrobić i dla czego użyłeś

string button;

a nie Button button;


 ?
edytowany 1x, ostatnio: mr_jaro, 2015-01-06 16:11
zmienione. Jednak dalej nie rozumiem tej zacytowanej części stąd pogubiłem się w całym kodzie.. Mam obsłużyć 100 przycisków, które podczas startu programu juz istnieją. Po naciśnięciu jednego z nich jeśli okażę się że trafiłem w puste pole nie dość że będę musiał zmienić wartości przycisku który nacisnąłem to rekurencyjnie wywołam funkcję dla sąsiadów tego pola, aby odkryć obszar do min lub krawędzi. Kazdy z tych przycisków ma zmienić swój styl, oraz pokazać aktualną wartość. Dlatego nie rozumiem ,,kładzenia na forme" i całego tego zdania. - Goliblazej 2015-01-06 16:16
W mojej wersji nie istnieją, tylko podczas uruchamiania programu ty dopiero tworzysz te przyciski sam a nie z automatu inaczej tego w mojej wersji która daje z drugiej strony mówiąc bardzo mały nakład kodu, nie wykorzystasz - mr_jaro 2015-01-06 16:20

Pozostało 580 znaków

2015-01-06 16:34
0

Pozostałem jednak przy konsolowej wersji programu, próba stworzenia tego co mówiłeś mnie przerosła, nie rozumiałem z tego nic, mój sposób z przyciskami był zły więc chyba temat do zamknięcia..

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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