Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемма с подсчетом количества компанентов на форме [D6, WinXP]


jenbond ©   (2004-06-28 15:48:00) 

Создаю на форме динамически компаненты(Shape). После этого нужно удалить эти объекты делаю вот так
for I := 0 to MonitoringForm.ComponentCount-1 do
begin    // Iterate
 if MonitoringForm.Components[i] is TIniShape then
 begin
 MonitoringForm.Components[i].Destroy;
 end;
end;
Но он ругается на то что кол-во объектов превышает в цикле.
Такое впечатление что счетчик ComponentCount улавливает и те которые были удалены.


default   (2004-06-28 22:21:00) [1]

так как созд-ёшь дин-ки шейпы можно было за минуту написать наследника с перекр-ыми конс-ом и дестр-ом для подсчёта шейпов в какой-нибудь глоб-ой пер-ой


jenbond   (2004-06-28 20:49:00) [2]

Что уж так сердиться. Я всем благодарен за разяснение. Каждый ког-да нибудь или где-нибудь черпает информацию!


Rem   (2004-06-28 20:48:00) [3]

1. Создаешь свои компоненты не на форме, а на панели (Align=alClient, NoBorder).
2. Panel.DestroyComponents;
3. Что характерно - потом (при изменениях в программе) удобнее будет работать с панелью.


TUser   (2004-06-28 20:19:00) [4]

i:=0;
while i < ComponentCount do
  if {надо дестроить} then
     Components[i].Free
     else inc (i);


icWasya   (2004-06-28 19:38:00) [5]

цикл надо переписать так

for I := MonitoringForm.ComponentCount-1 downto 0 do
begin    // Iterate
if MonitoringForm.Components[i] is TIniShape then
begin
MonitoringForm.Components[i].Destroy;
end;
end;

и всё будет в порядке


PVOzerski   (2004-06-28 16:10:00) [6]

>например о том, что максимальный индекс в цикле определяется один раз при начале цикла.

Вот именно. Пожалуй, разжую эту мысль еще подробнее. Вот в этот момент:

for I := 0 to MonitoringForm.ComponentCount-1 do

уже определилось, сколько раз будет прокручен цикл, и изменение значения свойства MonitoringForm.ComponentCount повлиять на число итераций цикла for уже не может. А именно уменьшение этого значения происходит при каждом Destroy'е. Можно попробовать заменить for на while, но осторожно. Предположим, у нас идет 2 подлежащих уничтожению контрола подряд. Убили 1-й из них - и 1-м стал бывший 2-й. А 2-м - бывший следовавший за 2-м. А счетчик цикла у нас скакнул на единицу. В результате 2-й из пары мы пропустили. Бороться - делать инкремент счетчика, только если не было Destroy.


Тимохов   (2004-06-28 15:54:00) [7]


> Такое впечатление что счетчик ComponentCount улавливает
> и те которые были удалены.

у меня ощещение, что вы не прочли ни одной книги по паскалю (дельфи, один фиг) и сразу же компоненты мацать :)))
например о том, что максимальный индекс в цикле определяется один раз при начале цикла. Почитайте книжечки - очено полейзно.


Sandman25   (2004-06-28 15:49:00) [8]

for I := MonitoringForm.ComponentCount-1 downto 0


Наверх

Титульная страница Поиск, карта сайта Написать письмо