dynamische Arrays löschen

Online-Skater

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

Code:
const short int x=8;
  TLabel *RLab[x];
  TEdit  *REdi[x];
  short int y = anzahl->ItemIndex;

  for (int i=0;i<num;i++)
  {
    delete RLab[i];  // <-- da ist der Fehler
  }
  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++;
  }

Ich weis nun nicht warum das falsch ist und wie ich das nun lösen kann, die Hilfe hat mir auch nicht geholfen da ich das z.B. mit Vektoren nicht kann usw.
 
Y

youngProgrammer

Die erste Schleife wird ja in jedem Fall ausgeführt, also auch, wenn noch keine Labels erstellt wurden, was ja erst in der zweiten Schleife passiert.

So wie ich das sehe, versuchst du also etwas zu löschen, was noch gar nicht da ist. Und das geht natürlich schief. Wenn du vorher prüfst, ob ein Objekt da (also nicht NULL) ist, sollte es meiner Meinung nach klappen:

Code:
for (int i=0;i<num;i++)
{
	if(RLab[i] != NULL)
	{
		delete RLab[i];
	}
}

Gruß, youngProgrammer
 

Online-Skater

Erfahrenes Mitglied
Hi

naja also so leicht ist das leider nicht, darüber habe ich auch schon nachgedacht aber wie du bestimmt weist wird eine for-Schleife nur dann ausgeführt wenn die Bedingung stimmt (2ter Parameter) und da am Anfang num = 0; geht er beim erstmaligen Changen auch nicht rein.
Sobald ich aber das 2te mal change ist num > 0 und dann bekomme ich ein EAccessViolationfehler, ein Zugriffsfehler. Ich habe leider keine Ahnung wie ich das Objekt wieder entfernen bzw freigeben kann.
 
Zuletzt bearbeitet:
Y

youngProgrammer

Du hast Recht, es ist eigentlich sogar viel simpler. Ich habe das ganze jetzt mal selbst ausgetestet (ich weiß, das hätte ich wohl schon vor dem ersten Post machen sollen *g*) und nach einigem herumexperimentieren habe ich es dann herausgehabt:

Du erstellst am Anfang der Funktion den Array RLab immer wieder neu. Und darüber stolpert die erste Schleife dann. Wenn du also die Zeile

Code:
TLabel *RLab[x];

rausnimmst und z.B. in den private- oder public-Bereich der Formular-Klasse einfügst, sollte es funktionieren.
Natürlich musst du dann auch die Variable x verschieben oder du benutzt eine #define-Konstante oder schreibst die Array-Größe gleich direkt zwischen die Klammern. Aber das kannst du ja machen, wie es dir am Liebsten ist.

Gruß, youngProgrammer
 
Zuletzt bearbeitet von einem Moderator:

Online-Skater

Erfahrenes Mitglied
Boah vielen Dank das ist es :)

Darauf wäre ich echt nie gekommen :-(
Japp so einfach kann das sein nur der Compiler führte mich nicht auf die richtige Fährte is halt kein Delphi :)

Also nochmal recht herzlichen Dank