<?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[Frame mit Funktion erweitern und aufrufen]]></title><description><![CDATA[<p>Ich habe in meiner TForm1 eine Variable *<em>TFrame <em>MyFrame;</em></em> hinzugefügt und wenn ich ein Frame auf meienr TForm1 integriere setze ich den Pointer darauf.</p>
<p>So das klappt auch alles super, jetzt habe ich jedoch der TFrame Klasse weitere Funktionen hinzugefügt, aller meiner TFrames die selbe, aber unterschiedlichen Inhalts.</p>
<p>Problem ist nun das diese Funktionen keine Member der Klasse TFrame sind und natürlich ein Aufruf ala MyFrame-&gt;newFunc(); mit Fehler quittiert wird, obwohl Frame1-&gt;newFunc(); sehr wohl existiert.</p>
<p>Anwendungsbeispiel wäre hier das ich eine Anwendung schaffe mit vielen Frames und einer Sprachauswahl und nicht eine switch bzw if-else System schaffen möchte um das aktuelle gewählte Frame die Sprache zu updaten, sondern direkt nur die dafür zuständige Funktion aufrufen möchte.</p>
<p>Puh, kam das irgendwie verständlich durch? Das einfügen in die TForm1 mach ich bereits über ein Template, womit dies allgemein passiert, dort sind aber auch keine nicht TFrame Funktionen von belang.</p>
<p>Ich habe jetzt eine ComboBox welche die Form1-&gt;UpdateSprache() aufruft und in dieser Funktion soll quasi ebenfalls die Funktion UpdateSprache() des aktuell gewählten TFrames aufgerufen werden. Quasi eben MyFrame-&gt;UpdateSprache(); was so ja nun nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202428/frame-mit-funktion-erweitern-und-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 07:07:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202428.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jan 2008 13:24:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 13:24:12 GMT]]></title><description><![CDATA[<p>Ich habe in meiner TForm1 eine Variable *<em>TFrame <em>MyFrame;</em></em> hinzugefügt und wenn ich ein Frame auf meienr TForm1 integriere setze ich den Pointer darauf.</p>
<p>So das klappt auch alles super, jetzt habe ich jedoch der TFrame Klasse weitere Funktionen hinzugefügt, aller meiner TFrames die selbe, aber unterschiedlichen Inhalts.</p>
<p>Problem ist nun das diese Funktionen keine Member der Klasse TFrame sind und natürlich ein Aufruf ala MyFrame-&gt;newFunc(); mit Fehler quittiert wird, obwohl Frame1-&gt;newFunc(); sehr wohl existiert.</p>
<p>Anwendungsbeispiel wäre hier das ich eine Anwendung schaffe mit vielen Frames und einer Sprachauswahl und nicht eine switch bzw if-else System schaffen möchte um das aktuelle gewählte Frame die Sprache zu updaten, sondern direkt nur die dafür zuständige Funktion aufrufen möchte.</p>
<p>Puh, kam das irgendwie verständlich durch? Das einfügen in die TForm1 mach ich bereits über ein Template, womit dies allgemein passiert, dort sind aber auch keine nicht TFrame Funktionen von belang.</p>
<p>Ich habe jetzt eine ComboBox welche die Form1-&gt;UpdateSprache() aufruft und in dieser Funktion soll quasi ebenfalls die Funktion UpdateSprache() des aktuell gewählten TFrames aufgerufen werden. Quasi eben MyFrame-&gt;UpdateSprache(); was so ja nun nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434881</guid><dc:creator><![CDATA[Fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 13:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 13:38:04 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Du hast da erstmal ein Grundsätzliches Problem : kannst du die einzelnen von außen zugänglichen Eigenschaften/Methoden der Frames so verallgemeinen das du eine Basisklasse herausbekommst? Wenn die Frames sich nicht in ein Interface packen lassen hast du keine andere Wahl als entweder den allgemeinen TFrame-Zeiger jedesmal zu casten bzw. für jeden Frame-Typ einen eigenen Zeiger zu definieren von denen aber immer nur einer gültig (d.h. nicht 0) ist.</p>
<p>Wenn du die einzelnen Frames in ein Interface packen kannst must du überlegen wie du das umsetzt. Wenn du nicht auf die Bearbeitung der Frames zur Entwurfszeit mit Objektinspektor angewiesen bist sondern alles mit Quellcode machen kannst könntest du die ganzen Frames manuell im Quellcode definieren. Der Vorteil : Nun kannst du erstmal eine Basisklasse von TFrame ableiten die alle polymorphen Methoden bekommt die von außen her anzusprechen sind. Von dieser Basisklasse leistest du nun jedesmal die konkreten Frames ab. Nun reicht ein Zeiger auf die Basisklasse um alle Frametypen zu verwalten.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434887</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 11 Jan 2008 13:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 14:03:33 GMT]]></title><description><![CDATA[<p>Bin auf den Objektinspektor angewiesen, da die Frames sehr komplex sind. Soll quasi ein Pluginsystem sein. Ich binde Frames in mein Projekt ein und brauch nur eine Zeile Code(neben der include) um diese in das MainMenu aufrufbar einzubinden und nutzbar zu machen. Das ist auch soweit fertig.</p>
<p>Problem ist nun wie richtig erkannt hast der Zugriff auf Funktionen die keine Member der TFrame sind und da es verdammt viele Frames sind (~20) finde ich die Lösung doof alle Frames direkt abzufragen.</p>
<p>*grübel*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434902</guid><dc:creator><![CDATA[Fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 14:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 14:44:32 GMT]]></title><description><![CDATA[<p>Ich habe es mal nach deinem anraten probiert</p>
<pre><code class="language-cpp">#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;Controls.hpp&gt;
#include &lt;StdCtrls.hpp&gt;
#include &lt;Forms.hpp&gt;
//---------------------------------------------------------------------------
class TFrame2 : public TFrame
{
__published:
    TButton *Button1;
private:
public:	
    __fastcall TFrame2(TComponent* Owner);
};
//---------------------------------------------------------------------------
// Fertiges Frame in diese Klasse übergeben und damit in Form1 dann arbeiten
class TMyFrame2 : public TFrame2
{
private:
public:
    void __fastcall myFunc();
};
//---------------------------------------------------------------------------
extern PACKAGE TFrame2 *Frame2;
extern PACKAGE TMyFrame2 *MyFrame2;
//---------------------------------------------------------------------------
#endif
</code></pre>
<pre><code class="language-cpp">TFrame2 *Frame2;
TMyFrame2 *MyFrame2;
//---------------------------------------------------------------------------
__fastcall TFrame2::TFrame2(TComponent* Owner)
    : TFrame(Owner)
{
}
//---------------------------------------------------------------------------
// Hier kann ich ja nun auf alle Funktionen und Komponenten von Frame2 zugreifen
void __fastcall TMyFrame2::myFunc()
{
// Button1 ist ursprünglich aus TFrame2
    Button1-&gt;Caption = &quot;Test&quot;;
}
</code></pre>
<pre><code class="language-cpp">TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMyFrame2* Modul = new TMyFrame2(this);  // FEHLERZEILE
}
</code></pre>
<p>Leider mit diesem Ergebnis</p>
<blockquote>
<p>E2125 Compiler konnte Standardkonstruktor nicht für die Klasse 'TMyFrame2' generieren.</p>
</blockquote>
<p>Versteh ich leider nicht. <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/1434926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434926</guid><dc:creator><![CDATA[fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 14:44:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 14:51:31 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Die Fehlermeldung ist doch eindeutig : Bei TMyFrame2 fehlt ein Konstruktor. Du brauchst wie bei TFrame2 einen mit dem Owner-Parameter.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434930</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 11 Jan 2008 14:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 15:17:36 GMT]]></title><description><![CDATA[<p>Autsch! Ja klar und es funktioniert nun auch. Ich kann das Frame einfügen und auf die selbstdefinierte Funktion zugreifen. leider funktioniert dies nur mit einem(eins) Frame im Projekt.</p>
<p>Ich habe die TFrame1, TFrame2, TFrame3... und benutze diese dann in TMyFrame1, TMyFrame2, TMyFrame3... und habe somit keine einheitliche Basisklasse und kann mit MyFrame nicht darauf allgemein zugreifen. Dumm gelaufen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1434947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434947</guid><dc:creator><![CDATA[Fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 15:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 15:21:40 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Du must die Basisklasse die im Beispiel TFrame2 heißt ja auch in eine eigene Unit auslagern (Include-Guards nicht vergessen), und diese Unit von allen Frame-Headern aus einbinden. Dann kannst du alle Frames von der selben Basisklasse ableiten.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434950</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 11 Jan 2008 15:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 15:46:40 GMT]]></title><description><![CDATA[<p>Ich denke nicht das dies klappt. Ich setze ja zur Entwicklungszeit die Komponenten und fülle diese mit Leben für jedes Frame. Da kann man leider nichts verallgemeinern, bzw ich missverstehe was du meinst.</p>
<p>Ich glaube aber die Lösung geht wesentlich einfacher. Das Problem ist ja in meiner Header von TForm1 worauf ich auf die Frames zgreifen möchte das &quot;TFrame *MyFrame&quot;.</p>
<p>wenn ich das jetzt stattdessen auf &quot;void *MyFrame&quot; setze, müsste ich dieses void doch mit jedem Frame füllen können. Das war mal so mein Gedanke.</p>
<p>So binde ich mein Frame ein</p>
<pre><code class="language-cpp">InsertFrame&lt;TFrame1&gt;();

template&lt;typename T&gt; void __fastcall TForm1::InsertFrame()
{
    if (MyFrame!=NULL) delete MyFrame;

    T* Modul = new T(this);
    Modul-&gt;Parent = this;
    Modul-&gt;Left = 0;
    Modul-&gt;Top = 0;
    MyFrame = Modul; // definiert als void *MyFrame
}
</code></pre>
<p>funktioniert auch mit void*. yatta! Aber wenn ich jetzt &quot;MyFrame-&gt;myFunc();&quot; aufrufe, erhalte ich</p>
<blockquote>
<p>E2294 Auf linker Seite der Struktur ist . oder .* erforderlich.</p>
</blockquote>
<p>bzw</p>
<blockquote>
<p>E2288 Zeiger auf Struktur auf linker Seite von -&gt; oder von -&gt;* erforderlich</p>
</blockquote>
<p>Irgendwas fehlt mir oder es ist ein Holzweg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434967</guid><dc:creator><![CDATA[Fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 15:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 15:58:25 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Fabi4n schrieb:</p>
<blockquote>
<p>Ich denke nicht das dies klappt. Ich setze ja zur Entwicklungszeit die Komponenten und fülle diese mit Leben für jedes Frame. Da kann man leider nichts verallgemeinern, bzw ich missverstehe was du meinst.</p>
</blockquote>
<p>Ich weiß nicht ob das Ändern der Basisklasse bei generierten Frames funktioniert, so etwas habe ich noch nicht gebraucht. Ein Versuch wärs auf jedenfalls Wert.<br />
Ansonsten must du das Interface noch zwischen Frame und Form schalten, siehe Adapter-Pattern.</p>
<blockquote>
<p>Ich glaube aber die Lösung geht wesentlich einfacher. Das Problem ist ja in meiner Header von TForm1 worauf ich auf die Frames zgreifen möchte das &quot;TFrame *MyFrame&quot;.</p>
<p>wenn ich das jetzt stattdessen auf &quot;void <em>MyFrame&quot; setze, müsste ich dieses void doch mit jedem Frame füllen können. Das war mal so mein Gedanke.<br />
...<br />
funktioniert auch mit void</em>. yatta! Aber wenn ich jetzt &quot;MyFrame-&gt;myFunc();&quot; aufrufe, erhalte ich</p>
<blockquote>
<p>E2294 Auf linker Seite der Struktur ist . oder .* erforderlich.</p>
</blockquote>
<p>bzw</p>
<blockquote>
<p>E2288 Zeiger auf Struktur auf linker Seite von -&gt; oder von -&gt;* erforderlich</p>
</blockquote>
<p>Irgendwas fehlt mir oder es ist ein Holzweg.</p>
</blockquote>
<p>Ja das wird nichts. void* ist ein vollkommen Typloser Zeiger. Du kannst zwar alles reinstecken aber weist dann nicht mehr was drin ist. Damit must du wieder manuell casten und wieder beim Ausgangsproblem.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434971</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 11 Jan 2008 15:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frame mit Funktion erweitern und aufrufen on Fri, 11 Jan 2008 16:11:21 GMT]]></title><description><![CDATA[<p>Habs hinbekommen. Vielen Dank für deine großartige Hilfe!!!<br />
Habe von TFrame eine leere Klasse erstellt mit der gemeinsamen Funktion und diese als Basisklasse dann für die Komponente geändert. Habs mit zwei Frames getestet und läuft. Danke nochmal! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434979</guid><dc:creator><![CDATA[Fabi4n]]></dc:creator><pubDate>Fri, 11 Jan 2008 16:11:21 GMT</pubDate></item></channel></rss>