UNE HORLOGE À AIGUILLES, TOUTE SIMPLE (DELPHI).

yoghisan Messages postés 204 Date d'inscription samedi 10 mai 2003 Statut Membre Dernière intervention 2 juin 2005 - 1 nov. 2003 à 01:03
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013 - 22 févr. 2004 à 12:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/17580-une-horloge-a-aiguilles-toute-simple-delphi

jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
22 févr. 2004 à 12:51
Merci :)

Pour obtenir la fenêtre sans bouton réduire et sans bouton agrandir, telle qu'elle est dans le programme, j'ai mis la propriété BorderStyle de la Form sur bsToolWindow (dans l'inspecteur d'objets accessible par F11). C'est un mauvais exemple (mea culpa), car les fenêtres de ce style sont destinées à être des fenêtres secondaires et n'apparaissent pas dans la barre des tâches de certaines versions de Windows, ce qui est logique...
La bonne méthode, dans le contexte du programme, est de mettre la propriété BorderStyle sur bsSingle pour obtenir une fenêtre non redimensionnable. Ensuite, dans la propriété BordersIcons (cliquer sur + pour développer les options) mettre biMinimize sur false et biMaximize sur false.
Bonne remarque qui fait avancer le Smilbick...
cs_gamez Messages postés 34 Date d'inscription samedi 14 juin 2003 Statut Membre Dernière intervention 27 janvier 2007
21 févr. 2004 à 15:33
salut

comment tu fais pour garder que le bouton "fermer" en haut à droite et enlever les boutons minimiser et maximiser?

merci

ps: bo boulot :)
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
5 nov. 2003 à 23:27
===============================================

Corrigé dans nouvelle version du : 05/11/2003.
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
4 nov. 2003 à 18:59
===============================================
//Remarque
//Affichage des heures : calcul des quatre points de traçage de l'aiguille des heures.
//il y a :

X:=Round(sin(2*Pi*(Valheur1 Mod 60)/60)*(R-20));

//je crois que

X:=Round(sin(2*Pi*Valheur1 / 60)*(R-20)); // est suffisant... ça ne change rien aux résultats des calculs, mais c'est inutile.


//Même remarque pour les 7 lignes qui suivent...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 nov. 2003 à 18:42
Merci jbsoulet d'avoir répondu à la question de yoghisan. C'est tout à fait celà.
J'évoquais, bien entendu, les règles de portée.
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
2 nov. 2003 à 12:59
===============================================

Pour yoghisan :

- J'ai travaillé avec une Tpaintbox parce que dessiner directement les aiguilles sur une Timage crée un effet de scintillements qui est à peine visible sous XP (mais flagrant sous Win 95 : à l'époque la vitesse des processeurs était plus lente... et comme j'ai les deux configurations).

- Quand on parle de "variables accessibles à l'extérieur" (partie Interface), je pense qu'il s'agit de variables que l'on peut partager avec les autres unités d'un même projet, par opposition aux variables déclarées dans la partie Implementation qui ne sont accessibles que dans la seule l'unité où elles ont été déclarées (que quelqu'un rectifie si je me trompe...)

- En ce qui concerne la question sur ton logiciel, je n'ai pas d'idée dans l'immédiat, mais si une idée me vient...

jbsoulet
yoghisan Messages postés 204 Date d'inscription samedi 10 mai 2003 Statut Membre Dernière intervention 2 juin 2005 1
2 nov. 2003 à 02:27
===============================================

Pour jbsoulet :
- Pourquoi travailler avec un tpaintbox et non pas directement dans le canevas d'un timage, ca éviterait ce problème de passage de fenêtre ? Je me suis déjà posé la question, j'aurai du la poser avant sur le forum.

Pour Delphiprog :
- 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.
Ha oui, c'est intéressant ca. Tu peux m'expliquer comment peut-on recupérer les variables accessibles à l'extérieur. Personnellement, j'ai devellopé un petit logiciel qui mémorise les cartes jouées sur la dame de pique sur yahoo. Le problème c'est que je dois cliquer les cartes posées (ce qui m'enleve de la concentration et donc de la lucidité sur le jeu) alors si je pouvais directement recupérer des variables, ca pourrait etre beaucoup plus interessant.

Merci pour vos reponses qui m'ont enrichi.

Yoghi
jbsoulet Messages postés 23 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 10 novembre 2013
1 nov. 2003 à 18:30
================================================

Merci pour toutes ces remarques très judicieuses : çà permet de voir les choses avec un peu de recul.

C'est vrai que l'on oublie souvent la propriété Tag qui est très utile (il m'est arrivé de l'utiliser dans d'autres applications et çà m'a permis d'alléger le code...)
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:35
Ciel, j'ai oublié de dire :
1/ le résultat est magnifique.
2/ A quand la transformation sous forme de composant visuel réutilisable ?
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.
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é !).
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 à 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...
yoghisan Messages postés 204 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.
Rejoignez-nous