必要な更新の許可

提供: RAD Studio
移動先: 案内検索

コントロールの読み取り専用化 への移動


この読み取り専用カレンダーでは、Row プロパティと Col プロパティの設定など、あらゆる種類の変更に SelectCell メソッドを使用します。UpdateCalendar メソッドでは、日付が変わるたびに RowCol を設定しようとしますが、SelectCell メソッドが変更を許可しないため、たとえ日付が変わっても選択されているセルは変わりません。

このような変更に対する無条件の禁止を避けるには、次のように、カレンダーに論理型の内部フラグを追加し、そのフラグが True に設定されている場合に変更を許可することができます。

Delphi:

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;

C++:

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
}

このカレンダーでは、ユーザーによる変更は依然として禁止されていますが、日付の変更を日付プロパティの変更により正しく反映するようになりました。これで、本当の読み取り専用カレンダー コントロールができあがったので、次は、データ参照機能を追加します。