• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja kodu/Tablica obiektów?

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 30 kwietnia 2015 w C i C++ przez Rafajah Bywalec (2,090 p.)

Witam!

Powoli acz solidnie zgłębiam programowanie okienkowe w c++ builder.

Aktualnie robię kółko i krzyżyk i świadom konieczności szukania prosty rozwiązań i skracania kodu natrafiłem na kolejny problem.

Mam 9 pól na których wiele razy muszę wykonwywać różne czynności. Czynności te zamieściłem w różnych funkcjach własnych. Jednak mimo wszystko nie podoba mi się ilość kodu, ilość kopiuj wklej itp

Przykładowy fragment kodu:

void twoplayers()
{

  Form1 ->TloMenu -> Picture-> LoadFromFile("img/tlogra.bmp");
  Form1 -> BM1 -> Enabled=false;   Form1 -> BM1 -> Visible=false;
  Form1 -> BM2 -> Enabled=false;   Form1 -> BM2 -> Visible=false;
  Form1 -> BM3 -> Enabled=false;   Form1 -> BM3 -> Visible=false;
  Form1 -> BM4 -> Enabled=false;   Form1 -> BM4 -> Visible=false;
  Form1 -> Pole1 -> Enabled=true; Form1 -> Pole1 -> Visible=true; Form1 -> Pole1 -> Cursor=crHandPoint;
  Form1 -> Pole2 -> Enabled=true; Form1 -> Pole2 -> Visible=true; Form1 -> Pole2 -> Cursor=crHandPoint;
  Form1 -> Pole3 -> Enabled=true; Form1 -> Pole3 -> Visible=true; Form1 -> Pole3 -> Cursor=crHandPoint;
  Form1 -> Pole4 -> Enabled=true; Form1 -> Pole4 -> Visible=true; Form1 -> Pole4 -> Cursor=crHandPoint;
  Form1 -> Pole5 -> Enabled=true; Form1 -> Pole5 -> Visible=true; Form1 -> Pole5 -> Cursor=crHandPoint;
  Form1 -> Pole6 -> Enabled=true; Form1 -> Pole6 -> Visible=true; Form1 -> Pole6 -> Cursor=crHandPoint;
  Form1 -> Pole7 -> Enabled=true; Form1 -> Pole7 -> Visible=true; Form1 -> Pole7 -> Cursor=crHandPoint;
  Form1 -> Pole8 -> Enabled=true; Form1 -> Pole8 -> Visible=true; Form1 -> Pole8 -> Cursor=crHandPoint;
  Form1 -> Pole9 -> Enabled=true; Form1 -> Pole9 -> Visible=true; Form1 -> Pole9 -> Cursor=crHandPoint;
  Form1 -> NewGame -> Enabled=true; Form1 -> NewGame -> Visible=true;
  Form1 -> BackMenu -> Enabled=true; Form1 -> BackMenu -> Visible=true;
  Form1 -> TuraG -> Enabled=true; Form1 -> TuraG -> Visible=true;
  Form1 -> TuraM -> Enabled=true; Form1 -> TuraM -> Visible=true;
}
void mainmenu()
{
Form1 -> Pole1 -> Enabled=false; Form1 -> Pole1 -> Visible=false;
Form1 -> Pole2 -> Enabled=false; Form1 -> Pole2 -> Visible=false;
Form1 -> Pole3 -> Enabled=false; Form1 -> Pole3 -> Visible=false;
Form1 -> Pole4 -> Enabled=false; Form1 -> Pole4 -> Visible=false;
Form1 -> Pole5 -> Enabled=false; Form1 -> Pole5 -> Visible=false;
Form1 -> Pole6 -> Enabled=false; Form1 -> Pole6 -> Visible=false;
Form1 -> Pole7 -> Enabled=false; Form1 -> Pole7 -> Visible=false;
Form1 -> Pole8 -> Enabled=false; Form1 -> Pole8 -> Visible=false;
Form1 -> Pole9 -> Enabled=false; Form1 -> Pole9 -> Visible=false;
Form1 -> NewGame -> Enabled=false; Form1 ->NewGame  -> Visible=false;
Form1 -> BackMenu -> Enabled=false; Form1 -> BackMenu -> Visible=false;
Form1 -> TuraG -> Enabled=false; Form1 -> TuraG -> Visible=false;
Form1 -> TuraM -> Enabled=false; Form1 -> TuraM -> Visible=false;
Form1 ->TloMenu -> Picture-> LoadFromFile("img/tictactlo1.bmp");
Form1 -> BM1 -> Enabled=true;   Form1 -> BM1 -> Visible=true;
Form1 -> BM2 -> Enabled=true;   Form1 -> BM2 -> Visible=true;
Form1 -> BM3 -> Enabled=true;   Form1 -> BM3 -> Visible=true;
Form1 -> BM4 -> Enabled=true;   Form1 -> BM4 -> Visible=true;
}

No narazie nie jest źle. Ale jak będę chciał zrobić sapera to przecież się zajadę. Jest jakaś metoda żeby zamknąć to w pętli? Probowałem z pól zrobić coś w stylu tablicy ale mi się to nie udaje.. jakieś rady? 

Może podacie jakieś ciekawe źródła solidnej, koderskiej wiedzy żebym nie musiał przychodzić z każdą błachostką ;) Znalazłem kilka stron i książek ale bardziej zależy mi na jakimś kompedium wiedzy, esencji funkcji i technik opisanych w przejrzysty sposób. Żebym mógł w łatwy sposób znaleźć odpowiedź na nurtujące mnie pytanie, które dla doświadczonych osób jest elementarne i trywialne ;)

Z góry dzięki za pomoc! 

1 odpowiedź

+1 głos
odpowiedź 30 kwietnia 2015 przez nowyfolder Mądrala (7,250 p.)
wybrane 1 maja 2015 przez Rafajah
 
Najlepsza
Z tego co widze to korzystasz zawsze z tych samych metod, wystarczy wiec wrzucic wszystkie obiekty(w sumie to wskazniki na te obiekty) do jednego kontenera(tablicy, listy, vectora co chcesz) o typie klasy bazowej(tej w ktorej zdefiniowane sa te metody) i pętlą for dla każdeego elementu robić to samo.
komentarz 30 kwietnia 2015 przez Rafajah Bywalec (2,090 p.)
Dzięki za odpowiedź. Masz jakiś konkretny pomysł? Nie udało mi się jeszcze załapać jak to rozegrać.

Pola są typu TImage, który jest zdefiniowany przez program w ktorym piszę. C++ Builder nawiasem mowiąc. Chciałem zrobić tablicę tych obiektów w sensie coś jak Pole[] i kolejno elementy Pole[1] itd ale to nie przejdzie.. Nazwa obiektu nie może mieć zawierac nawiasów.
komentarz 1 maja 2015 przez nowyfolder Mądrala (7,250 p.)
edycja 1 maja 2015 przez nowyfolder

Przyznam sie, że nie rozumiem o co pytasz teraz wink. Zrobiłbym to tak:

Timage ** array = new (Timage*)[ILOSC_OBIEKTOW];
//przypisz do kazdego elementu odpowiedni wskaznik na obiekt:
//przyklad
array[2] = new TimageChildClass();//jesli juz jest utworzony obiekt to wystarczy sobie tutaj przypisac wskazik
//itd
for(int i = 0; i < ILOSC_OBIEKTOW; i++){//w devie chyba nie da sie for each?
  array[i] -> Enabled=false; 
  array[i] -> Visible=false; 
}

//mozna zrobic 2 tablice jesli chcesz podejmowac inne akcje dla roznych obiektow,
// albo dynamicznie sprawdzac typ obiektu(jesli dobrze pamietam jest to mozliwe za pomoca <dynamic_cast>)

Ostrzegam że nie testowałem więc mogą byc jakies błędy składni bo ostanio tylko na javie siedze od miesiaca, ale ja bym miał na to taki pomysł właśnie :)
Zakładam że te fukcje sa virtualne, powinny być chyba :)

komentarz 1 maja 2015 przez Dorion300 Szeryf (90,250 p.)
Tak zrobiłeś taki mały błąd.

W pierwszej linijce na końcu powinień być "]" zamiast ")"
komentarz 1 maja 2015 przez Rafajah Bywalec (2,090 p.)

Edit: 

Wszystko działa jak należy ;) Właśnie do czegoś takiego dążyłem. Prawie mi się to udało ale nie wpadłem na **array. Na siłę próbowałem czegoś takiego:

Timage * array = new Timage[ile];

Jeszcze raz dzięki ;) Ah, nowe możliwości! :D

 

komentarz 1 maja 2015 przez nowyfolder Mądrala (7,250 p.)
Literówka poprawiona.

Życzę powodzenia przy kodzeniu :)

Podobne pytania

0 głosów
1 odpowiedź 422 wizyt
pytanie zadane 12 lutego 2017 w Java przez Ssslimer Nowicjusz (240 p.)
0 głosów
3 odpowiedzi 197 wizyt
0 głosów
1 odpowiedź 116 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...