![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемма с подсчетом количества компанентов на форме [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