我想删除我在for循环中创建的旧图像。
第一次单击按钮时,会创建图像。第二次或第三次,无论如何,现在应该删除创建的旧图像(在循环之前),然后直接在循环中重新创建。
因为我从数据库中获取Image
属性,当有人在数据库中更改了某些内容时,您应该能够从数据库中获取最新的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 ;
}
答案 0 :(得分:2)
@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)
{
}
答案 1 :(得分: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];
之后你可以像以前那样使用那些指针。
答案 2 :(得分:1)
你可以这样。在类的标题中,您可以定义数组和一些方法:
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();
}
希望这会有所帮助......