Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Проблемма с подсчетом количества компанентов на форме   Найти похожие ветки 

 
jenbond   (2004-06-28 15:48) [0]

Создаю на форме динамически компаненты(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 улавливает и те которые были удалены.


 
Sandman25 ©   (2004-06-28 15:49) [1]

for I := MonitoringForm.ComponentCount-1 downto 0


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


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

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


 
PVOzerski ©   (2004-06-28 16:10) [3]

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

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

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

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


 
icWasya ©   (2004-06-28 19:38) [4]

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

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

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


 
TUser ©   (2004-06-28 20:19) [5]

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


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

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


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

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


 
default ©   (2004-06-28 22:21) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
1-1088595033
Boroda Oleg
2004-06-30 15:30
2004.07.11
Как групировать несколько компонент, чтобы изменить одно свойство


1-1088592098
plt
2004-06-30 14:41
2004.07.11
Выделение группы объектов


1-1087907095
Klerk
2004-06-22 16:24
2004.07.11
Снова Про Excel


14-1087820393
ИМХО
2004-06-21 16:19
2004.07.11
Вопрос по ICQ


8-1082626570
Sergey__
2004-04-22 13:36
2004.07.11
Как сделать чтобы текст плавно передвигался по форме