Accueil | MEET | PFEG | IGC | STG | BTS IG | BTS SIO | Cours | Didactique | Exos | Glossaire | Labo | Sujets | Outils Imprimer cette page



Rechercher
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

UNE HORLOGE SIMPLE

1. Les classes

Dans cette seconde étape, nous allons réaliser un composant horloge "basique". Le résultat attendu est une horloge analogique munie de trois aiguilles et indiquant en permanence l'heure exacte. Voici la description des éléments permettant de la réaliser.

L'horloge

Une horloge (classe dérivée de TgraphicControl) possède les caractéristiques suivantes :

  • Un centre, il s'agit d'un point permettant de situer l'horloge sur la fenêtre.
  • Un rayon, rayon du cadran de l'horloge exprimé en pixels.
  • Trois aiguilles, indiquant respectivement l'heure, la minute et la seconde courante.
  • Un timer (appelons-le "temps"), il s'agit d'un composant Delphi capable de générer un événement à intervalle régulier. Il sera utilisé pour faire "avancer" l'horloge.

Les aiguilles

Une aiguille est définie par :

  • Un point origine matérialisant l'emplacement où l'aiguille est fixée (le centre de l'horloge en fait).
  • Un point extrémité, ce point étant recalculé à chaque déplacement de l'aiguille. Il sera judicieux d'utiliser un point polaire pour représenter cette extrémité.
  • Des caractéristiques de forme : longueur, épaisseur, couleur.
  • Une surface de dessin, en fait le canevas sur lequel l'aiguille doit se dessiner. Ce canevas lui sera fourni par l'horloge (celle-ci en hérite un de TgraphicControl).

Travail à faire

  • Représentez graphiquement les classes nécessaires à la réalisation de l'horloge.

2. Réalisation du composant

Classe Thorloge (dans le fichier horloge.pas) :

THorloge=class(TGraphicControl)

// composant graphique "horloge analogique"

private

centre:TPoint; // point d'accroche des aiguilles

rayon:integer; // rayon de l'horloge en pixels

heure,minute,seconde:TAiguille; // les trois aiguilles de l'horloge

temps:TTimer; // déclencheur d'avancement

procedure init; // appelée au début, au redimensionnement

procedure dessinerCadran; // dessin du cadran de l'horloge

procedure tempsTimer(sender : TObject); // procédure déclenchée chaque seconde par le timer

procedure getMoment(var h,m,s:double); // renseigne h,m,s:position des aiguilles selon l'heure courante

public

constructor Create(AOwner:TComponent);override; // constructeur redéfini

procedure Paint;override; // appelée par le système pour rafraîchir l'affichage du composant

destructor Destroy;override; // destructeur redéfini

end;

Remarques :

  • Le constructeur doit entre autres créer tous les objets possédés par l'horloge, le destructeur les détruira.
  • La méthode init affecte la procédure tempsTimer à l'événement OnTimer du timer temps, calcule le centre et le rayon de l'horloge, et initialise les trois aiguilles.
  • La procédure tempsTimer appelle chaque seconde la procédure getMoment, puis repositionne chacune des aiguilles par un appel à la méthode setPosition de la classe aiguille.
  • Les fonctions Now, HourOf, MinuteOf et SecondOf sont utiles pour la réalisation de getMoment.

Classe Taiguille (dans le fichier horloge.pas) :

TAiguille=class(TObject)

// une aiguille d'horloge

private

canvas:TCanvas; // surface de dessin de l'aiguille (fournie par l'horloge)

origine:TPoint; // point d'accroche de l'aiguille

extremite:TPointPolaire; // ce point est modifié à chaque déplacement de l'aiguille

longueur,epaisseur:integer; // permet la distinction visuelle heure, minute et seconde

couleur:TColor; // couleur de dessin de l'aiguille (toujours noir dans cette version)

procedure setPosition(p_position:double);

// p_position compris entre 0 et 60, double pour éviter les "sauts"

procedure dessiner(p_couleur:TColor); // affichage ou effacement de l'aiguille selon la couleur

public

constructor Create(p_canvas:TCanvas);overload; // surcharge (signature différente)

procedure init(p_origine:TPoint;p_longueur,p_epaisseur:integer;p_couleur:TColor);

// appelée à l'initialisation de l'horloge

destructor Destroy;override; // redéfinition (signature identique)

end;

Travail à faire

  • Schématisez le fonctionnement de l'horloge décrit ci-dessous à l'aide d'un diagramme de séquence.

Chaque seconde, le timer "temps" envoie un message à l'horloge et appelle sa méthode "tempsTimer". Cette méthode appelle "getMoment" pour récupérer l'heure système, puis fait appel à la méthode setPosition de la classe Taiguille trois fois de suite : pour l'aiguille "seconde", pour l'aiguille "minute", puis pour l'aiguille "heure" (on ne s'intéressera ici qu'à l'aiguille des secondes).

L'aiguille qui reçoit le message "setPosition" appelle la méthode dessiner avec la couleur de fond (cet appel efface dons l'aiguille), puis envoie le message setPosPolaireCentre à l'objet "extrémité" (ce qui repositionne l'extrémité de l'aiguille), et enfin appelle une seconde fois la méthode dessiner avec la couleur noire (ce qui réaffiche l'aiguille à sa nouvelle place).

  • Complétez le fichier horloge.pas en y ajoutant la déclaration des classes Thorloge et Taiguille.
  • Définissez chacune des méthodes prévues dans la partie implémentation de l'unité.
  • Testez votre composant.
   

_____________________________________________  
© - Réseau C E R T A 

Ministère de l'Éducation Nationale