C ++ Builder Удалить объекты динамического массива

Я хочу удалить старые изображения, которые я создал в цикле for.

При первом нажатии на кнопку изображения создаются. Во второй или третий раз все старые изображения, которые были созданы, теперь должны быть удалены (перед циклом), а затем непосредственно восстановлены в цикле.

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

Я попробовал это с delete Image[i], free() а также delete[] (весь массив), но я всегда получаю Ошибка нарушения доступа. Вот мой следующий код:

TImage *Image[c]= ; //c is 5

Я хочу удалить старые изображения здесь, а затем создать новое в цикле ниже

for (int i = 0; i < c; i++)
{
str = " Test "
Image[i] = new TImage(this);
Image[i]->Parent = BoardItem ;
Image[i]->Height = 20 ;
Image[i]->Width = 20 ;
Image[i]->Position->X = d ;  // The program asks you the coordinate at the begining of a new loop
Image[i]->Position->Y = e ;
Image[i]->Bitmap = Icon->Bitmap ;
Image[i]->StyleName = str ;
Image[i]->OnClick = ImageClick ;
}

1

Решение

Вы должны удалить одно изображение простым delete оператор как:

for (int i = 0; i < c; i++)
{
delete Image[i];
// NULL deleted pointer
Image[i] = NULL;
}

Нарушение прав доступа также может быть вызвано тем, что вы все еще используете эти изображения где-то в своем коде. И почему вы хотите удалить эти изображения? Поскольку они являются указателями, вы можете просто обновить значения.

Зарезервировать значения для непредсказуемого количества указателей TImage* ты можешь использовать:

TImage** ppImage= NULL;

чем создать количество указателей, которые вы хотите:

ppImage = new TImage*[c];

после этого вы можете работать с этими указателями, как раньше.

1

Другие решения

@Mykola Я вытащил пример из своего кода, так что это не так сложно понять. в button2 я хочу удалить сейчас все изображения, которые находятся на tabitem1

void __fastcall TForm2::Button2Click(TObject *Sender)
{
TImage *Image[5] ;

for (int i = 0; i < c; i++) {
Image[i] = new TImage(this);
Image[i]->Parent = TabItem1 ;
Image[i]->Height = 20 ;
Image[i]->Width = 20 ;
Image[i]->Position->X = 10 ;
Image[i]->Position->Y = 10 ;
Image[i]->Bitmap = Image1->Bitmap ;
Image[i]->StyleName = "Something" ;
Image[i]->OnClick = ImageClick ;
}
}
//--------------------------------------------------------------------------
void __fastcall TForm2::ImageClick(TObject *Sender)
{
TImage *Img = dynamic_cast<TImage *>(Sender);
ShowMessage(Img->StyleName);
}
//--------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{

}
2

Вы могли бы пойти так В заголовке класса вы определяете массив и некоторые методы:

int c;                            // Maximum (better as define?)
TImage *Image[];

bool CheckImagesLoaded();
void DeleteAllImages();
void CreateImage(int nIndex, AnsiString str);
void CreateAllImages();

Затем в конструкторе вы инициализируете массив:

c = 5;
for (int i = 0; i < c; i++)
{
Image[i] = NULL;
}

Теперь вы можете проверить, загружены ли уже изображения:

bool TForm1::CheckImagesLoaded()
{
return Image[0]!=NULL;
}

Чтобы удалить их все:

void TForm1::DeleteAllImages()
{
for (int i = 0; i < c; i++)
{
delete Image[i];
Image[i] = NULL;
}
}

Создайте одно изображение, как это (вы должны расширить параметры по мере необходимости):

void TForm1::CreateImage(int nIndex, AnsiString str)
{
Image[nIndex] = new TImage(this);
/*Image[nIndex]->Parent = BoardItem ;
Image[nIndex]->Height = 20 ;
Image[nIndex]->Width = 20 ;
Image[nIndex]->Position->X = d ;  // The programm asks you the coordinate at the begining of a new loop
Image[nIndex]->Position->Y = e ;
Image[nIndex]->Bitmap = Icon->Bitmap ;
Image[nIndex]->StyleName = str ;
Image[nIndex]->OnClick = ImageClick ;
*/
}

И в цикле вы можете создавать все изображения, как вам нравится:

void TForm1::CreateAllImages()
{
AnsiString str = " Test ";
for (int i = 0; i < c; i++)
{
// load data from anywhere...
CreateImage(i, str);
}
}

Итак, теперь вы можете работать в Button-Event.

Удалите все старые изображения, если они есть.

Создайте все новые изображения.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Delete old Images, if existing
if (CheckImagesLoaded())
{
DeleteAllImages();
}

// Create new Images
CreateAllImages();
}

Надеюсь это поможет…

1
По вопросам рекламы [email protected]