Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизПроблемма с подсчетом количества компанентов на форме Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c