Я хочу удалить старые изображения, которые я создал в цикле 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 ;
}
Вы должны удалить одно изображение простым 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];
после этого вы можете работать с этими указателями, как раньше.
@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)
{
}
Вы могли бы пойти так В заголовке класса вы определяете массив и некоторые методы:
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();
}
Надеюсь это поможет…