RAD Studio |  |

Providing an OnChange Event

Now that users of the calendar can change the date within the calendar, it makes sense to allow applications to respond to those changes.

Add an OnChange event to TSampleCalendar.

1. Declare the event, a field to store the event, and a dynamic method to call the event:

Copy Code

    type
      TSampleCalendar = class(TCustomGrid)
      private
        FOnChange: TNotifyEvent;
      protected
        procedure Change; dynamic;
      .
      .
      .
      published
        property OnChange: TNotifyEvent read FOnChange write FOnChange;
      .
      .
      .

Copy Code

    class PACKAGE TSampleCalendar : public TCustomGrid
    {
    private:
        TNotifyEvent FOnChange;
        .
        .
        .
    protected:
        virtual void __fastcall Change();
    __published:
        __property TNotifyEvent OnChange = {read=FOnChange, write=FOnChange};
        .
        .
        .
    }

1. Write the Change method:

Copy Code

    procedure TSampleCalendar.Change;
    begin
      if Assigned(FOnChange) then FOnChange(Self);
    end;

Copy Code

    void __fastcall TSampleCalendar::Change()
    {
      if(FOnChange != NULL) FOnChange(this);
    }

1. Add statements calling Change to the end of the SetCalendarDate and SetDateElement methods:

Copy Code

    procedure TSampleCalendar.SetCalendarDate(Value: TDateTime);
    begin
      FDate := Value;
      UpdateCalendar;
      Change;                                               { this is the only new statement }
    end;
    procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer);
    begin
        .                                            { many statements setting element values }
        .
        .
        FDate := EncodeDate(AYear, AMonth, ADay);
        UpdateCalendar;
        Change;                                                                { this is new }
      end;
    end;

Copy Code

    void __fastcall TSampleCalendar::SetCalendarDate(TDateTime Value)
    {
      FDate = Value;
      UpdateCalendar();
      Change();              // this is the only new statement
    }
    void __fastcall TSampleCalendar::SetDateElement(int Index, int Value)
    {
      .
      .
      .    // many statements setting element values
      FDate = TDateTime(AYear, AMonth, ADay);
      UpdateCalendar();
      Change();              // this is new
    }

Applications using the calendar component can now respond to changes in the date of the component by attaching handlers to the OnChange event.

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!