<?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[Multicast-Closures?]]></title><description><![CDATA[<p>In Delphi für Win32 und C++Builder können Closures ja bekanntlich nur auf eine Eventfunktion verweisen. Dennoch sind Multicast-Events zuweilen recht praktisch. Daher bastle ich gerade an einer Implementation für solche. Sie lassen sich allerdings nicht über den Designer, sondern nur zur Laufzeit zuweisen - das Persistenzsystem der VCL kommt nur mit gewöhnlichen Events zurecht.</p>
<p>In der Benutzung sähe es dann ungefähr so aus:</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
      // void createMulticastEvent (EventT e);
    createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);

      // MulticastEvent&amp; asMulticast (EventT e);
    asMulticast &lt;void, TObject*&gt; (Button1-&gt;OnClick).addEvent (this-&gt;Button1Click);
    asMulticast &lt;void, TObject*&gt; (Button1-&gt;OnClick).addEvent (this-&gt;Button1Click2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
      // void destroyMulticastEvent (EventT e);
    destroyMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    MessageBox (Handle, __FUNC__, NULL, 0);
}
void __fastcall TForm1::Button1Click2(TObject *Sender)
{
    MessageBox (Handle, __FUNC__, NULL, 0);
}
</code></pre>
<p>Besteht an so etwas Interesse?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184762/multicast-closures</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 11:58:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184762.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jun 2007 23:56:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multicast-Closures? on Mon, 18 Jun 2007 23:56:39 GMT]]></title><description><![CDATA[<p>In Delphi für Win32 und C++Builder können Closures ja bekanntlich nur auf eine Eventfunktion verweisen. Dennoch sind Multicast-Events zuweilen recht praktisch. Daher bastle ich gerade an einer Implementation für solche. Sie lassen sich allerdings nicht über den Designer, sondern nur zur Laufzeit zuweisen - das Persistenzsystem der VCL kommt nur mit gewöhnlichen Events zurecht.</p>
<p>In der Benutzung sähe es dann ungefähr so aus:</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
      // void createMulticastEvent (EventT e);
    createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);

      // MulticastEvent&amp; asMulticast (EventT e);
    asMulticast &lt;void, TObject*&gt; (Button1-&gt;OnClick).addEvent (this-&gt;Button1Click);
    asMulticast &lt;void, TObject*&gt; (Button1-&gt;OnClick).addEvent (this-&gt;Button1Click2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
      // void destroyMulticastEvent (EventT e);
    destroyMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    MessageBox (Handle, __FUNC__, NULL, 0);
}
void __fastcall TForm1::Button1Click2(TObject *Sender)
{
    MessageBox (Handle, __FUNC__, NULL, 0);
}
</code></pre>
<p>Besteht an so etwas Interesse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308752</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 18 Jun 2007 23:56:39 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 07:34:00 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ist auf jedenfall eine sinnvolle Erweiterung. Noch nicht so schön ist natürlich das solche MulticastEvents manuell gelöscht werden müßen. Vielleicht könnte man da noch etwas automatisieren? Vielleicht mit einem versteckten Singleton, wo sich die Paare Control/Multicast-Objekt registrieren. Jetzt müßte man nur noch erreichen das das Löschen eines Controls das Singleton benachrichtigt...</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308835</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 19 Jun 2007 07:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 09:00:16 GMT]]></title><description><![CDATA[<p>Finde ich auch eine sinnvolle Erweiterung, aber zwei Anmerkungen noch:</p>
<p>Das Destroy sollte man dann aber im passenden Destruktor der Klasse machen, da du ja das Anlegen der multicasts im Konstruktor der Klasse (nicht in FormCreate) gemacht hast. Außerdem bin ich ebenso wie Akari der Meinung, das Destroyen zu automatisieren.</p>
<p>Die Syntax finde ich noch nicht so elegant (auch wenn man dann wahrscheinlich für die verschiedenen Event-Typen typedefs anlegen kann).</p>
<p>Besser fände ich es wenn man entweder</p>
<pre><code class="language-cpp">T x = createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);
x.addEvent (this-&gt;Button1Click);
x.addEvent (this-&gt;Button2Click);
</code></pre>
<p>wobei T dann ein passender Typ sein müßte, oder aber noch besser<br />
Streaming verwenden könnte, d.h.</p>
<pre><code class="language-cpp">createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick)
.addEvent (this-&gt;Button1Click)
.addEvent (this-&gt;Button2Click);

// oder
createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick)
&lt;&lt; this-&gt;Button1Click &lt;&lt; this-&gt;Button2Click;
</code></pre>
<p>Analog dann das Removen von Events mittels 'removeEvent' bzw. '&gt;&gt;'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308900</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 19 Jun 2007 09:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 09:06:26 GMT]]></title><description><![CDATA[<p>Kann mir einer von euch mal erklären wozu man so etwas braucht? Mir fällt auf Anhieb hier keine sinnvolle Anwendung ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308904</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 19 Jun 2007 09:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 09:32:16 GMT]]></title><description><![CDATA[<p>Damit kann man besser abstrahieren, d.h. wenn man eine Basisklasse (z.B. einer Form) entwickelt hat und diese schon mit Events ausgestattet hat und jetzt möchte man diese weiter ableiten und auch neue Methoden an einen Event hängen, dann muß man sich immer einen Wolf schreiben, um beide Events abarbeiten zu lassen.</p>
<p>Ich habe selbst eine Basisklasse entwickelt (für mein eigenes Framework zum Entwickeln von Spielen), welche z.B. das OnMouseMove und OnKeyPress schon benutzt. Nun kann die abgeleitete Klasse nicht einfach</p>
<pre><code class="language-cpp">OnMouseMove = FormMouseMove;
</code></pre>
<p>schreiben, da dann die Methode 'BaseForm.OnMouseMove' nicht mehr aufgerufen wird, d.h. diese muß ich dann explizit aufrufen (quasi wie bei virtuellen Methoden), vorausgesetzt ich habe diese dann wenigstens als 'protected' deklariert.<br />
Auch das Anhängen und Abkoppeln von (temporären) Events ist immer etwas lästig, z.B.</p>
<pre><code class="language-cpp">TEvent *old = OnEvent;
OnEvent = FormEvent;
... // do something: call a method which tiggers the event
OnEvent = old;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1308933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308933</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 19 Jun 2007 09:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 09:46:01 GMT]]></title><description><![CDATA[<p>Wie ist das denn dann mit der Reihenfolge beim Multicast?<br />
Gerade bei dem Beispiel von Th wäre es ja unter Umständen sinnvoll, das sein OnMouseMove der Basisklasse vor dem dynamisch zugewiesenen OnMouseMove durchgeführt wird.<br />
Edit:<br />
Evlt. wäre auch ein Abbruch des Multicast sinnvoll?!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308940</guid><dc:creator><![CDATA[-**xXx**-]]></dc:creator><pubDate>Tue, 19 Jun 2007 09:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 09:54:05 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ja das ist auch gut. Die Reihenfolge sollte wichtig/manipulierbar sein (nicht nur add, sondern auch insert?). Und bei dem sequentiellen Abarbeiten der Eventliste sollte ein Aufruf die Abarbeitung aller nachfolgenden Aufrufe verhindern können.<br />
Das dürfte nur schwer zu realiseren sein, weil aus der gewöhnlichen Eventmethode kein Signal an den Aufrufenden Multicast-Handler zurückgegeben werden kann. Dazu müßte man jeweils die Original-Signatur um einen zusätzlichen Parameter erweiteren, oder den Rückgabewert bool statt void verwenden.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308943</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 19 Jun 2007 09:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 12:47:13 GMT]]></title><description><![CDATA[<p>Vielen Dank für euer Feedback!</p>
<p>akari schrieb:</p>
<blockquote>
<p>Noch nicht so schön ist natürlich das solche MulticastEvents manuell gelöscht werden müßen. Vielleicht könnte man da noch etwas automatisieren?</p>
</blockquote>
<p>Das habe ich noch vor <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="😉"
    /><br />
Ich werde mal daran arbeiten, mal sehen, ob und wie das klappt. Momentan schwebt mir eine Version ganz ohne manuelle Vor- und Nacharbeit vor.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Das Destroy sollte man dann aber im passenden Destruktor der Klasse machen, da du ja das Anlegen der multicasts im Konstruktor der Klasse (nicht in FormCreate) gemacht hast.</p>
</blockquote>
<p>Das kann ja jeder machen, wie ihm beliebt. Zuerst hatte ich auch die Initialisierung in OnCreate, aber in der BCB-Dokumentation steht:</p>
<p>C++Builder 6 Dokumentation - TCustomForm::OnCreate schrieb:</p>
<blockquote>
<p>Hinweis: Das Ereignis OnCreate sollte in C++Builder nicht verwendet werden, da es zu Konflikten mit dem Formularkonstruktor führen kann (siehe OldCreateOrder). Es wird empfohlen, statt dessen den Formularkonstruktor entsprechend zu überschreiben.</p>
</blockquote>
<p>Von OnDestroy wird nicht abgeraten. Da der Konstruktor immer automatisch generiert wird und OnDestroy sich über den Objektinspektor erstellen läßt, hatte ich dieses genommen.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Die Syntax finde ich noch nicht so elegant (auch wenn man dann wahrscheinlich für die verschiedenen Event-Typen typedefs anlegen kann).</p>
<p>Besser fände ich es wenn man entweder</p>
<pre><code class="language-cpp">T x = createMulticastEvent1 &lt;void, TObject*&gt; (Button1-&gt;OnClick);
x.addEvent (this-&gt;Button1Click);
x.addEvent (this-&gt;Button2Click);
</code></pre>
</blockquote>
<p>Das wäre zwar problemlos möglich, aber suboptimal - nicht immer möchte man ein Event dort hinzufügen, wo man die Events zu Multicast-Events macht. Und wenn die explizite Erstellung der Multicast-Events wegfallen sollte, geht das ohnehin nicht mehr.<br />
Wenn man überladene Operatoren verwendet, kann man leider nicht ohne weiteres Closures wie this-&gt;Button1Click übergeben (ursprünglich wollte ich += und -= anstatt von addEvent und removeEvent verwenden).</p>
<p>-=]xXx[=- schrieb:</p>
<blockquote>
<p>Wie ist das denn dann mit der Reihenfolge beim Multicast?</p>
</blockquote>
<p>Reihenfolge des Hinzufügens.<br />
Ich könnte auch Iteratoren implementieren, mit denen sich die Eventliste manipulieren läßt...</p>
<p>-=]xXx[=- schrieb:</p>
<blockquote>
<p>Evlt. wäre auch ein Abbruch des Multicast sinnvoll?!?</p>
</blockquote>
<p>Wie würdest du dir das konkret vorstellen? Einen optionalen Parameter würde ich eigentlich gern vermeiden.<br />
Vielleicht mit einer speziellen Exception...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309122</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 19 Jun 2007 12:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 19 Jun 2007 13:08:10 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>-=]xXx[=- schrieb:</p>
<blockquote>
<p>Evlt. wäre auch ein Abbruch des Multicast sinnvoll?!?</p>
</blockquote>
<p>Wie würdest du dir das konkret vorstellen? Einen optionalen Parameter würde ich eigentlich gern vermeiden.<br />
Vielleicht mit einer speziellen Exception...</p>
</blockquote>
<p>Kein Plan <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="🙂"
    /><br />
Ich hatte nur die Idee <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="😉"
    /> Ich würde es vermutlich ganz unkompliziert über einen direkten Zugriffe auf irgendeine Flag machen... Ob das gut ist, darüber lässt sich noch streiten....</p>
<p>mfg<br />
xXx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1309145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1309145</guid><dc:creator><![CDATA[-**xXx**-]]></dc:creator><pubDate>Tue, 19 Jun 2007 13:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Fri, 22 Jun 2007 01:46:49 GMT]]></title><description><![CDATA[<p>Mittlerweile bin ich schon recht weit fortgeschritten. Folgende Dateien dürften Funktionalität und Syntax ansatzweise demonstrieren:</p>
<p>multicast_demo.hpp:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef main_unitH
#define main_unitH
//---------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;Controls.hpp&gt;
#include &lt;StdCtrls.hpp&gt;
#include &lt;Forms.hpp&gt;

#include &lt;ucl/bcc/multicastsupport.hpp&gt;
//---------------------------------------------------------------------------
class TFrmMain : public TForm
{
__published:	// Von der IDE verwaltete Komponenten
    TButton *Button1;
    TButton *Button2;
    TButton *Button3;
    TLabel *Label1;
    TMemo *MmoOutput;
    TButton *BtnSwap13;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall Button3Click(TObject *Sender);
    void __fastcall BtnSwap13Click(TObject *Sender);
private:	// Benutzer-Deklarationen
    ucl::MulticastContainer mcc; // Besitzer der MulticastClosure-Objekte
public:		// Benutzer-Deklarationen

    __fastcall TFrmMain(TComponent* Owner);
    void __fastcall AnotherEventHandler(TObject *Sender);
    void __fastcall FooBar(TObject *Sender);
};
//---------------------------------------------------------------------------
extern PACKAGE TFrmMain *FrmMain;
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>multicast_demo.hpp:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &lt;ucl/bcc/multicast.hpp&gt;
#pragma hdrstop

#include &quot;main_unit.h&quot;
#include &lt;ucl/bcc/multicastspec.hpp&gt;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TFrmMain *FrmMain;

//---------------------------------------------------------------------------
__fastcall TFrmMain::TFrmMain(TComponent* Owner)
    : TForm(Owner)
{
        /*
         * ucl::asMulticast() erstellt das MulticastClosure-Objekt bei Bedarf.
         * die Objekte werden in der MulticastContainer-Klasse registriert und
         * gelöscht, wenn deren Destruktor aufgerufen wird.
         */

        // einen Event-Handler zu Button1-&gt;OnClick hinzufügen
    ucl::asMulticast (mcc, Button1-&gt;OnClick).push_back (this-&gt;AnotherEventHandler);

        // ein Closure explizit in ein Multicast-Closure umwandeln
    ucl::asMulticast (mcc, Button2-&gt;OnClick);

        // Referenz auf MultiCast-Objekt zurückgeben
    ucl::MulticastClosure1 &lt;void, TObject*&gt;&amp; mc = ucl::asMulticast (mcc, Button3-&gt;OnClick);

        // einen Event-Handler hinzufügen
    mc.push_front (this-&gt;Button1Click);

        // MulticastClosure-Objekte definieren eine Containerschnittstelle
    ucl::MulticastClosure1 &lt;void, TObject*&gt;::iterator i = mc.begin ();
    mc.insert (++i, this-&gt;Button2Click);

        // diese Anweisungen sind äquivalent:
    //mc (this);               // direkter Aufruf des MulticastClosure-Objekts
    //Button3-&gt;OnClick (this); // Aufruf des Events, dem das Objekt gehört
}

//---------------------------------------------------------------------------

void __fastcall TFrmMain::Button1Click(TObject *Sender)
{
    MmoOutput-&gt;Lines-&gt;Add (AnsiString (__FUNC__) + &quot; called.&quot;);
}
void __fastcall TFrmMain::Button2Click(TObject *Sender)
{
    MmoOutput-&gt;Lines-&gt;Add (AnsiString (__FUNC__) + &quot; called.&quot;);
    if (Sender == Button2)
    {
        ucl::MulticastClosure1 &lt;void, TObject*&gt;&amp; mc
            = ucl::asMulticast (mcc, Button2-&gt;OnClick);

            // hier eine weitere Anwendung der Containerschnittstelle
        if (mc.contains (this-&gt;FooBar))
            mc.remove (this-&gt;FooBar);
        else
            mc.push_back (this-&gt;FooBar);
    }
}
void __fastcall TFrmMain::Button3Click(TObject *Sender)
{
    MmoOutput-&gt;Lines-&gt;Add (AnsiString (__FUNC__) + &quot; called.&quot;);
}

void __fastcall TFrmMain::AnotherEventHandler(TObject *Sender)
{
    MmoOutput-&gt;Lines-&gt;Add (AnsiString (__FUNC__) + &quot; called.&quot;);
}
void __fastcall TFrmMain::FooBar(TObject *Sender)
{
    MmoOutput-&gt;Lines-&gt;Add (AnsiString (__FUNC__) + &quot; called.&quot;);
}
//---------------------------------------------------------------------------

void __fastcall TFrmMain::BtnSwap13Click(TObject *Sender)
{
    ucl::asMulticast (mcc, Button1-&gt;OnClick)
        .swap (ucl::asMulticast (mcc, Button3-&gt;OnClick));    
}
//---------------------------------------------------------------------------
</code></pre>
<p>ucl::asMulticast() läßt sich nun ohne explizite Angabe der Template-Parameter verwenden - allerdings nur, weil es in ucl/bcc/multicastsupport.hpp für TNotifyEvent spezialisiert wurde. Leider ist der BCC hier <a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1308757.html#1308757" rel="nofollow">etwas buggy</a>.</p>
<p>ucl::MulticastClosureN &lt;void, TObject*&gt; ließe sich seit C++Builder 2007 auch in Funktorschreibweise schreiben (MulticastClosure &lt;void (TObject*)&gt;), aber das habe ich noch nicht implementiert.</p>
<p><a href="http://www.audacia-software.de/pf/multicast010_demo.zip" rel="nofollow">Hier</a> das Demoprojekt, allerdings noch ohne den interessanten Quelltext - den muß ich noch ein wenig überarbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311110</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 22 Jun 2007 01:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Mon, 25 Jun 2007 19:49:27 GMT]]></title><description><![CDATA[<p>Aus dem Projekt habe ich mal eine kleine Bibliothek gebastelt, die hier verfügbar ist:<br />
<a href="http://www.audacia-software.de/de/win/ucl/index.htm" rel="nofollow">http://www.audacia-software.de/de/win/ucl/index.htm</a></p>
<p>Header-Dateien, Quelltext, Demo-Projekt und Dokumentation liegen bei. Die Bibliothek läuft ab C++Builder 6 (mit C++Builder 5 habe ich es noch nicht getestet).</p>
<p>Über Feedback jeder Art würde ich mich freuen <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/1313633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313633</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 25 Jun 2007 19:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Fri, 29 Jun 2007 23:42:48 GMT]]></title><description><![CDATA[<p>Update auf v0.1.1:<br />
- Unterstützung für C++Builder 5, 6, 2006 und 2007 (auf C++Builder 3 und 4 habe ich keinen Zugriff, und C++Builder 1 ist definitiv zu alt)<br />
- kleine Bugfixes</p>
<p>Leider scheint das Interesse ja doch nicht so groß gewesen zu sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315385</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 29 Jun 2007 23:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Sat, 30 Jun 2007 09:42:46 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Leider scheint das Interesse ja doch nicht so groß gewesen zu sein...</p>
</blockquote>
<p>Also ich kann nur für mich sprechen, also ich wüsste nicht wo ich das einsetzten sollte bzw. hat mir diese Funktionalität noch nie gefehlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315470</guid><dc:creator><![CDATA[VergissEs]]></dc:creator><pubDate>Sat, 30 Jun 2007 09:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Mon, 02 Jul 2007 07:30:10 GMT]]></title><description><![CDATA[<p>Das geht mir genau so. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1316592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1316592</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 02 Jul 2007 07:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 03 Jul 2007 17:59:31 GMT]]></title><description><![CDATA[<p>Ich hab in meinem Projekt einen Anwendungsfall, hab das aber einfach über nen Vector mit Funktions-Pointern gelöst.<br />
Und momentan hab ich keine Zeit das umzubauen ^^</p>
<p>mfg<br />
xXx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1317672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1317672</guid><dc:creator><![CDATA[-**xXx**-]]></dc:creator><pubDate>Tue, 03 Jul 2007 17:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Tue, 03 Jul 2007 19:43:30 GMT]]></title><description><![CDATA[<p>VergissEs schrieb:</p>
<blockquote>
<p>Also ich kann nur für mich sprechen, also ich wüsste nicht wo ich das einsetzten sollte</p>
</blockquote>
<p>Beispiel: ein dezentrales Kommunikationstool (z.B. ein Multiuser-Chat ohne zentralen Server). Auf das Senden einer Nachricht durch einen &quot;Send&quot;-Button müssen alle Teilnehmer reagieren. Für die Kommunikation mit den Teilnehmern sorgt jeweils eine Instanz einer Klasse. Jedes dieser Objekte registriert mittels Multicast-Closure einen Eventhandler bei dem OnClick-Event des Buttons. Wenn Chat-Teilnehmer und entsprechende Objekte hinzukommen, registrieren diese zur Laufzeit einen weiteren Handler, wenn sich ein User verabschiedet, entfernt das Objekt im Destruktor seinen Handler wieder.</p>
<p>Natürlich ginge das auch anders. Aber das dürfte die sauberste Methode sein <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/1317727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1317727</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 03 Jul 2007 19:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Wed, 04 Jul 2007 07:16:27 GMT]]></title><description><![CDATA[<p>Ich würde für diesen Fall eine Liste der Klasseninstanzen nehmen und die dann abarbeiten. <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/1317929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1317929</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 04 Jul 2007 07:16:27 GMT</pubDate></item><item><title><![CDATA[Reply to Multicast-Closures? on Wed, 04 Jul 2007 08:27:27 GMT]]></title><description><![CDATA[<p>Das ist ein konzeptioneller Unterschied. Im einen Fall melden sich die &quot;Listeners&quot; zentral beim Ereignis an, im anderen kümmert sich das Ereignis selbst um die Verteilung.</p>
<p>Klar kann man das auch anders machen, aber wenn du so etwas mit mehreren Events zugleich hast, mußt du für jedes einen Wrapper bauen. Und da wird die Multicast-Closure-Lösung dann plötzlich viel übersichtlicher <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/1317983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1317983</guid><dc:creator><![CDATA[audacia|off]]></dc:creator><pubDate>Wed, 04 Jul 2007 08:27:27 GMT</pubDate></item></channel></rss>