Problem beim löschen von Komonenten im Vector
-
Hi
Ich habe ein Vector vom Typ Gruppe:
vector<Gruppe> Gruppen;struct Gruppe { TPanel *Panel; TLabel *lblTitel; TComboBox *cbTyp; bool selected; vector<Bedinung> Bedinungen; };Gruppe beinhaltet ja wiederrum ein Vector vom Typ Bedinung:
struct Bedinung { TPanel *Panel; TComboBox *cbSpalte; TComboBox *cbOperator; TEdit *txtString; TLabel *lblTitel; bool selected; };Ich erstelle die ganzen KOmponenten mit new!
Nun muss ich sie ja auch wieder löschen (sonst belegen die doch auf ewig speicher oder)
das geht nur leider nicht wie sonst mit:
delete Gruppen[0].Bedinungen[0].Panel;Das einzigste was "funktioniert" ist:
delete &Gruppen[0].Bedinungen[0].Panel;wird das denn dann auch wirklich gelöscht?
Ich habe das Gefühl als wenn das Panel weiterhin auf dem Form zu sehen ist! oder wird da was nicht neu gezeichnet?
Also die eigentliche Frage: Wird das so 100% gelöscht?
THX
Dagsta
-
Hallo
schreib dir für die beiden structs doch passende Konstruktoren und wichtiger noch Destruktoren. Dann kannst du sicher sein.
bis bald
akari
-
Kann ein Struct einen Destruktoren haben?
Hier nochmal ein Beispiel wie ich das ganze lösche:
for(unsigned int i = 0; i < Form3->Gruppen.size(); i++) { delete Form3->Gruppen[i].lblTitel; //Hier klappt normales Delete delete Form3->Gruppen[i].cbTyp; delete Form3->Gruppen[i].Panel; for(unsigned int x = 0; x < Form3->Gruppen[i].Bedinungen.size(); x++) { delete &Form3->Gruppen[i].Bedinungen[x].cbSpalte; //Hier nicht mehr delete &Form3->Gruppen[i].Bedinungen[x].cbOperator; delete &Form3->Gruppen[i].Bedinungen[x].txtString; delete &Form3->Gruppen[i].Bedinungen[x].lblTitel; delete &Form3->Gruppen[i].Bedinungen[x].Panel; } Form3->Gruppen[i].Bedinungen.clear(); Form3->Gruppen[i].Bedinungen.resize(0); } while(Form3->Gruppen.size() > 0) { Form3->Gruppen.pop_back(); }Hier werden alle gelöscht ist aber nicht immer so!
WIe könnte ich mir den so einen Destruktor (bzw. Konstruktor wäre auch praktisch) basteln ohne das ganze in eine Klasse zu kapseln
THX
Dagsta
-
Du kannst auch einer Struktur Konstruktoren, Destruktoren, Operatoren usw. geben, da in C++ Strukturen intern auch Klassen sind. Der einzige Unterschied ist, dass bei Strukturen alle Membervariablen per default public sind, bei Klassen aber private (wenn du es nicht explizit hinschreibst).
Wenn deine VCL-Komponenten einen Owner (z.Bsp die Application) haben, kannst du das Löschen sogar weglassen, da dann der Owner dafür sorgt.
Das & vor deiner Variable ist beim Löschen nicht nötig.
-
Braunstein schrieb:
Das & vor deiner Variable ist beim Löschen nicht nötig.
Doch ohne lässt es sich nicht kompilieren!
Könnte mir vieleicht jemand mal ein Bsp. geben wie ich einen Konstruktor / de... bei Structuren erstelle?
THX
Dagsta
-
Hallo
Die Syntax ist wie bereits gesagt genauso wie bei Klassen. Den Destruktor könnte man also so erstellen
struct Bedinung { TPanel *Panel; TComboBox *cbSpalte; TComboBox *cbOperator; TEdit *txtString; TLabel *lblTitel; bool selected; ~Bedingung(); }; Bedingung::~Bedingung() { delete Panel; delete cbSpalte; delete cbOperator; delete txtString; delete lblTitel; }Allerdings solltest du dir noch mal deine Struktur anschauen.
Bedingung ist ja unter Gruppen untergeordnet. Ich gehe mal davon aus, das auch die Controls aus Bedingung unter die Controls von Gruppen untergeordnet sind.
Wenn du nicht nur Parent, sondern auch Owner setzt, löscht du bereits mit dem obersten Control (also wahrscheilich das Panel aus Gruppen) automatisch alle untergeordneten Controls. Wenn du dann noch mal manuell löscht, kommt ein Zugriffsfehler. Also uüberleg dir genau, wann du was löschen must und was nicht.bis bald
akari
-
@Dagsta
Welche Fehlermeldungen liefert denn dein Compiler wenn du das & davor weglässt?
@akari
Das die unteren Controls ungültig werden wenn man das obere Panel löscht, stimmt aber nur wenn das Panel auch der Owner ist. Vielleicht sollte uns dagsta auch mal zeigen wie er die Controls erstellt.