Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.019 c
1-1088577253
denmin
2004-06-30 10:34
2004.07.11
Как скопировать файлы по маске?


3-1087396247
Серг
2004-06-16 18:30
2004.07.11
Параметрический запрос


4-1086001107
TUser
2004-05-31 14:58
2004.07.11
Как не показывать окно


1-1088439763
Inkognito
2004-06-28 20:22
2004.07.11
Программно изменить расширение файла


14-1087541399
Layner
2004-06-18 10:49
2004.07.11
Что делает наша наука? НИИ?




   Наверх