Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2016, 01:45   #1
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию Динамическое создание и инициализация массива компонентов на несколих формах

создаю в динамике UpDown

Код:
    TUpD[i] := TUpDown.Create(UpDown1.Parent);
    TUpD[i].Parent:=UpDown1.Parent;
    TUpD[i].Left:=UpDown1.Left;
    TUpD[i].Top:=UpDown1.Top+UpDown1.Height*(i+1)+(1*i) ;
    TUpD[i].Width:=UpDown1.Width;
    TUpD[i].Height:=UpDown1.Height;
    TUpD[i].Position:=qryPostypleniekolvo.Value;
    strngrd2.Cells[8,i+2]:=IntToStr(TUpD[i].Position);
    TUpD[i].Tag:=i+2 ;
    TUpD[i].OnClick:=Form33.UpDown1Click;
    inc(i);
в другом модле увеличиваю массив и добавляю еще UpDown
форма на которой увеличиваю массив открывается поверх той на которой его обявляю и создаю первый раз .
Код:
SetLength(TUpD,  Length(TUpD)+lst1.SelCount);
..............
          TUpD[RowCount-1] :=TUpDown.Create(UpDown1.Parent);
          TUpD[RowCount-1].Parent:=UpDown1.Parent;
          TUpD[RowCount-1].Left:=UpDown1.Left;
          TUpD[RowCount-1].Top:=UpDown1.Top+UpDown1.Height*(RowCount-2)+(1*RowCount-1) ;
          TUpD[RowCount-1].Width:=UpDown1.Width;
          TUpD[RowCount-1].Height:=UpDown1.Height;
          TUpD[RowCount-1].Position:=StrToInt(s);
          Cells[8,RowCount-1]:=IntToStr(TUpD[RowCount-1].Position);
          TUpD[RowCount-1].Tag:=RowCount-1 ;
          TUpD[RowCount-1].OnClick:=Form33.UpDown1Click;
выполняю при закрытии формы
Код:
  if TUpD <> nil then  //если массив существует
    for i := 0 to Length(TUpD) - 1 do  // от первого (нулевого) элемента до последнего
    //удал¤ем его
      FreeAndNil(TUpD[i]);
  TUpD := nil; // на всякий случай.
проверял пошагово массив отчищается.
почему остаются элементы массива компонентов на форме?? (те которые создавал в дочернем модуле.)
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 27.05.2016, 07:46   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как другой модуль видит TUpD и UpDown1? Подозреваю, что TUpD в другом модуле другой

ADD модле - надеюсь это модуль
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.05.2016 в 08:46.
Аватар вне форума Ответить с цитированием
Старый 27.05.2016, 09:10   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
TUpD[RowCount-1] :=TUpDown.Create(UpDown1.Parent);
запись как -бы подразумевает здесь цикл...
а какой диапазон изменений rowcount ? Сколько создаете? может идет наложение поверх старых? (перезапись массива).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.05.2016, 09:17   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Меня больше интересует - чем обоснован такой подход!
Как звучит задание в оригинале?

ИМХА: динмассив визуальных компонентов - это совсем некомильфо. Уверен, что здесь от него можно отказаться. НУЖНО (!!!) отказаться.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.05.2016, 10:23   #5
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Как другой модуль видит TUpD и UpDown1? Подозреваю, что TUpD в другом модуле другой
я объявил 1 глобалку. как он мог стать другим??

Цитата:
Сообщение от evg_m Посмотреть сообщение
может идет наложение поверх старых? (перезапись массива).
даже если так почему при выполнении
Код:
 if TUpD <> nil then  //если массив существует
    for i := 0 to Length(TUpD) - 1 do  // от первого (нулевого) элемента до последнего
    //удаляем его
      FreeAndNil(TUpD[i]);
  TUpD := nil;
они остаются?

Цитата:
Сообщение от min@y™ Посмотреть сообщение


ИМХА: динмассив визуальных компонентов - это совсем некомильфо. Уверен, что здесь от него можно отказаться. НУЖНО (!!!) отказаться.
уже отказался, но все же интересно почему так получилось.
п.с. при добавлении в StrinGrid хотел к одному столбцу к каждой ячейке прикрутить UpDown для редактирования столбца решил обойтись одним который перемещается в зависимости от фокуса.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 27.05.2016, 11:31   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

evg_m правильно написал, создаешь в цикле, а записываешь поверх в последнюю ячейку массива. FreeAndNil умный и ячейки с nil в массиве обходит. Затертых ссылок нет в массиве и удалятся те объекты при убивании формы.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.05.2016, 11:45   #7
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Т.Е, проверять нумерацию массива.
разве не добивает массив?? или просто окончательно затирает ссылки?
Код:
TUpD := nil;
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 27.05.2016, 12:14   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
разве не добивает массив
А это при чем? Нет в массиве ссылок на созданные объекты. Ты их затер раньше. TUpD := nil просто длину массива 0 делает. И ни как не связан с уничтожением объектов если в массиве ссылки на них
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.05.2016, 12:17   #9
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А это при чем? Нет в массиве ссылок на созданные объекты. Ты их затер раньше. TUpD := nil просто длину массива 0 делает. И ни как не связан с уничтожением объектов если в массиве ссылки на них
понял, спасибо.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание компонентов nibufep Общие вопросы Delphi 7 30.04.2016 13:27
Динамическое создание компонентов Janger Общие вопросы Delphi 11 29.06.2015 16:19
Динамическое создание компонентов Nagoran Общие вопросы Delphi 13 12.01.2015 20:09
динамическое создание компонентов DOLBY Компоненты Delphi 10 17.10.2010 14:03
Динамическое создание компонентов Nice42ru Помощь студентам 4 03.01.2010 20:51