#define MAX1 10
#define MAX2 20
typedef TSpeedButton* TSpeedButtonPtr;
TSpeedButtonPtr *dynSpeedButton = new TSpeedButton[MAX1];
for(int i = 0; i < MAX1;i++){
dynSpeedButton = new TSpeedButton[MAX2];
}
динамический массив
Как создать динамический двумерный массив SpeedButton'ов в Билдере?
Как создать динамический двумерный массив SpeedButton'ов в Билдере?[/QUOTE]
Код:
Cоздаст массив 10х20
Код:
#define MAX1 10
#define MAX2 20
typedef TSpeedButton* TSpeedButtonPtr;
// здесь нужно исправить
TSpeedButtonPtr *dynSpeedButton = new TSpeedButtonPtr[MAX1];
for(int i = 0; i < MAX1;i++){
dynSpeedButton = new TSpeedButton[MAX2];
}
#define MAX2 20
typedef TSpeedButton* TSpeedButtonPtr;
// здесь нужно исправить
TSpeedButtonPtr *dynSpeedButton = new TSpeedButtonPtr[MAX1];
for(int i = 0; i < MAX1;i++){
dynSpeedButton = new TSpeedButton[MAX2];
}
Код:
#define MAX1 10
#define MAX2 20
typedef TSpeedButton* TSpeedButtonPtr;
// здесь нужно исправить
TSpeedButtonPtr *dynSpeedButton = new TSpeedButtonPtr[MAX1];
#define MAX2 20
typedef TSpeedButton* TSpeedButtonPtr;
// здесь нужно исправить
TSpeedButtonPtr *dynSpeedButton = new TSpeedButtonPtr[MAX1];
Да, естественно это и имелось ввиду - первоначальный вариант был без typedef - забыл исправить. Спасибо за внимательность. :)
И мы оба забыли про параметр конструктора :)
И потому данный код работать не будет - потому как у данного компонента нет конструктора по умолчанию. А при приведении к базовому типу - получим исключение - чему даже удивлятся не нужно. :)
Таким образом остается один вариант - использовать контейнеры STL типа map или подобный ему. Или найти способ обойтись одномерным массивом ;)
Код:
void TForm1::myFunc (const unsigned int rows, const unsigned int cols,
TSpeedButton **** spdArray3dPtr, TWinControl * owner)
{
#define spdArray3d (*spdArray3dPtr)
unsigned int i;
spdArray3d = new TSpeedButton **[rows];
*spdArray3d = new TSpeedButton*[rows*cols];
for (i=1u; i<rows; ++i)
spdArray3d = spdArray3d[i-1] + cols;
for (i=0; i<rows; ++i)
{
for (unsigned int j=0; j<cols; ++j)
{
spdArray3d[j] = new TSpeedButton(owner);
/*//тестирование
spdArray3d[j]->Caption = AnsiString(i)+AnsiString(j);
spdArray3d[j]->Left = j*50;
spdArray3d[j]->Top = i*50;
spdArray3d[j]->Width = 45;
spdArray3d[j]->Height = 45;
spdArray3d[j]->Parent = owner;
// конец тестирования
//*/
}
}
/* Зачистка
// по идее, кнопки сами удалятся, так как у них есть владелец
for (i=0; i<rows; ++i)
{
for (unsigned int j=0; j<cols; ++j)
{
delete spdArray3d[j];
}
}
delete [] spdArray3d[0];
delete [] spdArray3d;
//*/
#undef spdArray3d
}
TSpeedButton **** spdArray3dPtr, TWinControl * owner)
{
#define spdArray3d (*spdArray3dPtr)
unsigned int i;
spdArray3d = new TSpeedButton **[rows];
*spdArray3d = new TSpeedButton*[rows*cols];
for (i=1u; i<rows; ++i)
spdArray3d = spdArray3d[i-1] + cols;
for (i=0; i<rows; ++i)
{
for (unsigned int j=0; j<cols; ++j)
{
spdArray3d[j] = new TSpeedButton(owner);
/*//тестирование
spdArray3d[j]->Caption = AnsiString(i)+AnsiString(j);
spdArray3d[j]->Left = j*50;
spdArray3d[j]->Top = i*50;
spdArray3d[j]->Width = 45;
spdArray3d[j]->Height = 45;
spdArray3d[j]->Parent = owner;
// конец тестирования
//*/
}
}
/* Зачистка
// по идее, кнопки сами удалятся, так как у них есть владелец
for (i=0; i<rows; ++i)
{
for (unsigned int j=0; j<cols; ++j)
{
delete spdArray3d[j];
}
}
delete [] spdArray3d[0];
delete [] spdArray3d;
//*/
#undef spdArray3d
}
Надеюсь, буду в состоянии разобраться со всем тем, что вы понаписали =) Еще раз спасибо.
vector из STL? Получаем некоторые дополнительные удобства...
Несмотря на то, что тема успешно закрыта, я хочу вякнуть: а может, лучше использовать
да и просил ведь именно массив.
Ничего, научится. Ковчег строил начинающий, а "Титаник" -- профессионалы.
[QUOTE=casual]да и просил ведь именно массив.[/QUOTE]
Может, он не знал, что надо спрашивать про std::vector?