CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wyliczanie obiektów znajdujących się na TPanel

Wyliczanie obiektów znajdujących się na TPanel

dział ogólny

Wyliczanie obiektów znajdujących się na TPanel

Nowy postprzez mate006 » poniedziałek, 12 grudnia 2011, 17:22

W jaki sposób można pobrać nazwy obiektów znajdujących się na obiekcie Panel1

Potrzebuje to w celu żeby np. wszystkie obiekty z Panel1 poprzenosiło na Panel2.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Wyliczanie obiektów znajdujących się na TPanel

Nowy postprzez Corvis » poniedziałek, 12 grudnia 2011, 22:34

Poczytaj o Form->ComponentCount i Form->Components
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Wyliczanie obiektów znajdujących się na TPanel

Nowy postprzez Cyfrowy Baron » wtorek, 13 grudnia 2011, 09:00

► patrz serwis: Cyfrowy Baron dział: porady -> różne -> Wyliczanie komponentów na formularzu, dostęp do komponentów poprzez pętlę.

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 ListBox1->Items->Clear(); /* lista do przechowywania nazw wyliczonych komponentów */

 TComponent *Temp;

 for(int i = Form1->ComponentCount - 1; i >= 0; i--)
 {
  Temp = Form1->Components[i];

  if(reinterpret_cast<TForm *>(Temp)->Parent == Panel1)
  {
    ListBox1->Items->Add("Nazwa obiektu: " + reinterpret_cast<TForm *>(Temp)->Name + " <> Klasa obiektu: " + reinterpret_cast<TForm *>(Temp)->ClassName());
  }
 }
}


Metoda reinterpret_cast lub dynamic_cast jest potrzebna tylko wtedy, gdy chcesz wykorzystać jakieś funkcje typowe dla danej klasy. Tutaj można by się bez niej obyć i zrobić od razu tak:

KOD cpp:     UKRYJ  
ListBox1->Items->Add( "Nazwa obiektu: " + Temp->Name + " <> Klasa obiektu: " + Temp->ClassName() );


► patrz serwis: Cyfrowy Baron dział: teoria -> Rzutowanie typów, przypisanie polimorficzne.

Klasa TComponent nie posiada metody np. Caption, więc nie da się użyć w ten sposób Temp->Caption, trzeba wykorzystać polimorfizm i rzutować na klasę, która tą metodę posiada, czyli można użyć klasy TLabel:

KOD cpp:     UKRYJ  
dynamic_cast<TLabel *>(Temp)->Caption = "Label";


Przenoszenie komponentów z Panelu na Panel można zrobić tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TComponent *Temp;

 for(int i = Form1->ComponentCount - 1; i >= 0; i--)
 {
  Temp = Form1->Components[i];

  if(reinterpret_cast<TPanel *>(Temp)->Parent == Panel1)
   reinterpret_cast<TPanel *>(Temp)->Parent = Panel2;
  else /* tylko po to by po ponownym kliknięciu wróciło na Panel1 */
   if(reinterpret_cast<TPanel *>(Temp)->Parent == Panel2) /*Ten warunek jest konieczny */
         reinterpret_cast<TPanel *>(Temp)->Parent = Panel1;
 }
}
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
    Windows XPFirefox

Re: Wyliczanie obiektów znajdujących się na TPanel

Nowy postprzez mate006 » wtorek, 13 grudnia 2011, 11:35

Taki sposób też mi przyszedł do głowy, jednak myślałem, że da się bez wyszukiwania wszystkich obiektów, bo trochę ich będzie na formularzu, ale zobaczę jak to będzie działało, gdy program zacznie funkcjonować.
Avatar użytkownika
mate006
Intelektryk
Intelektryk
 
Posty: 145
Dołączył(a): wtorek, 2 marca 2010, 14:12
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: Windows 7 Premium 64
Kompilator: Embarcadero® C++Builder® XE
Gadu Gadu: 0
    Windows 7Firefox

Re: Wyliczanie obiektów znajdujących się na TPanel

Nowy postprzez Cyfrowy Baron » środa, 14 grudnia 2011, 08:53

W prostszy sposób, to możesz umieścić te komponenty na jednym Panelu głównym, a potem zmieniać rodzica tylko dla Panelu głównego, a komponenty przeniosą się razem z Panelem.
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
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 30 gości