CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dynamiczne tworzenie komponentu na innym formularzu

Dynamiczne tworzenie komponentu na innym formularzu

dział ogólny

Dynamiczne tworzenie komponentu na innym formularzu

Nowy postprzez unloco » niedziela, 30 marca 2014, 23:34

Witam. Mam pytanie:

Jak mogę stworzyć dynamicznie obiekt TImage i wyświetlić go wewnątrz innego TImage znajdującego się w innym formularzu? O ile stworzenie dynamiczne obiektu na tym samym formularzu nie sprawia mi trudności, o tyle z innym już sobie nie radzę.

Próbowałem w ten sposób:

KOD cpp:     UKRYJ  
int petla1 = 1;
while (petla1 <= 2050)
{
 if (pewn_zmienna == tyle_ile_ma_być) // IF może się zgadzać tylko JEDEN RAZ
 {
  ImagePlane[petla1] = new TImage(Form1->ImageMap);
  ImagePlane[petla1]->Name = image_name; // zmienna wcześniej zadeklarowana
  ImagePlane[petla1]->Parent = this; // albo próbowałem też zamiast 'this' wpisać Form1, bo przy próbie wpisania 'Form1->ImageMap;' albo same 'ImageMap' wyskakuje błąd.

  ImagePlane[petla1]->Height = 20;
  ImagePlane[petla1]->Width = 20;
  ImagePlane[petla1]->Picture->LoadFromFile(GetCurrentDir() + "\\airplane_green.bmp");
  ImagePlane[petla1]->Visible = true;
  ImagePlane[petla1]->Enabled = true;
  ImagePlane[petla1]->Left = 50;
  ImagePlane[petla1]->Top  = 50;
  break; // żeby nie powstało więcej razy ImagePlane niż raz. Zakładam, że if +break jest poprawnie
 }
 petla += 1;
}


Dodam tylko, że ImageMap znajduje się NA ScrollBox1, aby obraz miał paski przewijania, a ScrollBox1 znajduje się już bezpośrednio na Form1.
Stworzenie obiektu następuje poprzez naciśnięcie buttona znajdującego się na Form4 (a Form4 wywołuje się buttonem z Form1, więc na pewno są powiązane, bo się pokazuje Form4). Jest to w ogóle możliwe?

Dodam jeszcze, że ten kod:

KOD cpp:     UKRYJ  
TImage *ImagePlane[2050];


znajduje się w Unit1.h ale kod tworzenia ImagePlane próbuję wywołać z Form4 (czyli Unit4.cpp).
Avatar użytkownika
unloco
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): niedziela, 23 grudnia 2012, 23:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: C++ Builder 2007
Gadu Gadu: 2154588
    Windows 7Firefox

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postprzez Cyfrowy Baron » poniedziałek, 31 marca 2014, 09:06

unloco napisał(a):stworzyć dynamicznie obiekt TImage i wyświetlić go wewnątrz innego TImage znajdującego się w innym formularzu?


Nie możesz! TImage nie posiada własnej powierzchni, to tylko zbiór narzędzi, czyli metod i funkcji. Niczego nie da się położyć na TImage, gdyż ten obiekt dziedziczy powierzchnię po obiektach na których leży. Jak inaczej można jeszcze to wyjaśnić? To tylko powierzchnia do rysowania, ale jeśli np. położysz TImage na TPanel to tak naprawdę grafika z TImage jest rysowana po TPanel z tą różnicą, że cały mechanizm rysowania znajduje się w TImage.

Dalsze rozważanie tego problemu nie ma sensu.

http://programowanie.cal.pl/cyfbar/teor9.htm
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4730
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postprzez unloco » poniedziałek, 31 marca 2014, 09:51

A tego to nie wiedziałem. Ale zamieniłem ImageMap na BitBtn1 i wszystko jest jak należy. Potrzebowałem po prostu komponent, do którego można wczytać obraz o wymiarze 3000x3000 i aby na nim tworzyć dynamicznie komponenty. Dzięki za info.
Avatar użytkownika
unloco
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): niedziela, 23 grudnia 2012, 23:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Win 7
Kompilator: C++ Builder 2007
Gadu Gadu: 2154588
    Windows 7Firefox

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postprzez Mironas » poniedziałek, 31 marca 2014, 10:17

A tak na marginesie.
Twoja pętla WHILE na pewno działa poprawnie.
KOD cpp:     UKRYJ  
int petla1 = 1;
while (petla1 <= 2050)
{
  [...]
  petla += 1;
}
Jednak w takim przypadku właściwe było by zastosowanie pętli FOR:
KOD cpp:     UKRYJ  
for (int petla1=1 ; petla1<=2050 ; petla1++)
{
  [...]
}

Prawda że krócej? I łatwiej dostrzec ewentualne błędy.
WHILE powinno być stosowana tam gdzie nie wiesz z góry ile iteracji ma wykonać twoja pętla. Jeśli wiesz - a w Twoim przypadku wiesz (2050 razy) - to raczej powinieneś zastosować FOR.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 449
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 21
Otrzymał podziękowań: 63
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości

cron