Zdravím,
narazil jsem na problém, jehož příčina je pro mě nepochopitelná:
1. V konstruktoru formuláře vytvořím tabulku buttonů a nastavím jim nějaké parametry:
private: System::Windows::Forms::Button^ ** tabulka;
tabulka = new(System::Windows::Forms::Button^*[20]);
for (i = 0; i<20; i++)
{
tabulka[i] = (System::Windows::Forms::Button^*)malloc(30*sizeof(System::Windows::Forms::Button^));
for (j = 0; j<30; j++)
{
tabulka[i][j] = (gcnew System::Windows::Forms::Button());
tabulka[i][j]->Location = System::Drawing::Point(300+29*i+(i+4)/5, 30+24*j+(j+29)/30);
tabulka[i][j]->Size = System::Drawing::Size(30, 25);
tabulka[i][j]->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
tabulka[i][j]->BackColor = System::Drawing::Color::White;
Controls->Add(tabulka[i][j]);
}
}
Vše jde bez problémů nastavit a tabulka se zobrazí na formuláři, ale
2. V metodě nezávislého tlačítka, které mám na formuláři chci nastavovat paramety buttonů v tabulce:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
tabulka[15][15]->BackColor = System::Drawing::Color::LightPink; // TADY TO SPADNE!!!
}
A při pokusu o tuto změnu program spadne s hláškou
AccessViolationExcption was unhandled
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Zajímavé je, že pokud ten samý příkaz jen přesunu ctr+x ctrl+v o pár řádků výš do konstruktoru, tak bez problémů funguje. To samé platí i pro delete (tabulka[15][15]); .
Upravovat jiné komponenty (např. přednastavená tlačítka nebo normální tlačítka vytvořená v konstruktoru) je z vnitřku této metody také možné a funguje to. Vůbec nechápu, proč najednou nesmím zasahovat do té paměti, kterou jsem si v konstruktoru naalokoval.
Předem děkuji za případné vysvětlení i za případné konstruktivní nadávky na můj určitě prasácký kód.