必要な更新の許可
コントロールの読み取り専用化 への移動
この読み取り専用カレンダーでは、Row プロパティと Col プロパティの設定など、あらゆる種類の変更に SelectCell メソッドを使用します。UpdateCalendar メソッドでは、日付が変わるたびに Row と Col を設定しようとしますが、SelectCell メソッドが変更を許可しないため、たとえ日付が変わっても選択されているセルは変わりません。
このような変更に対する無条件の禁止を避けるには、次のように、カレンダーに論理型の内部フラグを追加し、そのフラグが True に設定されている場合に変更を許可することができます。
type TDBCalendar = class(TSampleCalendar) private FUpdating: Boolean; { private flag for internal use } protected function SelectCell(ACol, ARow: Longint): Boolean; override; public procedure UpdateCalendar; override; { remember the override directive } end; . . . function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean; begin if (not FUpdating) and FReadOnly then Result := False { allow select if updating } else Result := inherited SelectCell(ACol, ARow); { otherwise, use inherited method } end; procedure TDBCalendar.UpdateCalendar; begin FUpdating := True; { set flag to allow updates } try inherited UpdateCalendar; { update as usual } finally FUpdating := False; { always clear the flag } end; end;
class PACKAGE TDBCalendar : public TSampleCalendar { private: . . . bool FUpdating; // private flag for internal use protected: virtual bool __fastcall SelectCell(long ACol, long ARow); public: . . . virtual void __fastcall UpdateCalendar(); . . . }; bool __fastcall TDBCalendar::SelectCell(long ACol, long ARow) { if (!FUpdating && FReadOnly) return false; // can't select if read only return TSampleCalendar::SelectCell(ACol, ARow); // otherwise, use inherited method } void __fastcall TDBCalendar::UpdateCalendar() { FUpdating=true; // set flag to allow updates try { TSampleCalendar::UpdateCalendar(); // update as usual } catch(...) { FUpdating = false; throw; } FUpdating = false; // always clear the flag }
このカレンダーでは、ユーザーによる変更は依然として禁止されていますが、日付の変更を日付プロパティの変更により正しく反映するようになりました。これで、本当の読み取り専用カレンダー コントロールができあがったので、次は、データ参照機能を追加します。