C++Builder删除动态数组的对象
C++ Builder Delete Objects of dynamic Array
我想删除在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 ;
}
@Mykola我从代码中提取了这个例子,所以理解起来并不那么复杂。在按钮2中,我想删除标签项1 上的所有图像
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)
{
}
您必须通过简单的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];
在那之后,你可以像以前一样使用这些指针。
你可以这样做。在类的头中,您定义了数组和一些方法:
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);
}
}
因此,现在您可以在按钮事件中进行操作。
删除所有旧图像(如果存在)。
创建所有新图像。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Delete old Images, if existing
if (CheckImagesLoaded())
{
DeleteAllImages();
}
// Create new Images
CreateAllImages();
}
希望这能帮助。。。
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组