Rad Studio XE und vector.erase



  • Hallo Leute
    Wie kann es sein, dass mein Rad Studio XE kein Vector.erase kennt?
    Oder mache ich was falsch?

    std::vector<TImage*> ImgVector;
    
    ....
    
    if (OpenPictureDialog1->Execute()) {
    TImage *img = new TImage(Form1);
    img->Picture->LoadFromFile(OpenPictureDialog1->FileName);
    img->Left=0; img->Top=0;
    img->Width=img->Picture->Width;
    img->Height=img->Picture->Height;
    img->Stretch=true;
    img->Parent=Form1;
    ImgVector.push_back(img);
    
    ....
    
    ImgVector.erase(x); //erase gibt es nicht, sagt der Compiler?
    

    Ich möchte also ein Element aus dem Vector löschen.
    Würde mich über einen Tip freuen.
    Danke
    wNw



  • @wNw :

    Das genaue "gibt es nicht" wäre interessant. Ist wahrscheinlich ein "gibt es nicht mit dem Parameter x".
    Was ist x?



  • Der Compiler meckert, dass es kein ImgVector**.erase** gibt. Unabhängig von x. (x habe ich nur zum veranschaulichen genommen)
    Aber danke für deine Antwort



  • @wNw sagte in Rad Studio XE und vector.erase:

    Der Compiler meckert, dass

    Niemand will wissen, ob du die indirekte Rede beherrschst. Fehlermeldung: Copy&Paste zusammen mit dem passenden Code. Zum veranschaulichen ist blödsinn.



  • [BCC32 Fehler] Editor.cpp(252): E2285 Keine Übereinstimmung für 'std::vector<TImage *,std::allocator<TImage *> >::erase(int)' gefunden

    Der Code steht doch oben



  • @wNw sagte in Rad Studio XE und vector.erase:

    erase(int)

    int?

    Ist halt doof, wenn man nicht den kompletten Code zeigt.

    Und ich bezweifle, dass das die vollständige Fehlermeldung ist.



  • Ok,

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Game.h"
    #include "Editor.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    std::vector<TImage*> ImgVector;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
    
    {
    switch (Key){
    case 69 : //Editor öffnen (E- Taste)
    Form2->Close();//Editor schliessen   WURDE ZUM TESTEN ÜBERGANGEN!!!
    break;
    case VK_ESCAPE : //Escape (Programm beenden)
    Key=0; //Kein "Ping"-Sound
    Application->Terminate();
    break;
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::FormPaint(TObject *Sender)
    {
    Top=0;
    Left=1921;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::FormShow(TObject *Sender)
    {
    DisEnabelAllPicControls->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_AddPictureClick(TObject *Sender)
    { // Bilder hinzufügen
    if (OpenPictureDialog1->Execute()) {
    TImage *img = new TImage(Form1);
    img->Picture->LoadFromFile(OpenPictureDialog1->FileName);
    img->Left=0; img->Top=0;
    img->Width=img->Picture->Width;
    img->Height=img->Picture->Height;
    img->Stretch=true;
    img->Parent=Form1;
    ImgVector.push_back(img);
    lb_PictureList->AddItem(ExtractFileName(OpenPictureDialog1->FileName), NULL);
    lb_PictureList->ItemIndex=lb_PictureList->Count-1;
    EnableAllPicControls->Execute();
    UpdatePicturePositionEdits->Execute();
    }
    }
    //---------------------------------------------------------------------------
    
    
    
    
    
    
    
    
    
    
    
    //***************************************************************************
    //Manage Picture Controls :
    
    void __fastcall TForm2::bt_btn_PicRightClick(TObject *Sender)
    {// Ausgewältes Bild nach rechts verschieben
    ImgVector[lb_PictureList->ItemIndex]->Left++;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_PicLeftClick(TObject *Sender)
    {// Ausgewältes Bild nach links verschieben
    ImgVector[lb_PictureList->ItemIndex]->Left--;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_PicUpClick(TObject *Sender)
    {// Ausgewältes Bild nach oben verschieben
    ImgVector[lb_PictureList->ItemIndex]->Top--;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_PicDownClick(TObject *Sender)
    {// Ausgewältes Bild nach unten verschieben
    ImgVector[lb_PictureList->ItemIndex]->Top++;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_PicSizePlusClick(TObject *Sender)
    {//Bild vergrössern
    ImgVector[lb_PictureList->ItemIndex]->Width++;
    ScaleImageWidth->Execute();
    ImgVector[lb_PictureList->ItemIndex]->Height=ImgVector[lb_PictureList->ItemIndex]->Picture->Height*PicFak;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_PicSizeMinusClick(TObject *Sender)
    {//Bild verkleinern
    ImgVector[lb_PictureList->ItemIndex]->Width--;
    ScaleImageWidth->Execute();
    ImgVector[lb_PictureList->ItemIndex]->Height=ImgVector[lb_PictureList->ItemIndex]->Picture->Height*PicFak;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ed_PicLeftChange(TObject *Sender)
    {//Links-Wert eingeben für ausgewäles Bild
    	if (ed_PicLeft->Text != "") {
    	ImgVector[lb_PictureList->ItemIndex]->Left=StrToInt(ed_PicLeft->Text);
    	}
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ed_PicTopChange(TObject *Sender)
    {//Top-Wert eingeben für ausgewäles Bild
    	if (ed_PicTop->Text != "") {
    	ImgVector[lb_PictureList->ItemIndex]->Top=StrToInt(ed_PicTop->Text);
    	}
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::lb_PictureListClick(TObject *Sender)
    {//Wenn Bild-Auswahl angeklickt wird dann Werte in Edits übernehmen
    EnableAllPicControls->Execute();
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ed_PicWidthKeyPress(TObject *Sender, wchar_t &Key)
    {//Werte aus ed_PicWidth übernehmen und Bildhöhe proportional skalieren
    	if (Key == VK_RETURN) {//Enter muss gedrückt werden
    	Key=0;//Kein "Ping"-Sound
    	ImgVector[lb_PictureList->ItemIndex]->Width=StrToInt(ed_PicWidth->Text);
    	ScaleImageWidth->Execute();
    	ImgVector[lb_PictureList->ItemIndex]->Height=ImgVector[lb_PictureList->ItemIndex]->Picture->Height*PicFak;
    	UpdatePicturePositionEdits->Execute();
    	}
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ed_PicHeightKeyPress(TObject *Sender, wchar_t &Key)
    {//Werte aus ed_PicHeight übernehmen und Bildbreite proportional skalieren
    	if (Key == VK_RETURN) {//Enter muss gedrückt werden
    	Key=0;//Kein "Ping"-Sound
    	ImgVector[lb_PictureList->ItemIndex]->Height=StrToInt(ed_PicHeight->Text);
    	ScaleImageHeight->Execute();
    	ImgVector[lb_PictureList->ItemIndex]->Width=ImgVector[lb_PictureList->ItemIndex]->Picture->Width*PicFak;
    	UpdatePicturePositionEdits->Execute();
    	}
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::UpdatePicturePositionEditsExecute(TObject *Sender)
    {
    ed_PicLeft->Text=IntToStr(ImgVector[lb_PictureList->ItemIndex]->Left);
    ed_PicTop->Text=IntToStr(ImgVector[lb_PictureList->ItemIndex]->Top);
    ed_PicWidth->Text=IntToStr(ImgVector[lb_PictureList->ItemIndex]->Width);
    ed_PicHeight->Text=IntToStr(ImgVector[lb_PictureList->ItemIndex]->Height);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ScaleImageWidthExecute(TObject *Sender)
    {
    ImageWidth=ImgVector[lb_PictureList->ItemIndex]->Width;
    PicWidth=ImgVector[lb_PictureList->ItemIndex]->Picture->Width;
    PicFak=ImageWidth/PicWidth;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::ScaleImageHeightExecute(TObject *Sender)
    {
    ImageHeight=ImgVector[lb_PictureList->ItemIndex]->Height;
    PicHeight=ImgVector[lb_PictureList->ItemIndex]->Picture->Height;
    PicFak=ImageHeight/PicHeight;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_ResetPicSizeClick(TObject *Sender)
    {
    ImgVector[lb_PictureList->ItemIndex]->Width=ImgVector[lb_PictureList->ItemIndex]->Picture->Width;
    ImgVector[lb_PictureList->ItemIndex]->Height=ImgVector[lb_PictureList->ItemIndex]->Picture->Height;
    UpdatePicturePositionEdits->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::EnableAllPicControlsExecute(TObject *Sender)
    {
    ed_PicLeft->Enabled=true;
    ed_PicTop->Enabled=true;
    ed_PicWidth->Enabled=true;
    ed_PicHeight->Enabled=true;
    bt_btn_PicUp->Enabled=true;
    bt_btn_PicDown->Enabled=true;
    bt_btn_PicLeft->Enabled=true;
    bt_btn_PicRight->Enabled=true;
    bt_btn_PicSizePlus->Enabled=true;
    bt_btn_PicSizeMinus->Enabled=true;
    bt_btn_DelPicture->Enabled=true;
    bt_btn_ResetPicSize->Enabled=true;
    }
    
    void __fastcall TForm2::DisEnabelAllPicControlsExecute(TObject *Sender)
    {
    ed_PicLeft->Enabled=false;
    ed_PicTop->Enabled=false;
    ed_PicWidth->Enabled=false;
    ed_PicHeight->Enabled=false;
    bt_btn_PicUp->Enabled=false;
    bt_btn_PicDown->Enabled=false;
    bt_btn_PicLeft->Enabled=false;
    bt_btn_PicRight->Enabled=false;
    bt_btn_PicSizePlus->Enabled=false;
    bt_btn_PicSizeMinus->Enabled=false;
    bt_btn_DelPicture->Enabled=false;
    bt_btn_ResetPicSize->Enabled=false;
    }
    //---------------------------------------------------------------------------
    
    //***************************************************************************
    //End of Picture Control
    
    
    
    
    
    void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
    {
    ImgVector.clear();//Bin nicht sicher, ob die Bilder mitgelöscht werden
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::bt_btn_DelPictureClick(TObject *Sender)
    {
    lb_PictureList->Items->Delete(lb_PictureList->ItemIndex);
    DisEnabelAllPicControls->Execute();
    ImgVector.erase(lb_PictureList->ItemIndex);
    }
    //---------------------------------------------------------------------------
    

    Ganz unten







  • Das Problem ist doch, dass der Compiler kein vector.erase kennt.
    Vergiss das int. Da ist alles in int.
    🙂



  • Es gibt ja auch kein vector::erase mit int als Parameter.

    PS. Und warum ist ImgVector global?

    Und das Gegenteil von enable ist disable (nicht DisEnabel)...



  • @wNw sagte in Rad Studio XE und vector.erase:

    Das Problem ist doch, dass der Compiler kein vector.erase kennt.

    NEIN



  • Klingelt es endlich?
    Und schomal der Link für die Folgefrage:

    Erase–remove idiom



  • Ok, danke.
    Dann frage ich mal so:
    Wie würdet ihr in meinem Fall vorgehen?
    Ich will einfach nur ein Element aus dem vector löschen können.
    Danke

    Überschneidung, Jockelx



  • @wNw

    ImgVector.erase(lImgVector.begin() + b_PictureList->ItemIndex);
    


  • @manni66 sagte in Rad Studio XE und vector.erase:

    @wNw

    ImgVector.erase(lImgVector.begin() + b_PictureList->ItemIndex);
    

    Nein Doch



  • Viellen Dank für eure Hilfe, aber anscheinend drücke ich mich falsch aus.
    manni66 das bringt doch nichts und hat mit meinem Problem nichts zu tun.
    Ich will wissen, warum der Compiler vector.erase nicht kennt obwohl es doch in den "Statuten" von c++ steht:
    http://www.cplusplus.com/reference/vector/vector/erase/

    #include <vector>
    Habe ich in der Header (.h) Datei.



  • @Jockelx: Warum nein? @wNw möchte das Element an Position lb_PictureList->ItemIndex löschen und das geht mit
    dem von @manni66 gezeigten Code (bis auf, daß sich dort ein lverschoben hat ;- ):

    ImgVector.erase(ImgVector.begin() + lb_PictureList->ItemIndex);
    


  • @wNw sagte in Rad Studio XE und vector.erase:

    manni66 das bringt doch nichts und hat mit meinem Problem nichts zu tun

    Du kennst dich ja aus, da halt ich mich dann zurück ...



  • @Th69 Und wer aktualisiert die Indices der verbleibenden Items? Oder soll es beim zweiten löschen des letzten knallen bzw. den falschen löschen?
    Wobei sich natürlich die Frage stellt, wozu das ItemIndex gut ist überhaupt gut ist.


Log in to reply