Главная страница
    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.46 MB
Время: 0.062 c
1-1088510769
MadMax
2004-06-29 16:06
2004.07.11
XML-RPC проблемы с загрузкой SSL библиотек


14-1087733307
Александр Матросов
2004-06-20 16:08
2004.07.11
Что случилось с MAIL.RU?


1-1087808217
leonidus
2004-06-21 12:56
2004.07.11
Проблема с TZipMaster


4-1085655974
mmn
2004-05-27 15:06
2004.07.11
Проблема обхода реестра Windows (TRegistry).


3-1087390988
1008
2004-06-16 17:03
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский