Вниз
Скачать: 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.02 c
14-1088128632
Думкин
2004-06-25 05:57
2004.07.11
С днем рождения! 25 июня


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


4-1086095708
Long
2004-06-01 17:15
2004.07.11
Как послать WM_SYSCOMMAND,SC_RESTORE окну, которое


3-1087298262
Xmen
2004-06-15 15:17
2004.07.11
немогу сохранить фото в базу Oracle


1-1088413528
Sir John
2004-06-28 13:05
2004.07.11
XML Parsing




   Наверх