Rad Studio XE und vector.erase



  • 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



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

    int?



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

    @wNw :

    Was ist x?

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

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

    erase(int)

    int?

    erase



  • 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.



  • @Th69 Danke.
    Aber es gibt kein .erase bei ImgVector...
    Es ist zum verzweifeln



  • @wNw gibt nicht = "keine Übereinstimmung"?

    Die Fehlermeldung auf englisch ist "no matching overload found for std::vector<T>::erase".

    Du musst verstehen die Fehlermeldungen richtig zu verstehen und was das in C++ bedeuetet.
    Es gibt keine Überladung (<- lernen was das heißt, wenn unbekannt!) von der erase Funktionen die einen integer nimmt. Das heißt nicht dass es erase gar nicht gibt, das ist ja schmarn.



  • Muss ich da vielleicht was in den Compiler-Einstellungen verändern, damit .erase erkannt wird?



  • @wNw Auch wenn du ja eh alles besser weißt:
    Hast du das

    @Th69 sagte in Rad Studio XE und vector.erase:

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

    ausprobiert? Das kompilert bei dir sicher auch. Warum das semantisch (wahrscheinlich) nicht sinnvoll ist, hab ich schon gesagt, aber einen Kompilerfehler kriegst du nicht mehr.





  • Hast du meinen Code jetzt mal übernommen? Ansonsten zeige komplette Fehlermeldung!

    @Jockelx: ItemIndex stellt den aktuell selektierten Eintrag in der ListBox dar (da muß nichts nachträglich korrigiert werden - außer evtl. vorher eine Abfrage auf "nichts ausgewählt" (-1)).


Anmelden zum Antworten