<?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[Form nur erstellen, wenn es benötigt wird]]></title><description><![CDATA[<p>Habe meinem Projekt ein Formular hinzugefügt. Nun steht in der cpp-Datei &quot;TForm *Form2&quot;. Das heißt mit ausführen des Programms wird auch sofort dieses Formular erstellt (nur das es versteckt ist). Das möchte ich jedoch verhindern, also habe ich &quot;TForm *Form2&quot; rausgenommen, was leider in einem Linker-Fehler resultiert!<br />
Wenn ich &quot;delete Form2&quot; in den Konstruktor des Hauptformulars schreibe, habe ich zwar den gewünschten Effekt, aber das muss doch auch eleganter gehen?!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/116880/form-nur-erstellen-wenn-es-benötigt-wird</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 02:11:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/116880.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Aug 2005 08:00:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Form nur erstellen, wenn es benötigt wird on Mon, 01 Aug 2005 08:00:14 GMT]]></title><description><![CDATA[<p>Habe meinem Projekt ein Formular hinzugefügt. Nun steht in der cpp-Datei &quot;TForm *Form2&quot;. Das heißt mit ausführen des Programms wird auch sofort dieses Formular erstellt (nur das es versteckt ist). Das möchte ich jedoch verhindern, also habe ich &quot;TForm *Form2&quot; rausgenommen, was leider in einem Linker-Fehler resultiert!<br />
Wenn ich &quot;delete Form2&quot; in den Konstruktor des Hauptformulars schreibe, habe ich zwar den gewünschten Effekt, aber das muss doch auch eleganter gehen?!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/843173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/843173</guid><dc:creator><![CDATA[apo]]></dc:creator><pubDate>Mon, 01 Aug 2005 08:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to Form nur erstellen, wenn es benötigt wird on Mon, 01 Aug 2005 08:11:51 GMT]]></title><description><![CDATA[<p>Du mußt die Form nur aus der Liste der automatisch zu erzeugenden Formulare herausnehmen (Projekt-&gt;Optionen-&gt;Reiter Formulare) und es danne erst erzeugen, wenn Du es benötigst.</p>
<p>Das könnte z.B. so aussehen:</p>
<pre><code class="language-cpp">if (!Form2)
	{
		try
		{
			Application-&gt;CreateForm(__classid(TForm2), &amp;Form2);
		}
		catch(...)
		{
			ShowMessage(&quot;Fehler: Form xyz kann nicht erzeugt werden.\nVorgang abgebrochen.&quot;);
			return;
		}
	}
</code></pre>
<p>Dies sollte an einer möglichst zentralen Stelle ausgeführt werden, damit Du das nicht überall einfügen mußt, wo das Formular benötigt wird. Weiterhin ist es sinnvoll im Konstruktor von Form1 (oder eben jene zentrale Stelle) den Wert von Form2 mit NULL zu initialisieren, auch wenn das eigentlich automatisch erfolgen sollte. Ein manuelles Löschen des Formulars ist nicht notwendig, da das Formular von der Application, bei Beendigung, automatisch gelöscht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/843181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/843181</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 01 Aug 2005 08:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Form nur erstellen, wenn es benötigt wird on Mon, 01 Aug 2005 09:02:13 GMT]]></title><description><![CDATA[<p>Ich versteh dein Code nicht.... Ich habe mal ein bisschen gesucht und finde es so eigentlich besser (im OnDblClick-Ereignis):</p>
<pre><code>TForm* Form2= new TForm(this)
</code></pre>
<p>Wenn man statt this Application nimmt, dann kümmert sich das Programm zwar selbst um die Freigabe des Speichers, aber erst sehr spät.<br />
So muss ich mich selbst mit delete um die Freigabe kümmern, aber wie genau??<br />
Ich habe mal ins OnClose-ereignis von Form2 &quot;delete this;&quot; geschrieben, aber das resultiert in einer Zugriffsverletzung!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/843228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/843228</guid><dc:creator><![CDATA[apo]]></dc:creator><pubDate>Mon, 01 Aug 2005 09:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Form nur erstellen, wenn es benötigt wird on Mon, 01 Aug 2005 09:25:22 GMT]]></title><description><![CDATA[<p>Zur Erklärung:</p>
<pre><code class="language-cpp">if (!Form2) // existiert Form2 schon?
	{ // nein
		try
		{
			Application-&gt;CreateForm(__classid(TForm2), &amp;Form2); // eine Instanz von TForm2 wird erzeugt und der Applications-Variable Form2 zugewiesen.
		}
		catch(...)
		{  // Fehler bein Erzeugen des Formulars abfangen
			ShowMessage(&quot;Fehler: Form xyz kann nicht erzeugt werden.\nVorgang abgebrochen.&quot;);
			return;
		}
	}
</code></pre>
<p>Diese Version ist gängig, wenn man aus Performancegründen nicht alle Formulare beim Programmstart erzeugen will, sondern erst dann, wenn sie tatsächlich benötigt werden. Sie bleiben bis zum Programmende erhalten.<br />
Relevant ist eigentlich nur dieser Code:</p>
<pre><code class="language-cpp">if (!Form2)
{
   Application-&gt;CreateForm(__classid(TForm2), &amp;Form2);
}
</code></pre>
<p>Bezüglich deines Lösungsansatzes mit new:<br />
Du solltest nicht den Namen Form2 verwenden.<br />
Was immer Du dort eingibst, zur Zeit this bei der Erzeugung des Formulars steht, ist für die Löschung des Formulars verantwortlich. Wenn Du das nicht willst, kannst Du dort NULL übergeben. Dann bist Du für die Löschung des Formulars verantwortlich. Ein delete sollte sich immer im gleichen Gültigkeitsraum, wie das new befinden.<br />
z.B.:</p>
<pre><code class="language-cpp">TForm2* MyForm2 = new TForm2;
MyForm2-&gt;ShowModal();
delete MyForm2;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/843258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/843258</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 01 Aug 2005 09:25:22 GMT</pubDate></item></channel></rss>