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

Zmiana numeru obiektu C++

Object Storage Arubacloud
0 głosów
125 wizyt
pytanie zadane 8 marca 2019 w C i C++ przez Mateusz Pawlak Użytkownik (960 p.)

Witam wszystkich forumowiczów. 
Od niedawna uczę się programowania w języku c++, jestem na etapie pisania pierwszych aplikacji okienkowych i podczas pisania swoich projektów zrodziło sie w mojej głowie pomysł który mocno ułatwiłby mi bardzo pracę. Mianowicie czy można napisać funkcje którą użyłbym np. do zmiany obrazka w obiektach ale w sposób podobny do tablic. Nie wiem czy bedzie to zrozumiałe dlatego napisze kawałek kodu żeby to zobrazować : 

.....

void zmiana_obrazu(int nr_pola)
{
        Form1 -> Image[nr_pola] -> Picture ->loadfromfile ('img/obraz.bmp') ;
}

.....

Domyślam się ze to co napisałem może być kompletnie bez sensu i sposób ( jeśli istnieje ) w który można to zrobić wygląda inaczej, jeśli ktoś zna taki sposób chętnie pozyskałbym tą wiedzę, ale chodzi głównie o idee. Czy jest to w ogóle możliwe czy trzeba klepać zmianę dla każdego obiektu osobno.

Z góry dziekuję za odpowiedź

2 odpowiedzi

+1 głos
odpowiedź 8 marca 2019 przez j23 Mędrzec (194,920 p.)
edycja 8 marca 2019 przez j23
class TForm1
{
	...

	TImage* Image1;
	TImage* Image2;
	TImage* Image3;
	TImage* Image4;	
	...

	std::vector<TImage*> Images;
	...

	void __fastcall TForm1::FormCreate(TObject *Sender) // podepnij pod OnCreate
	{
 		Images = { Image1, Image2, Image3, Image4 };
	}

public:
	...

	void zmiana_obrazu(int nr_pola)
	{
		if(Images.size() <= nr_pola) return;
		Images[nr_pola]->Picture->loadfromfile("img/obraz.bmp") ;
	} 
};

 

komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
To już wygląda bardziej logicznie, mam jeszcze pytanie.

Co jeśli mam 64 takie obiekty  muszę je wszystkie zadeklarować osobno, czy jest jakiś sposób masowej deklaracji?
1
komentarz 8 marca 2019 przez j23 Mędrzec (194,920 p.)
Tu niewiele zrobisz, ale...  Jeśli jest tyle obiektów, to zastanów się, czy nie lepiej tworzyć je dynamicznie w pętli (np. w konstruktorze) zamiast klikać te 64 image w edytorze okienek.
komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
Ale konstruktorze klasy from1 czy image. Czy muszę stworzyć klasę samemu?
1
komentarz 8 marca 2019 przez j23 Mędrzec (194,920 p.)

Skoro TForm1 jest właścicielem obiektów ImageX, to mowa oczywiście o konstruktorze tej klasy.

komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
A co jeśli chciałbym od razu przypisać jakieś wartości do obiektów image (np. Wysokość, szerokość, pozycja na formie)  Wymiary maja być takie same ale pozycja już nie.

Od razu chciałbym podziękować za juz udzielone mi rady.
1
komentarz 8 marca 2019 przez j23 Mędrzec (194,920 p.)

Co rozumiesz przez "od razu"? Klasa TImage ma właściwości, które służą do ustawiania pozycji i rozmiarów - zajrzyj do dokumentacji.

komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
Wiem jakie ma właściwości klasa image. Już wymyśliłem jak przypisze wartości do poszczególnych obiektów

Dzięki wielkie za pomoc, jak wrócę do domu sprawdzę ten kod który napisałeś

Jeszcze raz dzięki
1
komentarz 8 marca 2019 przez j23 Mędrzec (194,920 p.)

Poprawiłem kod, bo poprzedni działałby tylko wtedy, gdyby obiekty Image były stworzone przed przypisaniem do tablicy, a tu pewności nie mam (wprawdzie VCL-owskie klasy nieco inaczej działają, ale trzeba by się wgryźć w dokumentację i sprawdzić, kiedy są tworzone kontrolki kliknięte w designerze, a tego robić mi się nie chce :P).

komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
Dzięki wielkie :)
0 głosów
odpowiedź 8 marca 2019 przez MikDal Mądrala (5,660 p.)

A to nie możesz zrobić tego tak jak napisałeś?

class Form1Class
{
    ImageClass* Image;
    int ImagesCount;
}

class AnotherClass 
{

    Form1Class* Form1;

    void zmiana_obrazu(int nr_pola)
    {
        if (nr_pola >= Form1->ImagesCount || nr_pola < 0)
        {
            return;
        }

        Form1 -> Image[nr_pola] -> Picture ->loadfromfile ('img/obraz.bmp') ;
    }
}

Oczywiście zwróć uwagę na uproszczenia w powyższym kodzie :).

komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)

No właśnie nie czyta w ogóle tego w nawiasach kwadratowych. Wyskakuje błąd że nie ma takiego obiektu jak Image

"   [C++ Error] Unit1.cpp(15): E2316 'Image' is not a member of 'TForm1'  "

komentarz 8 marca 2019 przez MikDal Mądrala (5,660 p.)
Przecież błąd wyraźnie mówi co się dzieje: klasa TForm1 NIE ZAWIERA pola Image. Jesteś pewien, że masz odpowiednią linijkę w pliku nagłówkowym tej klasy?
komentarz 8 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
Mam image1, image2, ... I chodzi o to że kompilator nie czyta takiego zapisu jak image[i]. Szukam sposobu żeby zapisać to poprawnie. Potrzebuję tylko nazwę tej metody(nie wiem np tablica obiektów aalbo jakiś rodzaj wskaźnika) , nie potrzebuje gotowego rozwiązania do tego przypadku, resztę znajdę w internecie i zaadaptuje to do swojego przykładu

Podobne pytania

0 głosów
2 odpowiedzi 134 wizyt
0 głosów
1 odpowiedź 232 wizyt
pytanie zadane 17 marca 2019 w C i C++ przez MrChick888 Obywatel (1,020 p.)
0 głosów
2 odpowiedzi 144 wizyt
pytanie zadane 4 sierpnia 2018 w C i C++ przez jugan Nowicjusz (240 p.)

92,568 zapytań

141,420 odpowiedzi

319,624 komentarzy

61,956 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!

...