AMELIORATION DU COMPOSANT
1. Trois tailles de cadran
L'utilisateur du composant horloge détermine graphiquement sa taille en phase de conception. En fonction de cette taille, nous allons déterminer un niveau de détail pour l'affichage de l'horloge.
- Taille 1 (petite, rayon <= 35 pixels) : les aiguilles sont toutes les trois d'épaisseur 1 et le cadran est matérialisé par un simple cercle.
- Taille 2 (moyenne, rayon compris entre 35 et 60 pixels) : les aiguilles sont toutes d'épaisseur 1 et le cadran indique les heures.
- Taille 3 (grande, rayon > 60 pixels) : les aiguilles sont d'épaisseurs différentes (1, 2 et 3 pixels) et le cadran indique les heures et les minutes.
Le dessin ci-dessous résume les trois cas :

Le principe de réalisation est le suivant :
- La taille de l'horloge est calculée à son initialisation, elle est mémorisée en partie privée et les aiguilles sont initialisées en fonction de cette information.
- Le dessin du cadran varie en fonction de la taille.
Travail à faire
- Modifiez votre composant pour y ajouter la notion de taille.
2. Affichage de la date
En taille 3, l'horloge est suffisamment grande pour permettre l'affichage de la date du jour sous la forme JJ/MM/AAAA dans la partie inférieure du cadran. :

- L'emplacement d'affichage de la date peut être calculé et mémorisé à l'aide d'un point lors de l'initialisation de l'horloge.
- Le code suivant place la date formatée dans une variable jour de type string :
moment:=Now;
jj:=DayOf(moment);
mm:=MonthOf(moment);
aa:=YearOf(moment);
jour:=format('%2d/%2d/%4d',[jj,mm,aa]);
Travail à faire :
- Réalisez cette nouvelle amélioration de l'horloge.
3. Couleurs paramétrables
La dernière amélioration prévue est la possibilité de modifier les couleurs de l'horloge (couleur du cadran et couleur des aiguilles).
Ceci peut être réalisé par l'ajout de deux propriétés publiées : CouleurFond et CouleurTrait de type TColor. L'intérêt de cette solution est que ces propriétés apparaîtront dans l'inspecteur d'objet en phase de conception (elles seront également accessibles en phase d'exécution).
Le principe de réalisation d'une propriété est le suivant (exemple d'une propriété entière) :
- La propriété est déclarée dans la partie publiée (published) de la classe.
property maPropriete : integer;
- Une donnée de même type est déclarée en partie privée.
FmaPropriete : integer;
- Les méthodes accès à la propriété en lecture et en écriture sont précisées dans la déclaration de la propriété. Le plus simple est un accès direct à la donnée privée.
property maPropriete : integer read FmaPropriete write FmaPropriete;
Dans ce cas, un accès en lecture comme en écriture à "maPropriete" se traduira par un accès direct à la donnée privée "FmaPropriete".
- Il est également possible d'indiquer qu'un accès en écriture fait en réalité appel à une procédure. Cette procédure est une méthode privée de la classe (en général virtuelle, ce qui permet sa redéfinition) et reçoit automatiquement en paramètre la valeur affectée à la propriété. Elle permet par exemple de réaliser un contrôle.
property maPropriete : integer read FmaPropriete write SetMaPropriete;
procedure MaClasse.SetMaPropriete(valeur : integer);
begin
if valeur < 0 then valeur:=0;
FmaPropriete:=valeur;
end;
- L'accès en lecture peut également faire appel à une fonction ne prenant aucun paramètre et retournant une valeur du type de la propriété.
property maPropriete : integer read GetMaPropriete write SetMaPropriete;
function MaClasse.GetMaPropriete : integer;
begin
return FmaPropriete;
end;
Remarques :
- Il existe d'autres possibilités (propriétés énumérées, index passé en paramètre aux fonctions d'accès, ...).
- Cette implémentation de la notion de propriété permet de respecter le principe d'encapsulation.
- On voit que la mémorisation des valeurs de propriétés n'est pas obligatoirement réalisée aussi simplement qu'à l'aide d'une donnée privée.
Application à l'horloge
Nous allons définir deux propriétés : CouleurFond et CouleurTrait. L'accès en lecture sera direct, l'accès en écriture doit faire appel à une procédure. En effet, lorsque l'on change la couleur de l'horloge, celle-ci doit être redessinée. Il faut donc générer un appel à la méthode "Paint". Ceci est fait en appelant la méthode "Invalidate" héritée de TgraphicControl.
Quelques informations :
- La couleur de fond est définie par Canvas.Brush.Color.
- La couleur de trait est définie par Canvas.Pen.Color.
- La couleur du texte est définie par Canvas.Font.Color.
Travail à faire
- Ajoutez la possibilité de paramètrer les couleurs de l'horloge.
|