Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 06.06.2012, 14:03   #1
Paleolit
Пользователь
 
Аватар для Paleolit
 
Регистрация: 27.05.2012
Сообщений: 14
По умолчанию Как создать динамический массив указателей на компоненты

Допустим я хочу создать массив в котором хранятся указатели на компоненты vcl (например на TChechBox), но мне заранее неизвестен сколько компонентов мне понадобится. Тогда я вместо:
Код:
TCheckBox* box[100];
Должен сделать так (n - сколько компонентов мне нужно создать):
Код:
TCheckBox* box = new TCheckBox[n]; //создаю динам массив указателей
//Я знаю что это очень похоже на само создание обекта:
//TCheckBox* box = new TCheckBox(this)
//Но мне же нужен массив а не обект
Компилятор при это ругается мол нету такого конструктора у TCheckBox.
Как же обяснить билдеру что мне нужен массив указателей а не обект?


Все сам решил
Вот:

Код:
void __fastcall TMainFrm::CreateComponent(TCheckBox* chk,String Caption,String Name){
 chk->parent = ProcList;
chk->Caption = Caption;
chk->Name = Name;
}
А вызываю так:
Код:
for (int i=0;i<n;i++){
CreateComponent(new TCheckBox(this),"Процесс"+String(i),"ChBox"+String(i));
}
Скажи мне на каком языке ты пишеш и я скажу тебе кто ты

Последний раз редактировалось Paleolit; 06.06.2012 в 14:34.
Paleolit вне форума Ответить с цитированием
Старый 06.06.2012, 14:41   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Я думаю, - массив все же нужно объявлять (до инициализации память все равно не съедается); потом в цикле инициализировать__
Код:
   TCheckBox *boxy[999] ;
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
     *boxy = new TCheckBox(this);
}
nick42 вне форума Ответить с цитированием
Старый 06.06.2012, 14:57   #3
Paleolit
Пользователь
 
Аватар для Paleolit
 
Регистрация: 27.05.2012
Сообщений: 14
По умолчанию

Как память не съедаеться?

Если обявить так например:
Код:
TCheckBox* chk[999];
То при запуске программы из стека откусывается 999*sizeof(TCheckBox) байтов. Для хранения самого указателя тоже нужна ведь памят. Или я не прав?
Скажи мне на каком языке ты пишеш и я скажу тебе кто ты

Последний раз редактировалось Paleolit; 06.06.2012 в 15:00.
Paleolit вне форума Ответить с цитированием
Старый 06.06.2012, 16:51   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Я не хочу вас расстраивать, но... попробуйте запустить программу, у которой записано chk[2] и потом ее же с другим значением - chk[999] при открытом диспетчере задач. И сравните занимаемый объем при старте. По мере нажимания на клавишу создания ( = new TCheckBox(this) объем постепенно будет расти.
nick42 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать динамически массив указателей в Си aues Общие вопросы C/C++ 4 05.04.2012 20:33
как создать динамический массив в своем классе? like_cloud Общие вопросы Delphi 6 24.11.2010 09:13
Как создать многомерный динамический массив в Delphi? Velross Помощь студентам 3 06.01.2010 20:50
Подскажите, как создать динамический массив? snaem Общие вопросы .NET 9 14.05.2008 07:52


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS