Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten
-
Ich erzeuge ein paar Buttons in einem Array bei einem OnPaintEvent eines Forms,
wo lösche ich die Buttons wieder wenn ich das Program beende?
Es stürzt beim Beenden nämlich immer ab. Lösche ich vorher die Buttons (Ereigniss OnDestroy) passiert das selbe.Lösche ich sie zur Laufzeit dann stürzt nichts ab.
Wo muss ich die Buttons vorher löschen?
void __fastcall THauptfenster::FormPaint(TObject *Sender) { for (int i=0; i<5; i++) { b[i] = new TButton(this); b[i]->Parent = this; // Koordinaten, Caption,... b[i]->Show(); } } void __fastcall THauptfenster::FormDestroy(TObject *Sender) { for(int i=0; i<5; i++) delete b[i]; } //---------------------------------------------------------------------------b ist der Klassendeklaration so definiert:
public: TButton *b[4];
-
schau dir mal
onClose
btw.
FormCloseQuery
an, da kannste nach belieben "noch" zur laufzeit objekte deinitialisieren/löschen ohne das probleme auftreten sollten
halt moment .... so wie du es deklariert hast, hast du ein 4er array dein counter geht aber bist 5! index wird von 0-3 gerechnet !!!
[EDIT^2]verwende doch einen vector
-
Ceos schrieb:
schau dir mal
onClose
FormCloseQueryHabe ich schon probiert, selber Effekt.
halt moment .... so wie du es deklariert hast, hast du ein 4er array dein counter geht aber bist 5! index wird von 0-3 gerechnet !!!
Ja stimmt aber das war nur ein angepasstes Bsp. fürs Forum, im Original stimmen die Bereiche, sonst würde es beim manuellen Löschen während der Laufzeit ohne Programmbeendigung auch abstürzen.
[EDIT^2]verwende doch einen vector[/quote]
In meinem Bsp. ist es ein zweidim. Feld für Buttons. da geht ein Vector schlecht.Mein gepostetes Bsp habe alles stark vereinfacht damit man sich aufs Wesentliche bei der Fehlersuche konzentrieren kann.
Bei OnHide funktioniert z.B. mein Code, der das Buttonarray wieder löscht, nur beim Beenden des Programes nicht.
Vielleicht hilft das weiter:
Der Debugger endet in forms.hpp in der Zeile:
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
-
Hallo
- OnDestroy und OnCreate nicht benutzen, wenn dann Destruktor und Konstruktor
- Da du beim Erstellen der Buttons das Form als this übergibst, brauchst du die Buttons beim Schließen gar nicht zu löschen, das macht das Form automatisch.
- OnPaint ist nicht dazu da um Controls zu erstellen (könnte sogar in Endlosschleifen enden), sondern sollte nur für minimalste Berechnungen und die eigentliche Grafikausgabe benutzt werden. Mit hoher Sicherheit ist dein Konzept falsch und du brauchst etwas anders als den Paint-Event.bis bald
akari
-
Irgendwie scheint mein Projekt verhunzt zu sein, ich habe gerade nochmal
ein neues Miniprojekt aufgemacht, Code per Copy & Paste übertragen, funktioniert jetzt alles im Ctor/Destruktor, im alten Projekt seltsamerweise nicht.
-
akari schrieb:
- OnDestroy und OnCreate nicht benutzen, wenn dann Destruktor und Konstruktor.
- Da du beim Erstellen der Buttons das Form als this übergibst, brauchst du die Buttons beim Schließen gar nicht zu löschen, das macht das Form automatisch.Also statt in OnCreate lieber in Konstruktor der TForm?
__fastcall TForm5::TForm5(TComponent* Owner) : TForm(Owner) { }Ich wüsste jetzt gern auch warum das so ist, was ist falsch daran es in OnCreate zu machen. Ich dachte genau dafür ist dieses Ereignis gedacht. In der Hilfe ist einBeispiel wo auch mit new Komponenten erstellt werden.
In Hilfe steht auch:
Alle in der Ereignisbehandlungsroutine für OnCreate erzeugten Objekte sollten mit OnDestroy wieder freigegeben werden.
Ok ich muss zugeben ich nutzt dafür bisher immer nur OnClose. Ist das auch falsch? Ich bin jetzt aber leicht verunsichert, möchte ja gern es richtig machen, aber was ist denn jetzt der richtige Weg?

Um neu anlegen mit this hät ich auch ne Frage. Ich kann also soviele Komponenten wie ich möchte mit new erzeugen (auch als array) und muss mir um das saubere entfernen keine Gedanken machen, weil ich this benutzt habe?! Das ja cool, wusste ich noch nicht.
Ich muss wohl dann auch kein delete setzen wenn ich anstatt des this eine Elternkomponente einsetze wie "TabSheet1"?
Also delete muss nur wenn Konstruktor void ist? (Wenn ich das jetzt richtig ausgedrückt habe)this ist quasi die Klasse in der ich das new mache. Meist also die TForm selbst.

Wäre nett wenn das wer aufklärt

-
Hallo
Schnurri schrieb:
Ich wüsste jetzt gern auch warum das so ist, was ist falsch daran es in OnCreate zu machen. Ich dachte genau dafür ist dieses Ereignis gedacht. In der Hilfe ist einBeispiel wo auch mit new Komponenten erstellt werden.
Zum einen sind Konstruktor und Destruktor feste Sprachmittel von C++. Während OnCreate und OnDestroy VCL-Erweiterungen sind. Deren Reigenfolge der Abarbeitung nicht so sicher ist wie bei ersteren. Es gab mal einen Link wo das genau erklärt wurde, aber der ist offenbar nicht mehr brauchbar.
Um neu anlegen mit this hät ich auch ne Frage. Ich kann also soviele Komponenten wie ich möchte mit new erzeugen (auch als array) und muss mir um das saubere entfernen keine Gedanken machen, weil ich this benutzt habe?! Das ja cool, wusste ich noch nicht.
Korrekt.
Ich muss wohl dann auch kein delete setzen wenn ich anstatt des this eine Elternkomponente einsetze wie "TabSheet1"?
Korrekt.
Also delete muss nur wenn Konstruktor void ist? (Wenn ich das jetzt richtig ausgedrückt habe)
Nein du meinst NULL oder 0. void kannst du nicht übergeben. Und der Konstruktor wird auch nicht NULL gesetzt, sondern der Konstruktor wird aufgerufen, nur der Parameter namens "Owner" bekommt einen Wert... zum Beispiel NULL oder this.
this ist quasi die Klasse in der ich das new mache. Meist also die TForm selbst.

Nein this ist nicht die Klasse sondern die Instanz der Klasse für die die Methode aufgerufen wird, in der du this verwendest.
Ich empfehle ein Tutorial zum Thema Grundlagen der OOP in C++ durchzulesen.
bis bald
akari