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