Tablica komponentów

0

Nadmienię na początku, że chodzi o szczęsne/nieszczęsne C++/CLI
Do rzeczy. Żeby stworzyć dynamiczną kontrolkę na nowym oknie w tymże środowisku należy wykonać mniej więcej takie przypisanie (przykład dla Labela w nowym oknie):

Form^ forma = gcnew Form;
Label^ moj_Label = gcnew Label;
moj_Label->Text = "moja etykieta";
moj_Label->Location = Point(50, 50);
forma->Controls->Add(moj_Label);
forma->Show();

Problem (przynajmniej dla mnie) zaczyna się gdy chce mieć takich kontrolek dużo więcej, powiedzmy dwadzieścia Na przykład, żeby uzyskać taki efekt: (20 labeli ponumerowanych w pionie)

for (int i = 0; i < 20; i++)
{
    etykieta[i]->Text = "Etykieta nr - " + (i + 1).ToString();
    etykieta[i]->Location = Point(10, i + 1 * 5);
    forma->Controls->Add(etykieta[i]);
}

Stanęłem w miejscu w momencie deklaracji tablicy takich labeli, każda znana mi próba przynosi błąd. Dla tego dziwnego środowiska deklarowanie tablica opiera się o typ - array i wyglądało by to mniej więcej tak:

array<System::Label^> etykieta = gcnew array<System::LabeL>(20);

To niestety nie działa, taka konstrukcja jest przeznaczona dla różnych zmiennych, a nie dla kontrolek; Próbowałem naturalnie innych przypisań tablicowych (statycznych i dynamicznych) takich jak znane z C/C++:

Label^ etykiety[20];
Label etykiety[20];
Label* etykiety;
Label*^ etykiety;
vector<Label^> etykiety(20);
vector<Label> etykiety(20);

Niestety żadne przypisanie nie jest prawidłowe. Ktoś wie jak rozbić kontrolki/komponenty na tablice w tym środowisku?

1

W zasadzie to już trup (no może bardziej zombie - umarł dawno temu, ale wciąż się rusza).

		array<Label^>^ labels = gcnew array<Label^>(30);
		MyForm(void)
		{
			InitializeComponent();

			for (int i = 0; i < labels->Length; ++i)
			{
				labels[i] = gcnew Label();
				labels[i]->Text = "lb" + i;
				labels[i]->Location = Point(10, i*25+10);
				labels[i]->Parent = this;
			}
		}
0
_13th_Dragon napisał(a):

W zasadzie to już trup (no może bardziej zombie - umarł dawno temu, ale wciąż się rusza).

		array<Label^>^ labels = gcnew array<Label^>(30);
		MyForm(void)
		{
			InitializeComponent();

			for (int i = 0; i < labels->Length; ++i)
			{
				labels[i] = gcnew Label();
				labels[i]->Text = "lb" + i;
				labels[i]->Location = Point(10, i*25+10);
				labels[i]->Parent = this;
			}
		}

Niestety, ale nie. Ta wielce obiecująca linijka:

array<Label^>^ labels = gcnew array<Label^>(30);

Wywala u mnie następujące errory (mam polsko-niemieckie środowisko, errory idą po polsku)

Błąd (aktywny) E0079 oczekiwano specyfikatora typu
Błąd (aktywny) E0442 za mało argumentów dla elementu szablon klasy "std::array"
Błąd C3699 "^": nie można użyć tego operatora pośredniego na typie "std::array"
Błąd C2976 "std::array": za mało argumentów szablon
Błąd C2027 wykorzystanie niezdefiniowanego przez użytkownika typu "std::array"

6
davout napisał(a):
array<Label^>^ labels = gcnew array<Label^>(30);

Błąd (aktywny) E0442 za mało argumentów dla elementu szablon klasy "std::array"

Dałeś gdzieś w kodzie using namespace std i teraz ci samo array rozumie jako std::array zamiast prawidłowego cli::array.
Wyrzuć using albo podawaj zawsze cli::array.

Zawsze też możesz użyć dotnetowej nazwy tej samej klasy, czyli System::Array.

0

Dzięki, dzięki. Rzeczywiście gryzło się to z - using namespace std .

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.