Dynamiczne tworzenie komponentów

dział ogólny

Dynamiczne tworzenie komponentów

Nowy postprzez Darek_C++ » Å›roda, 14 października 2009, 22:26

Jeśli chcemy stworzyć dynamicznie buttony musimy zdeklarować do nich wskaźniki:
TButton *MyButton1;
TButton *MyButton2;
TButton *MyButton3;
itd....następnie je utworzyc
MyButton1 = new TButton(this);
MyButton1->Parent = this;

MyButton2 = new TButton(this);
MyButton2->Parent = this;
itd przypisać na sztywno zdarzenia do zdeklarowanych metod...

Moje pytanie jest takie czy istnieje sposób na dynamiczne (trudno mi to właściwie nazwać) że zamiast z góry określonych nazw tworzymy wskaźniki
TButton *MyButton (nr)
gdzie zmienna nr jest typu int i przy każdym utworzeniu implementowana nr++ wskaźniki zapisać w jakieś liscie i następnie się dalej odwoływać
MyButton(nr) = new TButton(this);

Mam nadzieję, że Zrozumieliście o co mi chodzi ;)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamiczne tworzenie komponentów

Nowy postprzez banita » Å›roda, 14 października 2009, 22:35

wystarczy tak:
TButton* btn = new....

btn->name = "xyz";

i mozesz dalej

btn = new...

btn->name = "...";
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamiczne tworzenie komponentów

Nowy postprzez Darek_C++ » Å›roda, 14 października 2009, 22:38

Tylko jak pod takie buttony dynamicznie podpiąć zdarzenia, je skasować w razie potrzeby
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamiczne tworzenie komponentów

Nowy postprzez banita » Å›roda, 14 października 2009, 22:43

poprawka do mojego poprzedniego postu.

TButton* btn;

musi byc gdzies dostepny np jako pole klasy.

dalej pisze napisz np w zdarzeniach:
OnClick butoon1:

btn = new...
btn->Parent = ...
btn->name = "x";


OnClick button2:
tu musisz uzyc find component po nazwie jaka podales
...->Caption = "xxxxxxx";

OnClick button3
tu musisz uzyc find component po nazwie jaka podales
...->OnClick = wsk do funkcji obslugujacej zdarzenie(sygnature musisz sprawdzic);
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Dynamiczne tworzenie komponentów

Nowy postprzez Cyfrowy Baron » czwartek, 15 października 2009, 11:28

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 6 gości