//---------------------------------------------------------------------------
#include <
vcl.h>
#include <ucl/bcc/multicast.hpp>
#include <ucl/bcc/multicastspec.hpp>
#pragma hdrstop
#include "main_unit.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma resource "*.dfm"
TFrmMain *FrmMain;
//---------------------------------------------------------------------------
__fastcall TFrmMain::TFrmMain(TComponent* Owner) // Konstruktor
: TForm(Owner)
{
/*
* ucl::bcc::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->OnClick hinzufügen
ucl::bcc::asMulticast (mcc, Button1->OnClick).push_back (this->AnotherEventHandler);
// ein Closure explizit in ein Multicast-Closure umwandeln
ucl::bcc::asMulticast (mcc, Button2->OnClick);
// Referenz auf MultiCast-Objekt zurückgeben
ucl::bcc::MulticastClosure1 <void, TObject*, ucl::bcc::ccFastcall>& mc
= ucl::bcc::asMulticast (mcc, Button3->OnClick);
// einen Event-Handler hinzufügen
mc.push_front (this->Button1Click);
// MulticastClosure-Objekte definieren eine Containerschnittstelle
ucl::bcc::MulticastClosure1 <void, TObject*>::iterator i = mc.begin ();
mc.insert (++i, this->Button2Click);
// diese Anweisungen sind äquivalent:
//mc (this); // direkter Aufruf des MulticastClosure-Objekts
//Button3->OnClick (this); // Aufruf des Events, dem das Objekt gehört
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::Button1Click(TObject */*Sender*/)
{
MmoOutput->Lines->Add (AnsiString (__FUNC__) + " called.");
}
void __fastcall TFrmMain::Button2Click(TObject *Sender)
{
MmoOutput->Lines->Add (AnsiString (__FUNC__) + " called.");
if (Sender == Button2)
{
ucl::bcc::MulticastClosure1 <void, TObject*, ucl::bcc::ccFastcall>& mc
= ucl::bcc::asMulticast (mcc, Button2->OnClick);
// hier eine weitere Anwendung der Containerschnittstelle
if (mc.contains (this->FooBar))
mc.remove (this->FooBar);
else
mc.push_back (this->FooBar);
}
}
void __fastcall TFrmMain::Button3Click(TObject */*Sender*/)
{
MmoOutput->Lines->Add (AnsiString (__FUNC__) + " called.");
}
void __fastcall TFrmMain::AnotherEventHandler(TObject */*Sender*/)
{
MmoOutput->Lines->Add (AnsiString (__FUNC__) + " called.");
}
void __fastcall TFrmMain::FooBar(TObject */*Sender*/)
{
MmoOutput->Lines->Add (AnsiString (__FUNC__) + " called.");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnSwap13Click(TObject */*Sender*/)
{
ucl::bcc::asMulticast (mcc, Button1->OnClick)
.swap (ucl::bcc::asMulticast (mcc, Button3->OnClick));
}
//---------------------------------------------------------------------------