RAD Studio |  |

Adding the ReadOnly property

By adding a ReadOnly property, you will provide a way to make the control read-only at design time. When that property is set to True, you can make all cells in the control unable to be selected.

To add the ReadOnly property, follow these steps:

1. Add the property declaration and a private field to hold the value:

Copy Code

    type
      TDBCalendar = class(TSampleCalendar)
      private
        FReadOnly: Boolean;                                     { field for internal storage }
      public
        constructor Create(AOwner: TComponent); override;     { must override to set default }
      published
        property ReadOnly: Boolean read FReadOnly write FReadOnly default True;
      end;
    .
    .
    .
    constructor TDBCalendar.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);                     { always call the inherited constructor! }
      FReadOnly := True;                                             { set the default value }
    end;

Copy Code

    //header file
    class PACKAGE TDBCalendar : public TSampleCalendar
    {
    private:
        bool FReadOnly;                                  // field for internal storage
    protected:
    public:
        virtual __fastcall TDBCalendar(TComponent* Owner);
    __published:
        __property ReadOnly = {read=FReadOnly, write=FReadOnly, default=true};
    };

Copy Code

    //implementation file:
    virtual __fastcall TDBCalendar::TDBCalendar(TComponent* Owner) :
      TSampleCalendar(Owner)
    {
      FReadOnly = true;                                   // sets the default value
    }

1. Override the SelectCell method to disallow selection if the control is read-only. Use of SelectCell is explained in Excluding blank cells.

Copy Code

    function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean;
    begin
      if FReadOnly then Result := False                         { cannot select if read only }
      else Result := inherited SelectCell(ACol, ARow);     { otherwise, use inherited method }
    end;

Copy Code

    bool __fastcall TDBCalendar::SelectCell(long ACol, long ARow)
    {
      if (FReadOnly) return false;                        // can't select if read only
      return TSampleCalendar::SelectCell(ACol, ARow);     // otherwise, use inherited method
    }

Remember to add the declaration of SelectCell to the type declaration of TDBCalendar, and append the override directive.

If you now add the calendar to a form, you will find that the component ignores clicks and keystrokes. It also fails to update the selection position when you change the date.

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