<?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[Objekt über Formulare hinweg beibehalten]]></title><description><![CDATA[<p>Eine triviale Frage:</p>
<p>Ich habe eine Klasse mit Header- und Cpp-Datei erstellt.</p>
<p>Im ersten Formular binde ich die Klasse ein, erstelle ein Objekt und fülle es (ne map und multimap aus der STL befinden sich dahinter).<br />
Kann den Inhalt der maps der Klasse in Form1 auch auslesen, erweitern usw.<br />
Soweit so gut.</p>
<p>Im zweiten Formular möchte ich auf das soeben in Form1 gefüllte Objekt zugreifen, es erweitern, kürzen etc. Wenn Form2 geschlossen wird, soll der geänderte Inhalt nicht verloren gehen, sondern in Form1 zur Verfügung stehen.</p>
<p>Beide Formulare sollen sich also das Objekt teilen. M. a. W.: Wie übergebe ich das Objekt nach Form2 so, dass ich es in Form2 bearbeiten kann und der Inhalt auch nach Schließen von Form2 weiter erhalten bleibt? Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/87314/objekt-über-formulare-hinweg-beibehalten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 07:17:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/87314.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Sep 2004 05:47:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 05:47:50 GMT]]></title><description><![CDATA[<p>Eine triviale Frage:</p>
<p>Ich habe eine Klasse mit Header- und Cpp-Datei erstellt.</p>
<p>Im ersten Formular binde ich die Klasse ein, erstelle ein Objekt und fülle es (ne map und multimap aus der STL befinden sich dahinter).<br />
Kann den Inhalt der maps der Klasse in Form1 auch auslesen, erweitern usw.<br />
Soweit so gut.</p>
<p>Im zweiten Formular möchte ich auf das soeben in Form1 gefüllte Objekt zugreifen, es erweitern, kürzen etc. Wenn Form2 geschlossen wird, soll der geänderte Inhalt nicht verloren gehen, sondern in Form1 zur Verfügung stehen.</p>
<p>Beide Formulare sollen sich also das Objekt teilen. M. a. W.: Wie übergebe ich das Objekt nach Form2 so, dass ich es in Form2 bearbeiten kann und der Inhalt auch nach Schließen von Form2 weiter erhalten bleibt? Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/616787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/616787</guid><dc:creator><![CDATA[Ingo]]></dc:creator><pubDate>Wed, 29 Sep 2004 05:47:50 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 05:53:01 GMT]]></title><description><![CDATA[<p>Wenn Du das Objekt mit new erzeugst, kannst Du dessen Zeiger direkt an Form2 übergeben, ansonsten mußt Du eine Referenz auf das Objekt an Form2 übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/616788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/616788</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 29 Sep 2004 05:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 15:05:01 GMT]]></title><description><![CDATA[<p>Problem gelöst. Das Objekt muss in der Headerdatei von Form1 erstellt werden.<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617158</guid><dc:creator><![CDATA[Ingo]]></dc:creator><pubDate>Wed, 29 Sep 2004 15:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 18:37:15 GMT]]></title><description><![CDATA[<p>Ingo schrieb:</p>
<blockquote>
<p>Das Objekt muss in der Headerdatei von Form1 erstellt werden.</p>
</blockquote>
<p>Mach ich nie so. Das kommt mir nicht so vor, als ob das ein guter Programmierstil ist.<br />
Könntest Du mal Deine Problemlösung zeigen?</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617406</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Wed, 29 Sep 2004 18:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 20:00:19 GMT]]></title><description><![CDATA[<p>Gern. Das hier ist der entscheidende Ausschnitt aus der Header-Datei von Unit1.cpp (also Unit1.h):</p>
<pre><code class="language-cpp">class TForm1 : public TForm
{
__published:	// Von der IDE verwaltete Komponenten
	TButton *Button1;
	TButton *Button2;
	TSpeedButton *SpeedButton1;
	TSpeedButton *SpeedButton2;
	TOpenDialog *OpenDialog1;
	TSaveDialog *SaveDialog1;
	void __fastcall Button1Click(TObject *Sender);
	void __fastcall SpeedButton2Click(TObject *Sender);
	void __fastcall SpeedButton1Click(TObject *Sender);
private:	// Anwender-Deklarationen
public:		// Anwender-Deklarationen
	__fastcall TForm1(TComponent* Owner);
	buchfuehrung bf;
};
//---------------------------------------------------------------------------
</code></pre>
<p>Die letzte Zeile ist entscheidend: buchfuehrung bf.<br />
Mit dem Objekt bf kann ich jetzt über alle Units/Formulare hinweg arbeiten, fungiert quasi als globale Variable.<br />
Ist daran was nicht gut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617479</guid><dc:creator><![CDATA[Ingo]]></dc:creator><pubDate>Wed, 29 Sep 2004 20:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Wed, 29 Sep 2004 20:41:34 GMT]]></title><description><![CDATA[<p>Mir fallen dazu mehrere Dinge ein:<br />
1. Zum Thema <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39302" rel="nofollow">globale Variablen</a> möchte ich nur sagen, dass ich derzeit gerade mit mehreren Projekten kämpfe, die nicht von mir begonnen wurden, aber<br />
jetzt von mir weiterentwickelt werden dürfen, in denen massiv globale und öffentliche Variablen eingesetzt werden. Mit der Auswirkung, dass Du an<br />
einer Stelle schraubst und dann hoffst, dass sich die Änderungen auch wirklich nur an dieser Stelle auswirken (was sie so gut wie nie tun). Besser<br />
man gewöhnt sich's erst gar nicht an.</p>
<p>2. Den Variablennamen bf würde ich vermeiden. Ich verwende grundsätzlich sprechende Variablennamen. Außnahmen sind z.B. for-Schleifen-Zähler. Praktisch<br />
in dem Zusammenhang finde ich eigentlich die Borland-Konvention Klassennamen mit einem &quot;T&quot; beginnen zu lassen, die Member-Variable mit einem &quot;F&quot; und<br />
die Eigenschaft dann einfach ohne Prefix. Also z.B.: class TBuchfuehrung, TBuchfuehrung FBuchfuehrung, __property TBuchfuehrung* Buchfuehrung - das<br />
ist aber wohl auch eher Geschmacksache; Hardcore-C++-Programmierer würden hier garantiert eine andere Konvention vorschlagen.</p>
<p>3. Wenn buchfuehrung eine Klasse ist, finde ich es ein wenig ungewöhnlich die Member-Variable nicht als Referenz anzulegen, also</p>
<pre><code class="language-cpp">buchfuehrung* bf;
</code></pre>
<p>Vielleich bin ich da aber auch der einzige.</p>
<p>Nach meinem heutigen Kenntnisstand würde ich das Problem vielleicht so angehen:</p>
<pre><code class="language-cpp">// Header-Datei
class TForm1 : public TForm
{
__published:
  //...
private:
  buchfuehrung* bf;

  buchfuehrung* getBuchfuehrung();
public:
  __fastcall TForm1(TComponent* Owner);
  virtual __fastcall ~TForm1();

  __property buchfuehrung* Buchfuehrung = {read=getBuchfuehrung};
};
</code></pre>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
  bf = 0;
}

__fastcall TForm1::~TForm1()
{
  delete bf;
}

buchfuehrung* TForm1::getBuchfuehrung()
{
  if (!bf)  // Lazy instantiation
    bf = new buchfuehrung();
  return bf;
}
</code></pre>
<p>Wenn Du &quot;lazy instantiation&quot; verwendest, solltest Du (bis auf Kon- und Destruktor) auch innerhalb der Klasse TForm1 immer auf die Eigenschaft<br />
zugreifen und nie auf die private Variable. Stattdessen kann man natürlich auch an einer Stelle, an der klar ist, dass noch kein Zugriff auf bf<br />
erfolgt, die Instanz erzeugen - vielleicht im Konstruktor.</p>
<p>Es gibt sicherlich auch andere Wege, womöglich auch bessere, aber mit dem Ansatz vermeidest Du wenigstens globale Variablen.</p>
<p>Ich hoffe, ich habe jetzt nicht mehr Verwirrung als Klarheit gestiftet. Wenn das für Dich alles nur kalter Kaffee ist, dann ignoriere es einfach.</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617500</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Wed, 29 Sep 2004 20:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Thu, 30 Sep 2004 05:47:32 GMT]]></title><description><![CDATA[<p>Hallo Alexander,</p>
<p>ich kann Deinem Posting nur zustimmen. Nur in Deinem Destruktor hat sich ein kleiner Fehler eingeschlichen. Falls bf niemals verwendet wird kracht es...</p>
<pre><code class="language-cpp">__fastcall TForm1::~TForm1()
{
  if (bf)
    delete bf;
}
</code></pre>
<p>Weiterhin hast Du bf = 0; geschrieben. Das ist vollkommen richtig so. Allerdings hab ich mir angewöhnt bei Zeigerinitialisierungen bf = NULL; zu schreiben. So sieht man direkt, ob es eine Variable, oder ein Zeiger ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617607</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 30 Sep 2004 05:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Thu, 30 Sep 2004 05:56:02 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, ich stell das dann mal um &lt;seufz&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617613</guid><dc:creator><![CDATA[Ingo]]></dc:creator><pubDate>Thu, 30 Sep 2004 05:56:02 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Thu, 30 Sep 2004 07:48:36 GMT]]></title><description><![CDATA[<p>Joe_M. schrieb:</p>
<blockquote>
<p>Falls bf niemals verwendet wird kracht es...</p>
</blockquote>
<p>...nicht.</p>
<pre><code class="language-cpp">delete 0;
</code></pre>
<p>sollte keinen Fehler geben - habe ich mal in einem schlauen Buch gelesen. Aus meiner Erfahrung kann ich sagen, dass es bisher auch<br />
noch nie gekracht hat.</p>
<p>Joe_M. schrieb:</p>
<blockquote>
<p>Allerdings hab ich mir angewöhnt bei Zeigerinitialisierungen bf = NULL; zu schreiben. So sieht man direkt, ob es eine Variable, oder ein Zeiger ist.</p>
</blockquote>
<p>Genau das habe ich mir abgewöhnt. Es gibt ja hier im Forum, in der C++-Abteilung, eine <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39480" rel="nofollow">Abhandlung über NULL und 0</a>, die Du wahrschein-<br />
lich auch schon mal gelesen hast. Letztlich ist es wahrscheinlich Geschmacksache. Ich habe allerdings bei Kollegen gesehen, dass auch int-, bool- und<br />
double-Variablen mit NULL initialisiert wurden, was natürlich geht, aber keine andere Bedeutung hat als mit 0 zu initialisieren. Was ich damit sagen<br />
will, ist, dass vielen gar nicht bewusst ist, dass NULL nicht gleichbedeutend mit &quot;nicht initialisiert&quot; ist. Ich habe oft den Vergleich von bool- oder<br />
int-Werten auf NULL gefunden, mit dem Ziel, zu überprüfen, ob die Variable schon korrekt gesetzt wurde, was natürlich für Probleme gesorgt hat, wenn der<br />
Wert tatsächlich einfach 0 war. Also habe ich mir angewöhnt, NULL nicht mehr zu verwenden. Aber - wie schon gesagt - Geschmacksache...oder Frage der<br />
firmeninternen Konventionen. Bei Java sieht das natürlich anders aus, aber das ist ein anderes Thema...</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/617698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/617698</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Thu, 30 Sep 2004 07:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt über Formulare hinweg beibehalten on Thu, 30 Sep 2004 13:59:40 GMT]]></title><description><![CDATA[<p>hm, ist ja interessant, habe ich gar nicht gewusst. Hab's auch gleich mal ausprobiert, wobei ich auch bei der Initialisierung mit NULL keine Fehlermeldung bekomme...<br />
Allerdings ist auch kein Destruktor in der Testklasse vorhanden (nur deklariert). Ist mir nicht geheuer. <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="😉"
    /> Muss ich bei Gelegenheit mal ausgiebig testen.</p>
<p>Ich werde weiterhin Zeiger mit NULL initialisieren und Variablen mit 0 und auch weiterhin auf einen gültigen Zeiger prüfen, bevor ich Objekte freigebe. Da ich mit C angefangen hab' ist das wohl noch eine Altlast... Ich hatte sowieso Schwierigkeiten von C auf C++ umzusteigen. Alte Gewohnheiten legt man nur schwer ab. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/618045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/618045</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 30 Sep 2004 13:59:40 GMT</pubDate></item></channel></rss>