Zarządzanie w ten sposób tworzonymi komponentami będzie bardzo trudne i może wywołać mnóstwo błędów jeżeli gdzieś w kodzie coś pomylisz i nie odwołasz się do właściwego komponentu. Nazwę komponentowi (Name) i tak trzeba nadać, gdyż w przeciwnym razie będzie można się do niego odwoływać, ale nie poprzez nazwę (Name), co łatwo sprawdzić:
- Kod: Zaznacz cały
void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
String Name = dynamic_cast<TButton*>(Sender)->Name;
ShowMessage("Wciśnieto przycisk: " + Name);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TButton *MyButton = new TButton(this);
MyButton->Parent = this;
MyButton->OnClick = MyButtonClick;
}
//---------------------------------------------------------------------------
Ponieważ komponent nie otrzymał nazwy to komunikat będzie brzmiał tylko: "Wciśnięto przycisk".
- Kod: Zaznacz cały
void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
String Name = dynamic_cast<TButton*>(Sender)->Name;
ShowMessage("Wciśnieto przycisk: " + Name);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
static int x = 0;
TButton *MyButton = new TButton(this);
MyButton->Parent = this;
MyButton->Name = "MyButton" + (String)x;
MyButton->Left = 336;
MyButton->Top = 92 + (x * 30);
MyButton->OnClick = MyButtonClick;
x++;
}
//---------------------------------------------------------------------------
Po takim utworzeniu komponentów możesz odwoływać się do nich po nazwie, np. usuwać tak:
- Kod: Zaznacz cały
void __fastcall TForm1::Button5Click(TObject *Sender)
{
delete dynamic_cast<TButton*>(FindComponent("MyButton1"));
}
//---------------------------------------------------------------------------
Usunie przycisk MyButton1, ale jeżeli takiego obiektu nie będzie na formularzu to wyskoczy błąd. W celu uniknięcia błędu przed odwołaniem się do obiktu trzeba by sprawdzić, czy obiekt istnieje:
- Kod: Zaznacz cały
void __fastcall TForm1::Button5Click(TObject *Sender)
{
TComponent *Obiekt;
bool result = false;
for(int i = this->ComponentCount - 1; i >= 0; i--)
{
Obiekt = this->Components[i];
if(reinterpret_cast<TControl *>(Obiekt)->Name == "MyButton1")
{
result = true;
break;
}
}
if(result == true)
delete dynamic_cast<TButton*>(FindComponent("MyButton1"));
else
ShowMessage("Nie ma takiego komponentu");
}
//---------------------------------------------------------------------------
Jak widzisz sprawa nie jest prosta, a skomplikuje siÄ™ dodatkowo, gdy np. nadasz komponentowi nazwÄ™ poprzez inkrementacjÄ™ zmiennej:
a potem usuniesz taki komponent. By go ponownie utworzyć z taka samą nazwą, zawierającą usuniętą wartość liczbową, będziesz zmuszony gdzieś przechowywać informacje o tym jakie numery zostały już usunięte, gdyż w przeciwnym razie może się zdarzyć, że program spróbuje utworzyć obiekt z nazwą, która została już użyta.