C ++ Builder删除动态数组的对象

时间:2016-01-10 12:18:13

标签: c++ arrays c++builder timage

我想删除我在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 ;   
}

3 个答案:

答案 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();
}

希望这会有所帮助......