Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

290
15 августа 2012 года
Patr1ot
458 / / 09.02.2008
Добрый вечер!

Столкнулся с траблой, нужно удалить созданные ранее динамические объекты типа TImage имя у них разное image1, image2, imgae3...
Как к ним обратиться что бы удалить?
Спасибо.
277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
 
Код:
//Както так
TImage * img;
TComonentEnumerator enum=GetComponentEnumerator();
while(enum->MoveNext())
{
if((img=dynamic_cast<TImage*>enum->GetCurrent())!=NULL)
delete img;
}
290
17 августа 2012 года
Patr1ot
458 / / 09.02.2008
Все проблема решена. Решил не удалять объекты а потом по новой создавать а перезагружать изображение, в том разделе где меньше картинок что в предыдущем в лишних объектах просто удаляется загруженный рисунок, если объектов больше чем в предыдущем разделе создаются новые объекты.
290
15 августа 2012 года
Patr1ot
458 / / 09.02.2008
Вот мой код создания:

Код:
TIWImage * ime;



for (int i = 1; i < FileCount; i++)
{
 ime = new TIWImage(this);

 AnsiString buff = "C:\\1\\1\\"+IntToStr(i)+".jpg" ;





ime->Picture->LoadFromFile(buff);
ime->Parent=IWRegion1;
ime->Name="Palat"+IntToStr(i);
ime->Width = 700;
ime->Height = 400;
ime->Left=90;
ime->Top = TopIm;


ime->OnAsyncClick=IWButton2->OnAsyncClick;




ime->Refresh();

}
414
15 августа 2012 года
CassandraDied
763 / / 24.05.2012
delete ime; ?
290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
Всем спасибо я немного не правильно создавал объекты из за чего не мог удалить массив через delete ))

Код:
TIWImage * ime[10];



for (int i = 1; i < FileCount; i++)
{
 ime[i] = new TIWImage(this);

 AnsiString buff = "C:\\1\\1\\"+IntToStr(i)+".jpg" ;





ime[i]->Picture->LoadFromFile(buff);
ime[i]->Parent=IWRegion1;
ime[i]->Name="Palat"+IntToStr(i);
ime[i]->Width = 700;
ime[i]->Height = 400;
ime[i]->Left=90;
ime[i]->Top = TopIm;


ime[i]->OnAsyncClick=IWButton2->OnAsyncClick;




ime[i]->Refresh();

}
а удалял так:
ime->Free();
ime->Destroying();


А можете подсказать как определить создан объект или нет, это нужно перед удалением перед удалением.
277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
А если у тебя будет 20 файлов в папке? Лучше пользоваться моим способом удаления.
Цитата: Patr1ot
А можете подсказать как определить создан объект или нет, это нужно перед удалением перед удалением.


Сначала заполни массив NULL и при удалении проверяй if(img[x]!=NULL) {delete img; img[x]=NULL;} но нежелательно так делать.

290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
а почему не желательно?
277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Patr1ot
а почему не желательно?


1) ну это чинится например вводом константы в цикл или массив динамическим сделать

 
Код:
TIWImage * ime[10];//<<==Фиксированный размер
for (int i = 1; i < FileCount; i++)//<==ХЗ сколько реально файлов
{
2) черт знает кто может удалить элементы из массива, а так тебе на удаление дадут явно живые image'ы
290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
Не ну можно сделать TIWImage * ime[FileCount] и тогда будет точно известно сколько создано и сколько удалить.
277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Patr1ot
Не ну можно сделать TIWImage * ime[FileCount] и тогда будет точно известно сколько создано и сколько удалить.


тогда вообще надо делать так:

 
Код:
TIWImage * ime;
///.....
ime=new TIWImage[FileCount];
///.....
delete [] ime;
414
16 августа 2012 года
CassandraDied
763 / / 24.05.2012
Цитата: arrjj
Цитата: Patr1ot
Не ну можно сделать TIWImage * ime[FileCount] и тогда будет точно известно сколько создано и сколько удалить.


тогда вообще надо делать так:

 
Код:
TIWImage * ime;
///.....
ime=new TIWImage[FileCount];
///.....
delete [] ime;


Почему бы не использовать список?

277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: CassandraDied

Почему бы не использовать список?


ТС хочет извращений, не мешай ему :)

ПыСы я предлагал отказатся от такого, используя динамический массив (DynamicArray) но тс хочет проще сделать

290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
вы имеете ввиду создать список объектов для удаления типа: ime1, ime2, ime3?
А как я потом тогда смогу удалить, билдер не дает указать delete ime1; например так как этот объект еще не создан, он будет создан только в программе.((
290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
Всем спасибо! Жена постоянно отвлекала, из за чего запутался что вообще делаю, в общем сам дурак))
290
16 августа 2012 года
Patr1ot
458 / / 09.02.2008
Цитата: arrjj
А если у тебя будет 20 файлов в папке? Лучше пользоваться моим способом удаления.
Цитата: Patr1ot
А можете подсказать как определить создан объект или нет, это нужно перед удалением перед удалением.


Сначала заполни массив NULL и при удалении проверяй if(img[x]!=NULL) {delete img; img[x]=NULL;} но нежелательно так делать.



Определение создан ли объект не работает
я указываю:
if(ime!=NULL){delete ime;}

277
16 августа 2012 года
arrjj
1.7K / / 26.01.2011
ты его сначала сам должен поставить в null, перед созданием картинок, иначе будет мусор
1
16 августа 2012 года
kot_
7.3K / / 20.01.2000
а почему не использовать auto_ptr?
290
17 августа 2012 года
Patr1ot
458 / / 09.02.2008
Цитата: kot_
а почему не использовать auto_ptr?


что это такое? Я по сути делаю веб страничку, и мне нужно чтобы отображались картинки, решил создавать их динамически для простоты, просто подхватывать все изображения для определенного раздела из папки, без всякой базы. А вот про auto_ptr не слышал.

290
17 августа 2012 года
Patr1ot
458 / / 09.02.2008
Блиин. В общем неполучается.. в NULL как вы мне советовали слишком мутарно.


Вот код создания объектов:

TIWImage * ime;
Код:
Killime ();

for (int i = 1; i < 15; i++)
{
  ime[i] = new TIWImage(IWRegion1);
 texte[i] = new TIWLabel(this);
 AnsiString buff = "C:\\1\\1\\"+IntToStr(i)+".jpg" ;
ime[i]->Picture->LoadFromFile(buff);
ime[i]->Parent=IWRegion1;
ime[i]->Name="Palat"+IntToStr(i);
ime[i]->Cursor=crPointer;
ime[i]->Width = 700;
ime[i]->Height = 400;
ime[i]->Left=90;
ime[i]->Top = TopIm;
У меня 4 раздела каждый отображает свои картинки взятые из папок 1,2,3,4. В отображение я использую одно и тоже имя объектов просто разное их количество, и подхватывают данные из разных папок.
сделал функцию по удалению существующих объектов:

Код:
int Killime ()
{
for (int i = 1; i < 50; i++)
 {

  if(ime[i])
  {

  ime[i]->Free();
  texte[i]->Free();
  }

}
}
Функция удаления стоит в начале каждого обработчика по созданию image. То есть сначала она их удаляет потом она их создает но уже с другими рисунками.

Проблема в том что их хватает клика на 3 и вылетает ошибка(причем не важно какие разделы хоть один и тот же):
"Access violation at address 006158CB in module 'Intraweb_90_100.bpl'. Read of address 00000000C"

Подскажите как еще можно удалить созданные объекты зная их имя но не зная их количества, оно разное.
1
17 августа 2012 года
kot_
7.3K / / 20.01.2000
Цитата: Patr1ot
Цитата: kot_
а почему не использовать auto_ptr?


что это такое? Я по сути делаю веб страничку, и мне нужно чтобы отображались картинки, решил создавать их динамически для простоты, просто подхватывать все изображения для определенного раздела из папки, без всякой базы. А вот про auto_ptr не слышал.


О, Великий гугль - ауто_птр

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог