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; { 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
}