Autorisation des mises à jour nécessaires
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
}