Dynamiczne tworzenie kontrolek (Editow, Labeli, etc)

0

Witam,

Potrzebuje w Visual C++ lub C# napisać program, który generował by i usuwał dynamicznie kontrolki takie jak labele, itp. Z tym, że dopiero podczas uruchomienia programu wiadomo będzie, ile i jakich kontrolek będzie, a do kontrolek chciałbym napisać obsługę kliknięć. Jak się za to zabrać?

0

Musisz je utworzyć, jak każde inne obiekty, ustawić właściwości Size i Position, a potem dodać do kolekcji Controls formularza.

0

Mam taki kod:

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

				this->newbutton = (gcnew System::Windows::Forms::Button());

				this->newbutton->Location = System::Drawing::Point(20+(index*100), 20);
				this->newbutton->Name = L"newbutton"+index;
				this->newbutton->Size = System::Drawing::Size(100, 36);
				this->newbutton->Text = L"newbutton"+index;
				this->newbutton->Click += gcnew System::EventHandler(this, &Form1::newbutton_Click);

				this->Controls->Add(this->newbutton);

				index++;
			 }

	private: System::Void newbutton_Click(System::Object^  sender, System::EventArgs^  e){
				
				MessageBox::Show("I am a button named X", "OH HAI!", MessageBoxButtons::OK);

			 }

Buttony są ładnie tworzone, ale chciałbym, żeby każdy button pokazywał np. "I am a button named <Nazwabuttona>", a nie zawsze to samo niezależnie który button jest kliknięty, tak jak jest teraz. Jak to zrobić?

0

Zrzutować parametr sender na Button i wydobyć właściwość Name. W C++/CLI to będzie jakoś tak:

MessageBox::Show("I am a button named " + ((Button^)sender)->Name, "OH HAI!", MessageBoxButtons::OK);
0

W jaki sposób mogę potem edytować właściwości utworzonych przeze mnie kontrolek? np chciałbym zmienić wartość Enable buttona o konkretnej nazwie ("dana_nazwa"), ale utworzonego w czasie pracy programu (nie używając do tego this->newbutton->Enabled, tylko za pomocą zmiennej var_name):

// Kod tworzący buttona:
String var_name = "dana_nazwa";

this->newbutton = (gcnew System::Windows::Forms::Button());
this->newbutton->Name = var_name;
this->newbutton->Text = L"text";

this->Controls->Add(this->newbutton);

this->newbutton = (gcnew System::Windows::Forms::Button()); // nie możemy użyć this->newbutton->Enabled

/* Tutaj kod zmieniający wartość Enabled buttona */

1

ale po co chcesz się odwoływać do kontrolki przez stringa, skoro masz zmienną? możesz umieścić tę zmienną w tablicy, jeśli masz takich więcej.

0

Próbuję zrobić coś takiego:

ref struct Scontrol {
   int module;
   int type;
   System::Windows::Forms::Button^ button_handler;
   System::Windows::Forms::CheckBox^ checkbox_handler;
   System::Windows::Forms::ComboBox^ combobox_handler;
   System::Windows::Forms::TextBox^ textbox_handler;
   System::Windows::Forms::ListBox^ listbox_handler;
   System::Windows::Forms::Label^ label_handler;

 };

std::vector <Scontrol^> Vcontrols;

Żeby potem do vectora Vcontrols zapisywać uchwyty do stworzonych kontrolek w taki sposób:


//zapis
Scontrol^ dane;
dane.module = 1;
dane.type = CONST_TEXTBOX;
dane.textbox_handler = this->newtextbox;
Vcontrols.push_back(dane);

//edycja tekstu
int i = 1;

if (Vcontrols[i].type == CONST_TEXTBOX)
    Vcontrols[i].textbox_handler->Text = "text";

0

<<nie dopisalem do poprzedniego posta, prosze o sklejenie postow>>

Ale dostaje bledy:

1>------ Build started: Project: BOT, Configuration: Debug Win32 ------
1>  BOT.cpp
1>D:\PROGRAMY\Visual C# 2010 Express\VC\include\xmemory(200): error C3699: '&&' : cannot use this indirection on type 'Scontrol ^'
1>          D:\PROGRAMY\Visual C# 2010 Express\VC\include\vector(421) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=Scontrol ^
1>          ]
1>          D:\PROGRAMY\Visual C# 2010 Express\VC\include\vector(481) : see reference to class template instantiation 'std::_Vector_val<_Ty,_Alloc>' being compiled
1>          with
1>          [
1>              _Ty=Scontrol ^,
1>              _Alloc=std::allocator<Scontrol ^>
1>          ]
1>          d:\prog\c++\bot\bot\Form1.h(25) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=Scontrol ^
1>          ]
1>D:\PROGRAMY\Visual C# 2010 Express\VC\include\vector(630): error C3699: '&&' : cannot use this indirection on type 'Scontrol ^'
1>D:\PROGRAMY\Visual C# 2010 Express\VC\include\vector(655): error C3699: '&&' : cannot use this indirection on type 'Scontrol ^'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0

To może Control daj jako typ przechowania dla wektora. A jak chcesz sięgać po nazwie jakąś kontrolkę to lepiej zrób to na mapie.

0
std::vector <System::Windows::Forms::Control^> Vcontrols;

Wywala praktycznie taki sam błąd jak wyżej

0

To możesz użyj .NETowych kolekcji np. listy.

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