Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.05.2014, 10:49
iem00 iem00 вне форума
Прохожий
 
Регистрация: 16.12.2013
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Firemonkey уничтожение динамических объектов

Доброго времени суток.

Создаю картинки на форме (мобильное приложение):

Код:
for i := 0 to 17 do begin
    NewEntered_Img[i]:= TImage.Create(MainForm.ScrollBox_Content);
    NewEntered_Img[i].Scale.X:= 2;
    NewEntered_Img[i].Scale.y:= 2;
    NewEntered_Img[i].Position.X:= NewEntered_Img_Grid[i,0];
    NewEntered_Img[i].Position.Y:= NewEntered_Img_Grid[i,1];
    NewEntered_Img[i].Visible:= true;
    NewEntered_Img[i].BringToFront;
    NewEntered_Img[i].Parent:= MainForm.ScrollBox_Content;
    NewEntered_Img[i].Name:= 'NewEnteredImg'+IntToStr(i);
    NewEntered_Img[i].OnClick:= MainForm.MainMenuImageClick;
  end;

Далее их необходимо удалить:

Код:
if NewEntered_Img[0] <> NIL then begin
    for i := 0 to 17 do begin
      NewEntered_Img[i].Parent:= nil;
      NewEntered_Img[i].Free;
      NewEntered_Img[i]:= nil;
    end;
  end;

В ходе работы программы возникает необходимость вновь создать эти картинки, но при повторном выполнении первого кода, программа вылетает на выполнении кода (строка 10 в первом листинге). Такое ощущение, что объекты не были удалены, либо информация об их имени хранится в программе.
Что делать?
Ответить с цитированием
  #2  
Старый 11.05.2014, 20:06
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Я бы использовал православный TObjectList для списка объектов и не присваивал бы имени динамически создаваемым компонентам.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #3  
Старый 11.05.2014, 20:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

так сам ScrollBox_Content уже имеет контейнер в виде свойства Components. можно его использовать для доступа к элементам TImage и удаления их. если есть еще какие-то TImage на нем, которые не должны при этом учитываться, можно использовать наследника от TImage.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 12.05.2014, 06:54
iem00 iem00 вне форума
Прохожий
 
Регистрация: 16.12.2013
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

[quote=NumLock]так сам ScrollBox_Content уже имеет контейнер в виде свойства Components. можно его использовать для доступа к элементам TImage и удаления их. если есть еще какие-то TImage на нем, которые не должны при этом учитываться, можно использовать наследника от TImage.[/QUOTE

Всем спасибо. А пример есть?
Ответить с цитированием
  #5  
Старый 12.05.2014, 10:48
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

а почему на NIL проверяется NewEntered_Img[0]
А удаляется затем NewEntered_Img[i].Free
Ответить с цитированием
  #6  
Старый 12.05.2014, 10:59
iem00 iem00 вне форума
Прохожий
 
Регистрация: 16.12.2013
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Удаляется всегда все кучей. Если [0] = NIL, то все остальные тоже NIL.
Ответить с цитированием
  #7  
Старый 12.05.2014, 18:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

создать:
Код:
var
  i: Integer;
  img: TImage;
begin
  for i:=0 to 24 do
  begin
    img:=TImage.Create(ScrollBox1);
    img.Parent:=ScrollBox1;
    img.Picture.LoadFromFile('d:\Картинки\Разное\apple.bmp');
    img.AutoSize:=True;
    img.Left:=(i mod 4)*img.Width;
    img.Top:=(i div 4)*img.Height;
  end;
end;
удалить:
Код:
var
  i: Integer;
begin
  for i:=ScrollBox1.ComponentCount-1 downto 0 do
    if ScrollBox1.Components[i] is TImage then
      TImage(ScrollBox1.Components[i]).Free;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter