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)
{

}