<?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[Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren]]></title><description><![CDATA[<p>Hallo @all,</p>
<p>ich habe anscheinend einen Denkfehler, wie man mit verschiedenen Dialogen zur Laufzeit arbeitet und wie man diese wieder vollständig aus dem Speicher entfernt. Hier mal mein Konstrukt:</p>
<p>Ich habe ein Hauptprogramm in der ein Platzhalter (normales Static-Control) für verschiedene Unterdialoge / Klassen herhalten soll.</p>
<p>Im Header des Hauptprogramms habe ich die Zugriffe auf die folgenden Klassen unter</p>
<pre><code class="language-cpp">protected:
</code></pre>
<p>definiert:</p>
<pre><code class="language-cpp">CKlasse01Dialog Dlg01;
CKlasse02Dialog Dlg02;
CKlasse03Dialog Dlg03;
</code></pre>
<p>Das forciert ja, dass der Konstruktor aufgerufen wird.</p>
<p>Wenn man nun im Hauptprogramm auf die jeweiligen Buttons klickt, wird die folgende Funktion aufgerufen um den jeweiligen Unterdialog anzuzeigen:</p>
<pre><code class="language-cpp">/////////////////////////////////////////////////////////////////////////////
// Zeigt den entsprechenden Dialog an und versteckt den derzeit aktiven Dialog
void CHauptklasseDlg::DialogAnzeigen(int Nr)
{
	CRect Rechteck;
	GetDlgItem(IDC_SHEET)-&gt;GetWindowRect(Rechteck); 
	ScreenToClient(&amp;Rechteck);

	// Den derzeit aktiven Dialog verstecken
	if ( AktuellerDialog == 1 &amp;&amp; Nr != 1 ) {
		Dlg01.DestroyWindow();
	}
	else if ( AktuellerDialog == 2 &amp;&amp; Nr != 2 ) {
		Dlg02.DestroyWindow();
	}
	else if ( AktuellerDialog == 3 &amp;&amp; Nr != 3 ) {
		Dlg03.DestroyWindow();
	}

	// Den entsprechenden Dialog anzeigen
	if ( Nr == 1 &amp;&amp; AktuellerDialog != 1 ) {	
		Dlg01.Create(CKlasse01Dialog::IDD, this);
		Dlg01.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 1;
	}
	else if ( Nr == 2 &amp;&amp; AktuellerDialog != 2 ) {
		Dlg02.Create(CKlasse02Dialog::IDD, this);
		Dlg02.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 2;
	}
	else if ( Nr == 3 &amp;&amp; AktuellerDialog != 3 ) {	
		Dlg02.Create(CKlasse03Dialog::IDD, this);
		Dlg02.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 3;
	}
}
</code></pre>
<p>Nun sind mir dabei aber die folgenden Phänomene aufgefallen:</p>
<p>Wenn man bestimmte Variablen die in einer untergeordneten Klasse auf neue Werte gesetzt wurden beim erneuten Aufruf anspricht, beinhalten diese den zuvor gesetzten Wert. Das heißt, das DestroyWindow scheint nicht zu funktionieren, obwohl es aufgerufen wird!</p>
<p>Wenn ich mein Programm beende (mit ::PostQuitMessage(0); exit(0) etc.), kommt es mitunter vor, dass es abstürzt.</p>
<p>Wie geht man richtig vor? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180210/dialoge-erzeugen-und-zur-laufzeit-wieder-ordentlich-den-speicher-leeren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 10:02:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180210.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Apr 2007 07:34:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren on Mon, 30 Apr 2007 07:34:54 GMT]]></title><description><![CDATA[<p>Hallo @all,</p>
<p>ich habe anscheinend einen Denkfehler, wie man mit verschiedenen Dialogen zur Laufzeit arbeitet und wie man diese wieder vollständig aus dem Speicher entfernt. Hier mal mein Konstrukt:</p>
<p>Ich habe ein Hauptprogramm in der ein Platzhalter (normales Static-Control) für verschiedene Unterdialoge / Klassen herhalten soll.</p>
<p>Im Header des Hauptprogramms habe ich die Zugriffe auf die folgenden Klassen unter</p>
<pre><code class="language-cpp">protected:
</code></pre>
<p>definiert:</p>
<pre><code class="language-cpp">CKlasse01Dialog Dlg01;
CKlasse02Dialog Dlg02;
CKlasse03Dialog Dlg03;
</code></pre>
<p>Das forciert ja, dass der Konstruktor aufgerufen wird.</p>
<p>Wenn man nun im Hauptprogramm auf die jeweiligen Buttons klickt, wird die folgende Funktion aufgerufen um den jeweiligen Unterdialog anzuzeigen:</p>
<pre><code class="language-cpp">/////////////////////////////////////////////////////////////////////////////
// Zeigt den entsprechenden Dialog an und versteckt den derzeit aktiven Dialog
void CHauptklasseDlg::DialogAnzeigen(int Nr)
{
	CRect Rechteck;
	GetDlgItem(IDC_SHEET)-&gt;GetWindowRect(Rechteck); 
	ScreenToClient(&amp;Rechteck);

	// Den derzeit aktiven Dialog verstecken
	if ( AktuellerDialog == 1 &amp;&amp; Nr != 1 ) {
		Dlg01.DestroyWindow();
	}
	else if ( AktuellerDialog == 2 &amp;&amp; Nr != 2 ) {
		Dlg02.DestroyWindow();
	}
	else if ( AktuellerDialog == 3 &amp;&amp; Nr != 3 ) {
		Dlg03.DestroyWindow();
	}

	// Den entsprechenden Dialog anzeigen
	if ( Nr == 1 &amp;&amp; AktuellerDialog != 1 ) {	
		Dlg01.Create(CKlasse01Dialog::IDD, this);
		Dlg01.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 1;
	}
	else if ( Nr == 2 &amp;&amp; AktuellerDialog != 2 ) {
		Dlg02.Create(CKlasse02Dialog::IDD, this);
		Dlg02.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 2;
	}
	else if ( Nr == 3 &amp;&amp; AktuellerDialog != 3 ) {	
		Dlg02.Create(CKlasse03Dialog::IDD, this);
		Dlg02.SetWindowPos(NULL, Rechteck.left, Rechteck.top, Rechteck.Width(), Rechteck.Height(), SWP_SHOWWINDOW);
		AktuellerDialog = 3;
	}
}
</code></pre>
<p>Nun sind mir dabei aber die folgenden Phänomene aufgefallen:</p>
<p>Wenn man bestimmte Variablen die in einer untergeordneten Klasse auf neue Werte gesetzt wurden beim erneuten Aufruf anspricht, beinhalten diese den zuvor gesetzten Wert. Das heißt, das DestroyWindow scheint nicht zu funktionieren, obwohl es aufgerufen wird!</p>
<p>Wenn ich mein Programm beende (mit ::PostQuitMessage(0); exit(0) etc.), kommt es mitunter vor, dass es abstürzt.</p>
<p>Wie geht man richtig vor? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276055</guid><dc:creator><![CDATA[Dressman1981]]></dc:creator><pubDate>Mon, 30 Apr 2007 07:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren on Mon, 30 Apr 2007 07:47:55 GMT]]></title><description><![CDATA[<p>Erstmal: DestroyWindow() zerstört nur das angezeigte Dialogfenster, aber nicht das dahinterliegende Objekt - das wird erst vom DTor vernichtet, wenn dein Programm beendet wird.</p>
<p>Zweitens: Ich weiß zwar nicht, was genau du vorhast, aber schau dir mal CPropertySheet an <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/1276063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276063</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Apr 2007 07:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren on Mon, 30 Apr 2007 07:56:19 GMT]]></title><description><![CDATA[<p>Hi CStoll,</p>
<p>danke für die schnelle Reaktion!</p>
<p>Mit PropertyPages hab ich es zunächst versucht, dann schien mir dieses Konstrukt aber einfacher umzusetzen, zumal ich die dahinterliegenden Dialoge wieder in den &quot;Urzustand&quot; befördern möchte.<br />
Gibt es keine Möglichkeit das dahinterliegende Objekt, wie du so schön schreibst, vorher komplett zu zerstören?</p>
<p>Hat man eine andere Möglichkeit, ohne mit den PropertyPages arbeiten zu müssen, um weiter mein Konstrukt nutzen zu können ohne irgendwelche Fehler zu produzieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276069</guid><dc:creator><![CDATA[Dressman1981]]></dc:creator><pubDate>Mon, 30 Apr 2007 07:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren on Mon, 30 Apr 2007 08:01:24 GMT]]></title><description><![CDATA[<p>Du könntest Zeiger verwenden, die du bei jedem Wechsel des Dialogs wieder freigibst (wenn alle verwendeten Dialoge von der selben Basisklasse abgeleitet sind, reicht da sogar einer aus). Oder (ist vermutlich besser) du setzt alle relevanten Membervariablen des Fensters manuell auf ihren Startwert zurück, wenn er reinkarniert werden soll (die OnInitDialog()-Methode dürfte dafür geeignet sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276075</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Apr 2007 08:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to Dialoge erzeugen und zur Laufzeit wieder ordentlich den Speicher leeren on Mon, 30 Apr 2007 08:21:12 GMT]]></title><description><![CDATA[<p>Hmm...das mit den Membervariablen in der OnInit-Section bzw. eine spezielle Funktion zum Leeren der Variablen hab ich bereits proaktiv gemacht. <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>
<p>Mal ganz grundsätzlich, kann ich mein Konstrukt in der Form beibehalten, sprich mit dem Create und Destroy zur Laufzeit, ohne dass es mal zu Speicherüberläufen oder Ähnlichen kommt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276092</guid><dc:creator><![CDATA[Dressman1981]]></dc:creator><pubDate>Mon, 30 Apr 2007 08:21:12 GMT</pubDate></item></channel></rss>