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;                                  { indicateur privé à usage interne }
   protected
     function SelectCell(ACol, ARow: Longint): Boolean; override;
   public
     procedure UpdateCalendar; override;                { ne pas oublier la directive override }
   end;
 .
 .
 .
 function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean;
 begin
   if (not FUpdating) and FReadOnly then Result := False       { sélection possible si mise à jour }
   else Result := inherited SelectCell(ACol, ARow);     { sinon, utiliser la méthode héritée }
 end;
 procedure TDBCalendar.UpdateCalendar;
 begin
   FUpdating := True;                                         { définir l'indicateur pour permettre les mises à jour }
   try
     inherited UpdateCalendar;                                          { mise à jour habituelle }
   finally
     FUpdating := False;                                          { toujours réinitialiser l'indicateur }
   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
}