Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как получить массив указателей на компоненты расположенные на TPanel
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
caxaromires caxaromires вне форума
Member
 
Аватар для caxaromires
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.03.2010
Thumbs up 07.04.2010, 20:15

Необходимо получить массив указателей на компоненты расположенные на панели. Причем, если на панели расположен контейнер, то указатели на содержащиеся в нем компоненты в результирующий массив входить не должны.
Пробовал так:
Код:
vector <TComponent *> v_Comp;
TComponentEnumerator *CE = Panel1->GetEnumerator();
while (CE->MoveNext())
{
v_Comp.push_back(CE->GetCurrent());
}
В цикл не заходит. Работает только для CE = Form1->GetEnumerator().
Ответить с цитированием
  (#2 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 08.04.2010, 03:44

Вообще-то, уже есть свойство Panel1->Components, которое содержит все компоненты, расположенные на панели... Чем не подходит?
Ответить с цитированием
  (#3 (permalink)) Старый
caxaromires caxaromires вне форума
Member
 
Аватар для caxaromires
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.03.2010
По умолчанию 08.04.2010, 10:33

Для панели Panel1->Componentcount == 0! Пробовал для GroupBox - то же самое. Отлично от нуля только для Form1.
Ответить с цитированием
  (#4 (permalink)) Старый
caxaromires caxaromires вне форума
Member
 
Аватар для caxaromires
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.03.2010
По умолчанию 08.04.2010, 10:49

Проблему решил!
Код:
vector <TControl *> v_Ctrl;
for (int i=0; i < Panel1->ControlCount; i++)
{
v_Ctrl.push_back(Panel1->Controls[i]);
}
Ответить с цитированием
  (#5 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 08.04.2010, 13:37

caxaromires
А всё-таки. Зачем один массив в другой переписывать? Почему сразу не использовать Panel1->Controls? :upset:
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
caxaromires caxaromires вне форума
Member
 
Аватар для caxaromires
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.03.2010
По умолчанию 08.04.2010, 14:34

Просто изначально условие задачи так сформулировал). и тут еще один момент: если сделать delete Panel1->Controls[i](i исходя из какого-либо условия) я не знаю что произойдет с массивом Controls(можно ли просто сделать после удаления i--)
Ответить с цитированием
  (#7 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 09.04.2010, 07:48

Цитата:
если сделать delete Panel1->Controls[i](i исходя из какого-либо условия) я не знаю что произойдет с массивом Controls
Компонент корректно удалится и пропадёт с панели, Panel1->ControlCount уменьшится на единицу. Как вариант, можно не удалять, а делать невидимым.

Цитата:
(можно ли просто сделать после удаления i--)
Вот это не понял...
Ответить с цитированием
  (#8 (permalink)) Старый
caxaromires caxaromires вне форума
Member
 
Аватар для caxaromires
 
Сообщений: 42
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 04.03.2010
По умолчанию 09.04.2010, 13:58

Будет ли возникать ошибка?

Код:
for (int i=0; i < Panel1->ControlCount; i++)
  {
  if (dynamic_cast<TSplitter*> (Panel1->Controls[i]) != NULL)
    {
    delete Panel1->Controls[i];
    i--;
    }
  }
Ответить с цитированием
  (#9 (permalink)) Старый
FataLL FataLL вне форума
Member
 
Аватар для FataLL
 
Сообщений: 1,783
Сказал(а) спасибо: 2
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 04.11.2004
По умолчанию 09.04.2010, 15:48

Лучше сделать так, чтобы дров не наломать
Код:
for (int i = Panel1->ControlCount-1; i >= 0; i-- )
  {
  if (dynamic_cast<TSplitter*> (Panel1->Controls[i]) != NULL)
    {
    delete Panel1->Controls[i];
    }
  }
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема! Массив строчных указателей. HungryInsect С/С++ 2 16.01.2012 16:04
Задан массив А,состоящий из 20 элементов. Получить из него массив В Наташок Visual Basic 0 22.12.2010 22:35
Массив указателей во Free Pascal Fatality73 Pascal 2 15.09.2009 17:15
Массив указателей на функции &lt;&lt;LexuS&gt;&gt; С/С++ 6 15.12.2006 14:44
Как получить массив в случайном порядки Azic C++ Builder 9 02.10.2006 11:43
Получить новый отсортированных по возрастанию массив ina Вопросы начинающих программистов 7 27.12.2005 12:47
Получить новый отсортированный по возрастанию массив фрося бурлакова Вопросы начинающих программистов 9 24.12.2005 05:14
Как по индексу получить доступ к элементам списка указателей Романнист C++ Builder 11 01.12.2005 13:57
Получить указатель типа unsigned short * на char-массив? kim_tmn С/С++ 2 02.09.2005 08:30
Массив указателей и освобождение памяти Stan C++ Builder 27 07.02.2005 12:51
Как можно динамически объявить массив указателей Garrik С/С++ 3 20.04.2004 19:20
Как получить данные из базы данных и загнать в массив или переменную igor_tem C++ Builder 2 15.04.2004 02:06



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов