• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Builder 6 - Dynamiczne tworzenie obiektu i odwoływanie się do niego

Object Storage Arubacloud
0 głosów
862 wizyt
pytanie zadane 11 grudnia 2017 w C i C++ przez JeD Nowicjusz (150 p.)

Witam !

Póki co moja wiedza na temat obiektówki jest uboga, stąd też problem może wydawać się banalny. 

Za pomocą przycisku chcę stworzyć szereg obiektów, w które będzie można wpisywać dane ( powiedzmy że jest to dynamicznie tworzenie wiesza zawierającego obiekty TEdit). Chciałbym by przy każdym wierszu znajdował się RadioButton którego będzie można używać do zaznaczania i usuwania całego wiersza. 

Dynamiczne tworzenie wierszy już działa, gorzej z usuwaniem. Póki co stworzyłem pętle która ma sprawdzać który RadioButton został zaznaczony, ale wywala blad AccesViolation... zaznaczając if(Kropka->Checked == true).

Drugie pytanie czy podejście z tworzeniem tablicy w przycisku jest OK ? Czy raczej tworzyć obiekty TEdit tak jak RadioButtona ?

int nr_lini=2;
int z=0;

TRadioButton *Kropka = NULL;




void __fastcall TForm1::NyLeveranseClick(TObject *Sender)
{


        TEdit **Poley = NULL;

        Poley = new TEdit *[ 20 ];

        Poley[ nr_lini ] = new TEdit( this );
        Poley[ nr_lini ]->Parent = this;
        Poley[ nr_lini ]->Left = 424;
        Poley[ nr_lini ]->Top = 136+ProsjektNavn->Height+z;
        Poley[ nr_lini ]->Width = 25;
        Poley[ nr_lini ]->Height = 27;
        Poley[ nr_lini ]->Show();
        Poley[ nr_lini ]->Text=nr_lini;
        Poley[ nr_lini ]->Font->Name="Calibri";
        Poley[ nr_lini ]->Font->Height=-16;
        Poley[ nr_lini ]->Font->Size=12;


//kropka
        TRadioButton *Kropka = NULL;

        Kropka = new TRadioButton( this );
        Kropka ->Parent = this;
        //Kropka->Name = (AnsiString)"RadioButton"+nr_lini;
        Kropka->Left = 8;
        Kropka->Top = 168+z;
        Kropka->Width = 17;
        Kropka->Height = 17;
        Kropka->Show();

 nr_lini++;
        z=z+27;


}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


void __fastcall TForm1::SlettLeveranseClick(TObject *Sender)
{
      for (int i=1; i<nr_lini; i++)
      {
       if(Kropka->Checked == true)
       {
                ShowMessage(i);
       }
      }

 

1 odpowiedź

+1 głos
odpowiedź 11 grudnia 2017 przez j23 Mędrzec (194,920 p.)
wybrane 12 grudnia 2017 przez JeD
 
Najlepsza

moja wiedza na temat obiektówki jest uboga, stąd też problem może wydawać się banalny  

Twój błąd nie ma związku z "obiektówką", a z brakiem znajomości podstaw C++:

TRadioButton *Kropka = NULL;
 ... 
 
 
void __fastcall TForm1::NyLeveranseClick(TObject *Sender)
{
         ...
 
         TRadioButton *Kropka = NULL;

         Kropka = new TRadioButton( this );
         ...
}


void __fastcall TForm1::SlettLeveranseClick(TObject *Sender)
{
         for (int i=1; i<nr_lini; i++)
         {
                  if(Kropka->Checked == true)
                  ...
}

Widzisz błąd?

 

Masz też wyciek pamięci: tworzysz (lokalnie) tablicę Poley, ale nigdzie jej nie zwalniasz. Zresztą, jaki jest sens tworzenia tablicy na stercie, jeżeli jej rozmiar jest stały (20)? No i najważniejsze pytanie: po co w ogóle ta tablica, jeśli za każdym razem tworzysz nową i ustawiasz tylko jeden element?

 

 

 

komentarz 11 grudnia 2017 przez JeD Nowicjusz (150 p.)
edycja 11 grudnia 2017 przez JeD

Tak widzę (chyba).

2x TRadioButton *Kropka = NULL;

Też wydawało mi się że tworzenie tutaj tablicy jest bez sensu, stąd od razu postawiłem takie pytanie.

Zostawmy te tablice, powiedzmy że tworze te obiekty w nastepujący sposób.

TEdit *Poley = NULL;

        Poley = new TEdit( this );
        Poley->Parent = this;
        Poley->Left = 424;
        Poley->Top = 136+ProsjektNavn->Height+z;
        Poley->Width = 25;
        Poley->Height = 27;
        Poley->Show();
        Poley->Text=nr_lini;
        Poley->Font->Name="Calibri";
        Poley->Font->Height=-16;
        Poley->Font->Size=12;

Po naciśnięciu przycisku tworzą się kolejne obiekty. W jaki sposób jestem w stanie odnieść się do konkretnego obiektu ? Nadanie dynamicznie nazwy ?

Kropka->Name = (AnsiString)"Kropka"+nr_lini;

Jak odwołać się do tej kropki w if () ?

Taki przycisk stworzyłem do sprawdzenia który RadioButton jest zaznaczony, ale wywala błędy...

void __fastcall TForm1::SlettLeveranseClick(TObject *Sender)
{
      for (int i=1; i<=nr_lini; i++)
      {
                if((Kropka+=i)->Checked == true)
                {
                        ShowMessage(i);
                }
      }

}

 

 

komentarz 11 grudnia 2017 przez j23 Mędrzec (194,920 p.)
edycja 11 grudnia 2017 przez j23

Nadanie dynamicznie nazwy ?

W VCL-u jest możliwe odwoływanie się do kontrolki po nazwie, ale nie wydaje mi się, żeby w tym przypadku to był dobry sposób. Tak bym zrobił:

class TForm1: public TForm
{
	...
private:
	std::vector<TRadioButton*> m_radioButtons;
	...
};

 
 
void __fastcall TForm1::NyLeveranseClick(TObject *Sender)
{
		...

		m_radioButtons.push_back(new TRadioButton( this ));
		
		m_radioButtons.back()->Parent = this;
		m_radioButtons.back()->Left = 8;
		m_radioButtons.back()->Top = 168+z;
		m_radioButtons.back()->Width = 17;
		m_radioButtons.back()->Height = 17;
		m_radioButtons.back()->Show();
...



void __fastcall TForm1::SlettLeveranseClick(TObject *Sender)
{
		for (int i = 1; i < m_radioButtons.size(); ++i)
		{
				 if(m_radioButtons[i]->Checked == true)
				 ...
}

 

Tu masz opis klasy std::vector (używaj go zamiast tablic dynamicznych) -> link

komentarz 12 grudnia 2017 przez JeD Nowicjusz (150 p.)
Dziękuje, działa.

Podobne pytania

0 głosów
1 odpowiedź 277 wizyt
0 głosów
1 odpowiedź 1,210 wizyt
0 głosów
1 odpowiedź 184 wizyt

92,536 zapytań

141,377 odpowiedzi

319,455 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...