<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten]]></title><description><![CDATA[<p>Ich erzeuge ein paar Buttons in einem Array bei einem OnPaintEvent eines Forms,<br />
wo lösche ich die Buttons wieder wenn ich das Program beende?<br />
Es stürzt beim Beenden nämlich immer ab. Lösche ich vorher die Buttons (Ereigniss OnDestroy) passiert das selbe.</p>
<p>Lösche ich sie zur Laufzeit dann stürzt nichts ab.</p>
<p>Wo muss ich die Buttons vorher löschen?</p>
<pre><code class="language-cpp">void __fastcall THauptfenster::FormPaint(TObject *Sender)
{
   for (int i=0; i&lt;5; i++)
   {
        b[i] = new TButton(this);
        b[i]-&gt;Parent = this;
        // Koordinaten, Caption,...     
        b[i]-&gt;Show();
   }
}

void __fastcall THauptfenster::FormDestroy(TObject *Sender)
{
     for(int i=0; i&lt;5; i++)
        delete b[i];
}
//---------------------------------------------------------------------------
</code></pre>
<p>b ist der Klassendeklaration so definiert:<br />
public: TButton *b[4];</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176670/absturz-beim-beenden-des-programmes-wegen-dyn-erzeugter-komponenten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 16:18:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176670.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Mar 2007 14:34:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Fri, 23 Mar 2007 14:34:42 GMT]]></title><description><![CDATA[<p>Ich erzeuge ein paar Buttons in einem Array bei einem OnPaintEvent eines Forms,<br />
wo lösche ich die Buttons wieder wenn ich das Program beende?<br />
Es stürzt beim Beenden nämlich immer ab. Lösche ich vorher die Buttons (Ereigniss OnDestroy) passiert das selbe.</p>
<p>Lösche ich sie zur Laufzeit dann stürzt nichts ab.</p>
<p>Wo muss ich die Buttons vorher löschen?</p>
<pre><code class="language-cpp">void __fastcall THauptfenster::FormPaint(TObject *Sender)
{
   for (int i=0; i&lt;5; i++)
   {
        b[i] = new TButton(this);
        b[i]-&gt;Parent = this;
        // Koordinaten, Caption,...     
        b[i]-&gt;Show();
   }
}

void __fastcall THauptfenster::FormDestroy(TObject *Sender)
{
     for(int i=0; i&lt;5; i++)
        delete b[i];
}
//---------------------------------------------------------------------------
</code></pre>
<p>b ist der Klassendeklaration so definiert:<br />
public: TButton *b[4];</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251187</guid><dc:creator><![CDATA[CPPWiedereinsteiger]]></dc:creator><pubDate>Fri, 23 Mar 2007 14:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Fri, 23 Mar 2007 14:52:22 GMT]]></title><description><![CDATA[<p>schau dir mal</p>
<p>onClose</p>
<p>btw.</p>
<p>FormCloseQuery</p>
<p>an, da kannste nach belieben &quot;noch&quot; zur laufzeit objekte deinitialisieren/löschen ohne das probleme auftreten sollten</p>
<p>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 !!!</p>
<p>[EDIT^2]verwende doch einen vector</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251199</guid><dc:creator><![CDATA[Ceos]]></dc:creator><pubDate>Fri, 23 Mar 2007 14:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Fri, 23 Mar 2007 15:08:39 GMT]]></title><description><![CDATA[<p>Ceos schrieb:</p>
<blockquote>
<p>schau dir mal<br />
onClose<br />
FormCloseQuery</p>
</blockquote>
<p>Habe ich schon probiert, selber Effekt.</p>
<blockquote>
<p>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 !!!</p>
</blockquote>
<p>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.</p>
<p>[EDIT^2]verwende doch einen vector[/quote]<br />
In meinem Bsp. ist es ein zweidim. Feld für Buttons. da geht ein Vector schlecht.</p>
<p>Mein gepostetes Bsp habe alles stark vereinfacht damit man sich aufs Wesentliche bei der Fehlersuche konzentrieren kann.</p>
<p>Bei OnHide funktioniert z.B. mein Code, der das Buttonarray wieder löscht, nur beim Beenden des Programes nicht.</p>
<p>Vielleicht hilft das weiter:<br />
Der Debugger endet in forms.hpp in der Zeile:<br />
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251208</guid><dc:creator><![CDATA[CPPWiedereinsteiger]]></dc:creator><pubDate>Fri, 23 Mar 2007 15:08:39 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Fri, 23 Mar 2007 16:21:51 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>- OnDestroy und OnCreate nicht benutzen, wenn dann Destruktor und Konstruktor<br />
- 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.<br />
- 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.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251250</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 23 Mar 2007 16:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Fri, 23 Mar 2007 16:32:01 GMT]]></title><description><![CDATA[<p>Irgendwie scheint mein Projekt verhunzt zu sein, ich habe gerade nochmal<br />
ein neues Miniprojekt aufgemacht, Code per Copy &amp; Paste übertragen, funktioniert jetzt alles im Ctor/Destruktor, im alten Projekt seltsamerweise nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1251255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1251255</guid><dc:creator><![CDATA[CPPWiedereinsteiger]]></dc:creator><pubDate>Fri, 23 Mar 2007 16:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Tue, 08 May 2007 10:01:32 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>- OnDestroy und OnCreate nicht benutzen, wenn dann Destruktor und Konstruktor.<br />
- 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.</p>
</blockquote>
<p>Also statt in OnCreate lieber in Konstruktor der TForm?</p>
<pre><code class="language-cpp">__fastcall TForm5::TForm5(TComponent* Owner)
 : TForm(Owner) 
{
}
</code></pre>
<p>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.</p>
<p>In Hilfe steht auch:</p>
<blockquote>
<p>Alle in der Ereignisbehandlungsroutine für OnCreate erzeugten Objekte sollten mit OnDestroy wieder freigegeben werden.</p>
</blockquote>
<p>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? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Um neu anlegen mit <strong>this</strong> 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 <strong>this</strong> benutzt habe?! Das ja cool, wusste ich noch nicht.</p>
<p>Ich muss wohl dann auch kein delete setzen wenn ich anstatt des this eine Elternkomponente einsetze wie &quot;TabSheet1&quot;?<br />
Also delete muss nur wenn Konstruktor void ist? (Wenn ich das jetzt richtig ausgedrückt habe)</p>
<p><strong>this</strong> ist quasi die Klasse in der ich das <strong>new</strong> mache. Meist also die TForm selbst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Wäre nett wenn das wer aufklärt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280750</guid><dc:creator><![CDATA[Schnurri]]></dc:creator><pubDate>Tue, 08 May 2007 10:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim beenden des Programmes, wegen dyn. erzeugter Komponenten on Tue, 08 May 2007 10:30:51 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Schnurri schrieb:</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>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.</p>
<blockquote>
<p>Um neu anlegen mit <strong>this</strong> 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 <strong>this</strong> benutzt habe?! Das ja cool, wusste ich noch nicht.</p>
</blockquote>
<p>Korrekt.</p>
<blockquote>
<p>Ich muss wohl dann auch kein delete setzen wenn ich anstatt des this eine Elternkomponente einsetze wie &quot;TabSheet1&quot;?</p>
</blockquote>
<p>Korrekt.</p>
<blockquote>
<p>Also delete muss nur wenn Konstruktor void ist? (Wenn ich das jetzt richtig ausgedrückt habe)</p>
</blockquote>
<p>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 &quot;Owner&quot; bekommt einen Wert... zum Beispiel NULL oder this.</p>
<blockquote>
<p><strong>this</strong> ist quasi die Klasse in der ich das <strong>new</strong> mache. Meist also die TForm selbst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Nein this ist nicht die Klasse sondern die Instanz der Klasse für die die Methode aufgerufen wird, in der du this verwendest.</p>
<p>Ich empfehle ein Tutorial zum Thema Grundlagen der OOP in C++ durchzulesen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280770</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 08 May 2007 10:30:51 GMT</pubDate></item></channel></rss>