oncode
2/7/2013 - 1:16 PM

Mediator pattern example for Borland components.

Mediator pattern example for Borland components.

class Mediator
{
  private:

    // text fields to mediate
    TEdit
      *m_txtOne,
      *m_txtTwo;

    // original "onchange" events from text fields
    TNotifyEvent
      m_eventOne,
      m_eventTwo;

  public:

    // initialize text fields to mediate
    void init
      (TEdit* txtOne, TEdit* txtTwo);

    // shadowed "onchange" events for text fields
    void __fastcall txtOneChange
      (TObject *Sender);
    void __fastcall txtTwoChange
      (TObject *Sender);
};
void Mediator::init(TEdit* txtOne, TEdit* txtTwo)
{
  // save pointers to text fields
  m_txtOne = txtOne;
  m_txtTwo = txtTwo;

  // save original "onchange" events
  m_eventOne = m_txtOne->OnChange;
  m_eventTwo = m_txtTwo->OnChange;

  // override original "onchange" events
  m_txtOne->OnChange = txtOneChange;
  m_txtTwo->OnChange = txtTwoChange;
}

void __fastcall Mediator::txtOneChange(TObject *sender)
{
  m_txtTwo->Enabled = !m_txtOne->Text.IsEmpty();

  if (m_eventOne != 0)
  {
    // call original "onchange" event
    m_eventOne(sender);
  }
}

void __fastcall Mediator::txtTwoChange(TObject *sender)
{
  m_txtOne->Enabled = !m_txtTwo->Text.IsEmpty();

  if (m_eventTwo != 0)
  {
    // call original "onchange" event
    m_eventTwo(sender);
  }
}