Dynamiczne tworzenie komponentów

0

Mam taki problem: otworzywszy podrzędną formę tworzę na niej labele, załóżmy wypunktowanie w pionie. Wygląda to w ten sposób:

for (int i=1; i<=5; i++)
{
	TLabel *Napis;
	Napis = new TLabel(this);
	Napis->Parent = this;
	Napis->Caption = IntToStr(i) + ".";
	Napis->Left = 80;
	Napis->Top = 400 + 20 * Licznik;
}

Kiedy następny raz otwieram formę, chcę np. mieć 3 punkty a nie 5, jednak pozostałe dwa nadal tam są. Wiem że trzeba by usunąć obiekty poleceniem delete *Napis, ale jak to zrobić? Jeśli umieszczę tą instrukcję w OnClose to nawet nie chce się skompilować, gdyż nie zna czegoś takiego jak Napis. Cały szkopuł w tym aby wraz z zamknięciem okna usunąć te komponenty, które stworzyłem programowo. :|
To tylko przykład z tymi punktami, w rzeczywistości wymagana w programie zawartość labeli i ich ilość jest różna.

0

Hmmm.
W procedurze tworzenia obiektu daj:
Napis->Name = "Punkt4);

Później w OnClose:

delete dynamic_cast<TLabel*>(FindComponent("Punkt5"));

lub:

for(int i=0; i<Form2->ComponentCount; i++)
{
if(Components[i]->Name=="Punkit5");
    {
    delete Components[i];
    i--;
    }
}

MOżna by też tak jak w drugim przypadku, ale usuwać wszystko co ma Components[i]-

ClassName = "TLabel";

PS> nie mam pewności czy tam powinno być ComponentCount, czy ComponentsCount, sprawdź:)

0

Rozwiązanie Krecika jest dobre, ale można to zrobić bardziej elegancko.
Są dwa sposoby:

1) Twórz tę formę dynamicznie i w OnClose zwalniaj ją (Action = caFree). Ponieważ ta forma jest właścicielem etykiet, to będą one automatycznie zwalniane - przy następnym utworzeniu formy już ich nie będzie i stworzysz je sobie od nowa.

2) Jeśli dynamiczne tworzenie formy odpada, to proponuję rozwiązanie z przechowaniem obiektów klasy TLabel w deque. Gotowy kod:

Dołączenie biblioteki i przygotowanie do użycia deque:

#include <deque>
#ifndef _RWSTD_NO_NAMESPACE
  using namespace std;
#endif

Zmienne globalne:

typedef deque<TLabel*, allocator<TLabel*> > TSpisLabeli;
typedef TSpisLabeli::iterator iterLab;
TSpisLabeli SpisLabeli;

Twój lekko zmodyfikowany kod (w OnCreate czy gdzie go tam masz):

for (int i=1; i<=5; i++)
 {TLabel *Napis;
  Napis = new TLabel(this);
  Napis->Parent = this;
  Napis->Caption = IntToStr(i) + ".";
  Napis->Left = 80;
  Napis->Top = 20 * i;
  SpisLabeli.push_back(Napis);
 }

w OnClose:

iterLab i;
for (i = SpisLabeli.begin(); i < SpisLabeli.end(); i++)
  delete (*i);
SpisLabeli.clear();

W zależności, czy możesz czy nie towrzyć tę formę dynamicznie wybierzesz sobie odpowiednie rozwiązanie. Jeśli zdecydujesz się na 1) to pamiętaj, aby w opcjach projekty przenieść tę formę z listy Auto-create forms do Available forms.

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