Array Element bzw. Objekt löschen



  • Hallo

    Wie im Titel beschrieben möchte ich gerne neu erstellte Objekte löschen. Ich habe ein DropDown Menü mit Feldern von 2-10 und bei dem Ereignis OnChange möchte ich die vorher creirten Objekte löschen, falls welche da sind und dann dementsprechend viele anlegen.

    const short int x=9;
      TLabel *RLab[x];
      TEdit  *REdi[x];
      short int y = anzahl->ItemIndex;
    
      for (int i=1;i<=num;i++)
      {
        delete RLab[i];   // <--- da ist der Fehler
      }
      num = 0;
    
      for (int i=1;i<=y;i++)
      {
        RLab[i] = new TLabel(this);
        RLab[i]->Parent = this;
        RLab[i]->Width = 14;
        RLab[i]->Left = 195;
        RLab[i]->Top = 78+(i*25);
        int z = i+2;
        RLab[i]->Caption = "R"+String(z);
        RLab[i]->Name = "wid"+String(z);
        num++;
      }
    

    Ich bekomme beim zweimaligen Changen eine EAccesViolation Fehlermeldung.



  • Hallo,

    Deine Schleifen über deine Felder sollten grundsätzlich so aussehen.

    for (int i=0;i<x;i++)
    

    Da x=9 ist, ist 8 auch dein höchster Index. Wo belegst du denn num oder y?



  • Des Weiteren kommt hinzu, dass

    x immr 9 ist und alle neuen Elemente mit Index 9 angelegt werden?



  • Wo y belegt wird weiß ich jetzt. 😉
    @Christian
    Wo siehst du hier x im Index beim Zugriff?



  • const short int x=9; 
      TLabel *RLab[x]; 
      TEdit  *REdi[x];
    


  • num ist eine globale Variable und zählt die erstellten Komponenten, damit ich sie bei erneutem Aufruf wieder löschen kann.
    y ist die Anzahl der Komponenten die erstellt werdne sollen.
    Ich habe den Code nun so geändert:

    const short int x=8;
      TLabel *RLab[x];
      TEdit  *REdi[x];
      short int y = anzahl->ItemIndex;
    
      for (int i=0;i<num;i++)
      {
        //RLab[i]->Visible = false;
          delete RLab[i];
      }
      num = 0;
    
      for (int i=0;i<y;i++)
      {
        RLab[i] = new TLabel(this);
        RLab[i]->Parent = this;
        RLab[i]->Width = 14;
        RLab[i]->Left = 195;
        RLab[i]->Top = 103+(i*25);
        int z = i+3;
        RLab[i]->Caption = "R"+String(z);
        RLab[i]->Name = "wid"+String(z);
        num++;
      }
    

    Bei zweiten Aufruf geht er dann in die Löschroutine, da num > 0 aber wiegesagt EAcessViolation-Fehler also ich kann auf das Element nicht zugreifen, obwohl ich diese erstellt habe.
    Danke schonma für den Tipp



  • @Christian
    Hier werden zwei Arrays von je 9 Elementen (TLabel* und TEdit*) erzeugt. Beim Erzeugen der neuen Elemente wird i im Index ja schön weitergeschalten.
    @shadowmasta
    Bitt schau mal in die FAQ unter Komponenten. Da gibt es Beispiele unter Verwendung von DynamicArray sowie std::vector. Nimm lieber eines davon.



  • Also falls es noch jemanden interessiert, der Fehler war, das diese Zeilen:

    TLabel *RLab[x];
      TEdit  *REdi[x];
    

    immer wieder bei der Change routine aufgerufen wurde.

    Lösung: z.B. in private deklarieren...


Log in to reply