Vector mit TToolButton



  • Hallo,

    wie kann man Buttons in ein Vector speichern?

    mit dem Code bekomme ich ein Speicher fehler.

    vector<TToolButton> vButtonArray;
    
    int iButton = 0;
    
    for (int i = 0; i < ToolBar2->ButtonCount; i++)
    {
      if (ToolBar2->Buttons[i]->Enabled)
      {  
      vButtonArray[iButton].Caption = ToolBar2->Buttons[i]->Caption;
      vButtonArray[iButton].ImageIndex = ToolBar2->Buttons[i]->ImageIndex;
      vButtonArray[iButton].Hint = ToolBar2->Buttons[i]->Hint;
      vButtonArray[iButton].Down = ToolBar2->Buttons[i]->Down;
      vButtonArray[iButton].Tag = ToolBar2->Buttons[i]->Tag;
    
      iButton++;
      }
    }
    

    Die Anzahl der Button ist Unbekannt.



  • Der Ansatz ist schon richtig. Du musst aber erst ein Objekt im Array mit push_back anlegen, dann kannst Du auch Eigenschaften zuweisen.



  • Ich bezweifle das man hier mit vector auf Objekten arbeiten kann. Die VCL mag hier eher Zeiger. Dann muss man sich evtl. noch um die Speicherverwaltung kümmern. Da gibts doch auch einen FAQ-Beitrag dazu.
    https://www.c-plusplus.net/forum/39211



  • TToolButton ist eine VCL Klasse, diese müssen grundsätzlich mit new angelegt werden.

    Man könnte aber die TToolButton Objekte in shared Pointer verwalten, denn shared Pointer lassen sich auch in einen vector packen:

    typedef boost::shared_ptr<TToolButton> PToolButton;
    
    vector<PToolButton> vButtonArray;
    
    for (int i=0; i <10;i++)
    {
      PToolButton toolButton(new TToolButton);
      toolButton->Parent = this; //Parent zuordnen:
      //...weitere Eigenschafen setzen
    
      vButtonArray.push_back(toolButton);
    
    }
    


  • Warum shared_ptr? Sollen die ToolButtons verteilt werden. Wenn boost möglich ist wäre auch boost::ptr_vector möglich.
    Ansonsten wäre hier ein vector auf normaler Zeiger auch Ok wenn man bei der Erstellung einen Owner angibt der sich dann ums Löschen kümmert.



  • boost::ptr_vector funktioniert zumindest beim CG2007 nicht. Würde die Hand nicht dafür in´s Feuer legen, dass ein bcc32 das kann.



  • Vector ist C++ Standart 11 und dies funktioniert erst mit der Version X10 unter 32 Bit.



  • Robbiani schrieb:

    Vector ist C++ stan**** 11 und dies funktioniert erst mit der Version X10 unter 32 Bit.

    std::vector ist bereits seit mind. C++ Builder 5 dabei.



  • und ist auch schon im 98'er Standard drin.


Log in to reply