Autorisation des mises à jour nécessaires

De RAD Studio
Aller à : navigation, rechercher

Remonter à Contrôles orientés données - Index

Le calendrier accessible en lecture seulement utilise la méthode SelectCell pour effectuer toutes sortes de modifications, y compris l'affectation de valeurs aux propriétés Row et Col. La méthode UpdateCalendar définit Row et Col à chaque changement de date mais, dans la mesure où SelectCell n'autorise aucune modification, la position de la sélection reste inchangée, même si la date est modifiée.

Pour outrepasser cette interdiction de toute modification, vous devez ajouter au calendrier un indicateur booléen interne et n'autoriser les modifications que si la valeur de cet indicateur est 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;

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
}