Une horloge à aiguilles, toute simple (delphi).

Soyez le premier à donner votre avis sur cette source.

Vue 15 502 fois - Téléchargée 1 791 fois

Description

Je n'ai pas de grosses notions en trigonométrie, j'ai essayé de faire une horloge le plus simplement possible avec mes faibles connaissances : certains vont peut-être trouver le code un peu enfantin : je préfère un truc simple qui marche et que je comprends à un truc savant et incertain dont le fonctionnement m'échappe...

La source se trouve dans le fichier zip.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
yoghisan Messages postés 205 Date d'inscription samedi 10 mai 2003 Statut Membre Dernière intervention 2 juin 2005 1
1 nov. 2003 à 01:03
Bonjour,

Juste trois questions :
- A quoi sert la procedure "procedure TForm1.PaintBox1Paint(Sender: TObject);" ?
Je ne vois pas trop avec tout ce qu'il y a dans le code à quoi ca peut bien servir.
- A quoi ca sert dans la procedure du timer de le desactiver au debut de la procedure et de le reactiver a la fin ? Pourquoi ne pas le laisser activer tout le temps ? IL y aurai t-il une chose que j'ignore encore ?
- A quoi sert la constante locale "NewSec" ?
Je ne sais pas mais pour moi, si tu changes la valeur de ta constante, est ce que c'est reellement une constante ?
Il y a un truc que je ne sais pas : si c'est une constante locale donc a chaque fois que tu lances la procedure, ta constante sera reinitialisé et donc l'affectation que tu as faite precedemment n'est pas utilisé et donc ne sert a rien... Il y a un truc que la aussi je ne saisis pas, pour moi j'aurai juste mis "AfficheHeure" dans la procedure. Peux tu m'expliquer sur quoi je me plante ?

Ce que j'ai appris de ta prog, c'est que les constantes ca peut etre très pratique (je me suis amusé par exemple à changer "trait" et "xmod") et surtout l'utilité du "mod" que j'ignorais completement (tu t'en sers comme un truc cyclique ,cad, quand on depasse la valeur maxi, on revient au debut si je peux m'exprimer ainsi... ).

Merci,

un mec plus novice que toi qui cherche juste à comprendre certains de tes choix afin de pouvoir m'améliorer.
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
1 nov. 2003 à 02:31
La procédure TForm1.PaintBox1Paint(Sender: TObject) sert à repeindre l'horloge si tu places une fenêtre d'une autre application dessus ou que tu recouvres partiellement cette fenêtre avec celle d'une autre application : pour voir, supprime le code de cette procédure et fais passer une autre fenêtre dessus (étant donné que la fenêtre se repeint une fois par seconde ce n'est pas trop visible quand même, mais ce n'est pas très esthétique...)

En ce qui concerne l'activation et la désactivation du timer, je pense comme toi que ce n'est peut-être pas indispensable : ma crainte, c'est qu'une autre application freine l'exécution de Windows et que le code soit exécuté en cascade : c'est plus une crainte qu'une réalité constatée... Si on l'enlève ça doit marcher sans problème (j'ai rajouté ce truc en dernier, en étant un peu dubitatif !).

Lorsque qu'une constante est déclarée en local, dans une procédure, elle se comporte comme une variable statique et conserve la dernière valeur affectée jusqu'au prochain appel de la procédure (elle n'est pas réinitialisée à 0 à chaque appel comme on pourrait le croire...). En ce qui concerne l'appel de la procédure "AfficheHeure", le timer pour être efficace doit être réglé à un interval de temps < 1 seconde (1000), si on le met sur 1 seconde pile poil, avec les ralentissements de Windows, il ne s'exécutera pas toutes les secondes... En le mettant à 250 (1/4 de seconde) comme je l'ai fait, il risque aussi de rafraîchir l'affichage inutilement d'où la variable statique "NewSec" qui limite le rafaichissement aux seules fois ou les secondes ont changées.

En ce que concerne Mod, c'est très pratique ;: çà renvoie le reste d'une division A par B ===> 12 mod 24 = 12 ; 14 mod 12 = 2; 24 mod 12 = 0 etc... C'est très utile aussi quand il faut gérer des lignes et des colonnes dans une boucle for/next.

autre exemple d'utilisation :
index := 0;
.
.
.
index := (index mod 16) + 1;
//permet de donner à index une valeur en boucle (de 16, on repasse à 1).

Voilà, et bonne programmation...
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
1 nov. 2003 à 03:58
===============================================

Autre précision :

Ce que j'ai dit pour les constantes déclarées en local ne semble plus valable pour Delphi 6 et Delphi 7 : J'ai développé le projet en Delphi 3 et j'ai repris le code sous Delphi 6 et 7 : là çà marche, la constante déclarée en local est considérée comme une variable statique. En revanche, si l'on part d'un nouveau projet Delphi 6 ou 7, il n'accepte plus les affectations pour les contantes déclarées en local (message d'erreur : la partie gauche n'est pas affectable !).

Voilà, qu'elle était bonne la question !

Reste que l'on peut déclarer "NewSec" comme une variable globale...

(NOTA : j'ai Delphi 6 et 7 depuis 15 jours ; auparavent, j'ai développé tous mes projets avec Delphi 3 Pro).
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
1 nov. 2003 à 10:54
===============================================


Constantes typées affectables : l'explication.

En fait, pour que les constantes typées soient affectables il faut aller dans Projet/Options. Dans la fenêtre 'Options du Projet' choisir l'onglet 'compilateur' ; dans 'options de syntaxe', cocher 'Constantes typées affectables'.

Dans ma version 3 de Delphi , c'est cette options qui est cochée alors qu'elle ne l'est pas, par défaut, sous D6 et D7.

On peut aussi au lieu de cocher cette case mettre la directive de compilation dans le code : {$J+}
( sous la ligne {$R *.dfm} ).

Ou plus simplement utiliser une variable globale... (mais pourquoi faire simple quand on peut faire compliqué !).
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
1 nov. 2003 à 11:32
Quelques pistes d'optimisation :
- les variables déclarées dans la partie Interface peuvent l'être dans la partie Implementation. En effet, elles n'ont pas besoin d'être exposées à l'extérieur.
- les variables Year, Month, Day ne sont jamais utilisées.
- la variable Present n'est pas franchement utile et la seule ligne qui l'utilise sera remplacée par :
DecodeTime(Now, Hour, Min, Sec, MSec); //voir méthode AfficheHeure
- dans l'évènement OnTimer de Timer1, il est absolument inutile de désactiver en entrée puis de réactiver en sortie. C'est au reste du code de décider s'il faut activer le timer ou non.
- l'appel à la méthode draw dans l'évènement OnPaint du TPaintBox est doublement inutile. Tu lui demandes de se redessiner une deuxième fois alors qu'il est déjà en route pour celà. D'ailleurs, tu peux supprimer tout le code contenu dans cet évènement.
- Dans DessineCadran, tu testes plusieurs fois la valeur de J alors qu'il n'a pas changé de valeur entre-temps. Suggestion :
if (I mod Xmod = 0) then
begin
J := 1;
Bmp1.Canvas.Pen.Color := clBlue;
Bmp1.Canvas.Pen.Width := 2;
end
else
begin
j := 0;
Bmp1.Canvas.Pen.Color := clBlack;
Bmp1.Canvas.Pen.Width := 1;
end;
Enfin, pour ceux que l'utilisation des constantes typées déroute un tant soit peu, voici une suggestion.
Dans l'évènement OnTimer, pourquoi ne pas utiliser la propriété Tag du composant lui-même puisque, présentement, il ne s'agit que de stocker un entier long :
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DecodeTime(Time, Hour, Min, Sec, MSec);
if Timer1.Tag <> Sec then
begin
Timer1.Tag := Sec;
AfficheHeure;
end;
end;
A la création, la propriété Tag est initialisée à 0.
Peu de monde pense à utiliser cette propriété Tag. C'est bien dommage.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.