Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.033 c
3-1087195829
denis24
2004-06-14 10:50
2004.07.11
select...


14-1088125196
Soft
2004-06-25 04:59
2004.07.11
Как вам такие ужастики? Стивен Кинг отдыхает...


4-1085663755
sesh
2004-05-27 17:15
2004.07.11
запуск программы как сервиса


14-1087813143
SoftX
2004-06-21 14:19
2004.07.11
А не перестроить нам картину мира?


1-1088158507
niko4543
2004-06-25 14:15
2004.07.11
Таймер.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский