Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
1

Удаление динамически созданных объектов

19.01.2014, 17:44. Показов 1998. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
создаю объекты.
удаляю
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 for i:=2 to Length(mlbl7)-1 do
  begin
        mlbl7[i].Free();
    mlbl21[i].Free();
    mlbl9[i].Free();
  end;
  for i:=2 to Length(mlbl10)-1 do
  begin
    mlbl10[i].Free();
    mlbl11[i].Free();
    mlbl12[i].Free();
    mlbl13[i].Free();
    mlbl22[i].Free();
    mlbl23[i].Free();
    mlbl24[i].Free();
    mlbl25[i].Free();
    mlbl14[i].Free();
    mlbl15[i].Free();
    mlbl16[i].Free();
    mlbl17[i].Free();
    mlbl18[i].Free();
    mlbl26[i].Free();
    mlbl27[i].Free();
    mlbl28[i].Free();
    mlbl29[i].Free();
    mlbl19[i].Free();
    mlbl30[i].Free();
  end;
  for i:=2 to Length(medit)-1 do
  begin
    medit[i].Free();
    mpnl[i].Free();
  end;
все удаляется кроме того, что в первом цикле..
ошибок не выдает.
Подскажите в чем проблема.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2014, 17:44
Ответы с готовыми решениями:

События динамически созданных объектов
В программе динамически создаются вкладки с TWebBrowser. Если я просто кидаю на форму...

Создание событий для динамически созданных объектов
procedure Addrich; {добавление компонента на экран } begin...

Удаление динамически созданных компонентов
if not globrazr then Trichedit(PopupMenuforrichedit.PopupComponent).Free else...

Удаление динамически созданных элементов
Не могу понять почему у меня вылетает "Argument out of range" - аргумент вне диапазона. Пытаюсь...

18
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
19.01.2014, 18:27 2
Код создания объектов в студию
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
19.01.2014, 20:22  [ТС] 3
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
procedure Tmain_frm.slbl(m1: array of TsLabel; l1, l2: TsLabel;
  str1, str2: String;ysl,ysl2:Boolean);
  var
    i,l7:integer;
begin
  nentrants_frm.sprgrsbr1.Position:=nentrants_frm.sprgrsbr1.Position
  +StrToInt(floattostr(Roundto((100/StrToInt(nentrants_frm.Edit1.Text)),0)));
    l7:=3;
  for i := 0 to Length(m1)-1 do
  begin
      m1[i]:=TsLabel.Create(main_frm);
    //sozdaem lbl
     with m1[i] do
     begin
       case i of
        0:
        begin
          m1[i]:=l1;
        end;
        1:
        begin
          m1[i]:=l2;
        end;
       else
       begin
         if ysl2 then
         begin
          Parent:=mpnl[i];
          Top:=m1[i-1].Top;          
         end
         else
         begin
          Parent:=main_frm;
          Top:=m1[i-1].Top+56;
         end;
          left:=l1.Left;
          Width:=l1.Width;
          Height:=l1.Height;
          Color:=l1.Color;
          UseSkinColor:=False;
          Transparent:=l1.Transparent;
         Name:='lbl'+IntToStr(l7)+str1;
         if ysl then Caption:=IntToStr(l7)
         else
         begin
          Caption:=str2;
//          Left:=
         end;
         Font.Size:=12;
         Inc(l7);
       end;
       end;
     end;
  end;
end;
процедура куда передаются названия массива и другие параметры, все создается одинаково, но первый не удаляется
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
19.01.2014, 20:29 4
при создании цикл с нуля, при удалении - цикл с двух, так правильно?
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
20.01.2014, 00:06  [ТС] 5
да, потому что первые 2 созданы не динамически, я их и не удаляю..
и вообще не трогаю
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
20.01.2014, 00:27 6
Цитата Сообщение от sergey4iki Посмотреть сообщение
2 созданы не динамически
а разве суть удаления не в том, чтобы создав n объектов и удалить столько же n объектов? судя по циклам процедур создания и удаления создается и удаляется разное количество объектов
Цитата Сообщение от sergey4iki Посмотреть сообщение
создание
Delphi
1
2
3
4
5
....
for i := 0 to Length(m1)-1 do
  begin
      m1[i]:=TsLabel.Create(main_frm);
...
Цитата Сообщение от sergey4iki Посмотреть сообщение
удаление
Delphi
1
2
3
4
5
...
for i:=2 to Length(mlbl7)-1 do
  begin
        mlbl7[i].Free();
...
если объекты созданы в дизайн тайме, то при создании остальных объектов, при заполнении ими массива, необходимо начинать заполнять массив также со значения 2, предварительно засунув созданные объекты в массив, либо при уничтожении цикл также гнать до 0

а в чем смысл массива и даже не одного, а нескольких?
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
20.01.2014, 00:36  [ТС] 7
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for i := 0 to Length(m1)-1 do
  begin
      m1[i]:=TsLabel.Create(main_frm);
    //sozdaem lbl
     with m1[i] do
     begin
       case i of
        0:
        begin
          m1[i]:=l1;
        end;
        1:
        begin
          m1[i]:=l2;
        end;
       else
       begin
         if ysl2 then
         begin
          Parent:=mpnl[i];
          Top:=m1[i-1].Top;          
         end
         else
         begin
          Parent:=main_frm;
          Top:=m1[i-1].Top+56;
         end;
вот смотри первым двум элементам массива я просто присваиваю созданные уже объекта
да и в другом вопрос
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.01.2014, 01:25 8
Цитата Сообщение от sergey4iki Посмотреть сообщение
вот смотри первым двум элементам массива я просто присваиваю созданные уже объекта
Если бы сначала не было
Цитата Сообщение от sergey4iki Посмотреть сообщение
m1[i]:=TsLabel.Create(main_frm);
, тогда можно было бы говорить "просто присваиваю". А так получается что лейблов таки создано на две штуки больше чем надо.
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
20.01.2014, 09:55  [ТС] 9
не понимаю, что вы мне хотите втолдычить? все нормально создает и присваивает.
а если цикл удаления с нуля поставить все равно не удаляет...
причем так созданы и едиты и панели, но они удаляются
давайте по существу
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
20.01.2014, 12:13 10
sergey4iki, вот, например, что касается экземпляров, создаваемых при i = 0, 1:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  for i := 0 to Length(m1)-1 do
  begin
      //Создаём экземпляр, назначаем его владельцем main_frm. И ссылку
      //на созданный экземпляр записываем в m1[i].
      m1[i]:=TsLabel.Create(main_frm);
    //sozdaem lbl
     with m1[i] do
     begin
       case i of
        0:
        begin
          //Внимание! Здесь мы в m1[i] (i = 0) теряем ссылку на экземпляр, который создали ранее.
          //И вместо прежней ссылки записываем ссылку на другой экземпляр - l1.
          m1[i]:=l1;
        end;
        1:
        begin
          //Внимание! Здесь то же самое - теряем прежнюю ссылку в m1[i] (i = 1).
          m1[i]:=l2;
        end;
       else
       begin
Таким образом, потом, при удалении экземпляров при i = 0, 1, будут удалены l1 и l2, а те экземпляры, которые были были созданы на участке:
Delphi
1
m1[i]:=TsLabel.Create(main_frm); //При i = 0, 1
удалены не будут. И так как для них указан Owner (а значит и Parent) = main_frm, то эти экземпляры так и останутся на форме main_frm.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.01.2014, 12:38 11
Цитата Сообщение от Mawrat Посмотреть сообщение
И так как для них указан Owner (а значит и Parent)
Разве? Parent вроде никогда автоматом не присваивается.
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
20.01.2014, 13:08 12
Цитата Сообщение от northener Посмотреть сообщение
Разве? Parent вроде никогда автоматом не присваивается.
Да, точно, я спутал. Если экземпляру присвоить Parent, то Parent становится ответственным за уничтожение экземпляра, наподобие Owner-а. - В этом сходство. Но автоматического назначения Parent-а при задании Owner-а (и наоборот) не происходит.
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
20.01.2014, 13:30 13
Цитата Сообщение от Mawrat Посмотреть сообщение
Если экземпляру присвоить Parent, то Parent становится ответственным за уничтожение экземпляра
Разве? Parent вроде отвечает за отображение, но не за удаление.

Добавлено через 11 минут
Хотя, да... С уничтожением Парента, дочерние компоненты тоже удаляются.
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
20.01.2014, 15:33  [ТС] 14
Цитата Сообщение от Mawrat Посмотреть сообщение
Таким образом, потом, при удалении экземпляров при i = 0, 1, будут удалены l1 и l2, а те экземпляры, которые были были созданы на участке:
Код Delphi
1
m1[i]:=TsLabel.Create(main_frm); //При i = 0, 1
удалены не будут. И так как для них указан Owner (а значит и Parent) = main_frm, то эти экземпляры так и останутся на форме main_frm.
так мне так и надо!!
а объекты, которые не удаляются создаются под индексом 3 и 4
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
20.01.2014, 16:33 15
Цитата Сообщение от sergey4iki Посмотреть сообщение
так мне так и надо!!
Вот здесь надо уточнить - в самом ли деле делается то, что задумано? Если так и задумано, то как потом должны удаляться объекты, которые первоначально были под индексами 0 и 1 (те, которые были до присвоения l1 и l2)? Получается они удаляются только при удалении парента? - Т. е. они будут на форме в течение всего времени существования этой формы.

И следующий вопрос. Если метод Tmain_frm.slbl() будет вызван повторно (до вызова кода удаления объектов) то уже после этого код удаления первоначальный набор объектов не сможет удалить - потому, что ссылки на эти объекты будут уже потеряны. Возможно, нечто похожее и происходит в программе.

Для надёжности предлагаю перед кодом создания объектов выполнять FreeAndNil(m1[i]):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  for i := 0 to Length(m1)-1 do
  begin
      
      //Если элемент массива уже ссылается на какой-то объект, то освобождаем этот объект
      //и обнуляем ссылку на него.
      FreeAndNil(m1[i]);
      
      m1[i]:=TsLabel.Create(main_frm);
    //sozdaem lbl
     with m1[i] do
     begin
       case i of
        0:
        begin
          m1[i]:=l1;
        end;
        1:
        begin
          m1[i]:=l2;
        end;
       else
       begin
         if ysl2 then
         begin
          Parent:=mpnl[i];
          Top:=m1[i-1].Top;          
         end
         else
         begin
          Parent:=main_frm;
          Top:=m1[i-1].Top+56;
         end;
          left:=l1.Left;
          Width:=l1.Width;
          Height:=l1.Height;
          Color:=l1.Color;
          UseSkinColor:=False;
          Transparent:=l1.Transparent;
         Name:='lbl'+IntToStr(l7)+str1;
         if ysl then Caption:=IntToStr(l7)
         else
         begin
          Caption:=str2;
//          Left:=
         end;
         Font.Size:=12;
         Inc(l7);
       end;
       end;
     end;
  end;
Этот код обеспечит режим, при котором перед созданием новых объектов, прежние объекты будут удаляться (если ссылки на них непустые).
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.01.2014, 20:08 16
Цитата Сообщение от sergey4iki Посмотреть сообщение
а объекты, которые не удаляются создаются под индексом 3 и 4
Точно что под индексом? Или с номерами 3 и 4 в заголовке?
И я бы ещё поставил бы точку останова на строке
Цитата Сообщение от sergey4iki Посмотреть сообщение
for i:=2 to Length(mlbl7)-1 do
и посмотрел бы чему равно Length(mlbl7).
0
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
21.01.2014, 00:05  [ТС] 17
в общем..смотрел смотрел и насмотрел, что массивы вообще не заполняются, однако на форме они както создаются,а удаляются потом благодаря тому что удалил панели, на которых были лейблы.
не удаляются те лейблы у которых парент форма..
не знаю почему не заполняется массив..
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
21.01.2014, 01:47 18
Цитата Сообщение от sergey4iki Посмотреть сообщение
массивы вообще не заполняются, однако на форме они както создаются
Создаются компоненты. А с массивами ты явно где-то напутал.

Добавлено через 52 минуты
Цитата Сообщение от northener Посмотреть сообщение
А с массивами ты явно где-то напутал.
И я даже догадываюсь где. Там где ты передаешь массив в процедуру параметром по значению. Поставь var и массив заполнится.
1
29 / 29 / 19
Регистрация: 18.11.2012
Сообщений: 338
Записей в блоге: 1
21.01.2014, 09:37  [ТС] 19
спасибо, поставил теперь все работает, понимал что не заполняется почему-то..а почему..
0
21.01.2014, 09:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2014, 09:37
Помогаю со студенческими работами здесь

Один обработчик события для нескольких динамически созданных объектов
Я программно создаю несколько картинок и их кол-во всегда разное. Создаю картинки циклом: ...

Удаление динамически созданных компонентов TEdit с формы
Здравствуйте, помогите пожалуйста с удалением компонентов TEdit с формы. Есть 1 кнопка, по нажатию...

Удаление динамически созданных компонентов (panel, image, label)
Всем привет. У меня есть panel который создаётся внутри ScrollBox вместе с image и label внутри, ну...

Пересечение динамически созданных компонентов
Смоделировал ситуацию на обычно созданных компонентах, на картинке шейпы и мне нужно определять...

Пересоздание динамически созданных форм
Здравствуйте. Сразу к делу. У меня в программе есть кнопка, которая создаёт новую форму с...

Поиск динамически созданных TabSheet
Помогите пожалуйста. Есть TPageControl, на нем динамически созданы вкладки (количество может быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru