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

Dynamiczne tworzenie komponentu na innym formularzu

Nowy postNapisane: niedziela, 30 marca 2014, 23:34
przez unloco
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).

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postNapisane: poniedziałek, 31 marca 2014, 09:06
przez Cyfrowy Baron
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

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postNapisane: poniedziałek, 31 marca 2014, 09:51
przez unloco
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.

Re: Dynamiczne tworzenie komponentu na innym formularzu

Nowy postNapisane: poniedziałek, 31 marca 2014, 10:17
przez Mironas
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.