C++ Builder 删除动态数组的对象
C++ Builder Delete Objects of dynamic Array
我想删除我在 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];
之后您可以像以前一样使用这些指针。
你可以这样走。在 class 的 header 中定义数组和一些方法:
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();
}
希望这对您有所帮助...
@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)
{
}
我想删除我在 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];
之后您可以像以前一样使用这些指针。
你可以这样走。在 class 的 header 中定义数组和一些方法:
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();
}
希望这对您有所帮助...
@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)
{
}