HORLOGE À AFFICHAGE DIGITAL AVEC UTILISATION D'IMAGES BMP
kanuxxx
Messages postés11Date d'inscriptionlundi 8 novembre 2004StatutMembreDernière intervention 3 septembre 2005
-
12 mars 2005 à 23:28
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021
-
17 mars 2005 à 23:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 17 mars 2005 à 23:57
Jappe, je sais c'est le bleme que-ce que ca bouffe en ressources OnIdle ;o))
Trops dur de gerer tt ca..., c encore pire que les threads, puis le multithread ca plante, pis arf c trops dur la prog delphi, puis y à jamais d'astuces ;o))
puis delphi il est gourmand en ram, puis delphi il est po performant, puis delphi il fais des gos exe, puis delphi c'est pas pro, na ! ;o))
allez, Bon Coding a tous ..
ManChesTer.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 17 mars 2005 à 01:45
Salut, Caribensila !
Merci pour ton appréciation... :-)
Comme quoi y'a quand même moyen d'y glaner un ou deux trucs intéressants, dans ce code, quoi... ;-)
J'ai moi même appris pas mal en le faisant, et les commentaires concernant la consommation en ressources m'ont grandement sensibilisé au problème.
Avant de coller un Timer n'importe-où pour une raison futile, j'y réfléchirai à deux fois !
Cette fois, j'y vais... (me coucher, pour ceux qui me liraient demain matin)
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 17 mars 2005 à 01:33
Salut à tous !
Il est un peu tard pour faire une réponse à chacun.
Je vais donc céder à la procrastination, comme on dit chez Ernest Antoine (enfin, j'imagine...). Bref, je remets à plus tard, comme on dit chez moi.
En gros, je suis quasiment d'accord avec vos commentaires.
Le reproche principal que l'on peut faire à ma pendule, c'est de consommer trop de ressources processeur. Surtout pour un petit bout de machin pas bien gros, et qui ne fait en définitive qu'afficher l'heure, lol !
J'ai optimisé un maximum mon code (je posterai le plus tôt possible), sans trahir le concept de départ, qui était :
- afficher l'heure en me servant d'images, afin d'imiter au plus près l'affichage "digital" de nos chers réveille-matin,
- écouler mon stock de bmp faits sous P.t.Shop et dont je ne savais que faire. Faire un peu de ménage, quoi...
Je sais que le prix à payer est lourd pour nos pauvres CPU, mais n'est ce pas l'occasion d'en changer, tiens, justement ?
Sérieusement, il n'y a pas 36 manières d'économiser les ressources, à moins de :
- régler Timer.Interval autour de 1000, un poil en dessous c'est mieux (OK avec toi grandvizir), mais l'affichage des secondes n'est plus régulier, et ça ne me plait pas;
- supprimer l'affichage des secondes... :( ça me fait de la peine, mais c'est forcément la solution la plus efficace, vu que le Timer, dans ces conditions, on va pas le surmener.
Sinon, en mettant les bmp dans une TListImage, j'ai vu qu'on économisait un peu là aussi.
En définitive, dans la dernière évolution, j'ai opté pour la TListImage.
J'ai également optimisé l'affichage : les images ne sont réaffichées que quand c'est nécessaire, et non plus systématiquement à chaque changement des secondes. J'ai laissé l'intervalle du Timer à 10, mais on peut aller jusqu'à 99 sans trop nuire au rythme.
Je n'irai pas plus loin dans les concessions, car j'agis là essentiellement par commisération pour vos pauvres petits CPU asthmatiques, et n'ayant par ailleurs aucune action chez Intel ou AMD...
> Mon bon Kenavo, je n'avais pourtant pas l'intention d'être désagréable avec toi, mais vois-tu, dans certaines circonstances (tu n'aimes pas, hein, tu sens que ça va pas te plaire...) dans certaines circonstances disais-je, vois-tu... heu comment l'exprimer... je me permets de ne pas partager complètement ton point de vue. Excuse-moi pour la brutalité de mon propos, mais bon... une police de caractère, je trouve que ça le fait pas.
Et puis c'est pourtant vrai que dans mes moments de doute existentiel, j'ai plus confiance dans le hardware que dans mes softs. Dans ces moments là, je me raccroche à l'affichage de mon réveille-matin qui ne m'a jamais trahi (la réciproque ne s'applique pas forcément). A bon entendeur... ;-)
> Mauricio, puisque tu es d'accord avec Kenavo, et bien même réponse. Une font, vectorielle ou pas, c'est moins joli que ce qu'on peut obtenir avec une image. Et puis qu'est-ce que j'en fais de mes bmp, alors ? Même en solde, qui en voudrait...
> grandvizir, faudrait te moderniser, et passer à Delphi 4 et Windows millenium. J'ai entendu dire qu'ils allaient bientôt sortir D5 et Win 2000. Je te taquine ;o) ...Je fonctionne toujours sous 98, et j'aime pas XP >:(
> ManChesTer, merci pour ton exemple d'utilisation de OnIdle. Mais qu'est ce que ça bouffe comme ressource CPU quand c'est à false, lol !
Bon, et bien finalement, je crois que j'ai répondu à tout le monde. On bavarde, on voit plus le temps passer...
A plus pour la mise à jour du code, bonne prog' :p
japee
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 17 mars 2005 à 01:04
Juste pour dire que je mets un 10/10 pour ce source et ses commentaires de pros qui m'apprennent bcp. Le 6/10 actuel me semble trop injuste. C'est la 1ère fois que je note, mais c'est de bon coeur. Bravo et merci à tous!
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 16 mars 2005 à 14:46
Malheureusement chui d' accord avec Kenavo.
Surtout que les fonts sont en vecteur, donc on ne perd pas en bo T quel que soit la taille !
Mais pour ta défense, on dira qu' on a pas besoin d' installer de fonte dans le système ... houai, ça le fait pas : (
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDernière intervention 2 juin 2006 16 mars 2005 à 13:42
japee,
Merci pour l'info du PopupMenu.
On peut faire beaucoup de chose avec les propriétés et les événements mais je n’ai pas encore le réflexe de les utiliser. J’ai encore le turbo pascal en tête.
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 16 mars 2005 à 13:14
Un ptit exemple pour onIdle pour ceux qui ne savent pas comment l'implanter:
procedure TForm1.MontreEnCaption(Sender: TObject;var Done: Boolean);
begin
Caption:=TimeTostr(now); // metre l'heure dans le caption du form
Done:=False; // comme onidle n'est appelé qu'1x par event wm_idle, on répond que
// le traitement n'est pas fini comme ca ondile est relancé
// continuellement tant que l'appli ne fais rien...
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnIdle:=MontreEnCaption;
end;
Bon Coding...
ManChesTer.
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 16 mars 2005 à 10:31
Mon bon Japee,
C'est pas pour foutre le bordel, mais .... (j'aime bien quand ça commence comme ça !) autant le déplacement de fenêtre avec affichage du contenu me convient, autant l'utilisation de bmp me laisse dubitatif .....
J'ai quand même une petite préférence pour l'utilisation d'une police spécifique (imitation d'afficheur à led). Il est facile d'y changer taille, couleur, style, sans avoir à gérer autant de paquets d'images des chiffres. Imagine une appli type acquisition de données, avec affichages de données en grand et en petit, en rouge en vert et en orange !....
Il est d'ailleurs plutôt amusant de constater que "les gens" ont plus confiance si les mesures sont affichées en imitant les afficheurs 7 segments ou les matrice LCD, plutôt qu'en utilisant n'importe quelle autre police. Sans doute plus de confiance dans le hard que dans le soft !?
Ken@vo
Et pi c'est pas raisonnable de programmer à 23h06 presque 07 !
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 15 mars 2005 à 21:21
Ohé les amis... ne dénigrez pas Delphi 3. Le code de Jappe y passe très largement (c'est d'ailleurs ce qui est plaisant 8). C'est pas parce que 2 ou 3 propriétés ne sont pas reconnues que rien ne marche. On ignore et puis c'est tout. Le seul truc qui fait "bugger" (avec de larges guillemets) est le DoubleBuffered. C'est bien la seule limitation désagréable avec D3 que l'on peut remarquer, car après tout, il y a plus de différences entre D1 et D3, que D3 et D7.
Mais je voulais initialement dire ceci ...: certes DoubleBuffered est utile pour limiter le scintillement, mais il est également inutile de mettre un timer réglé sur 10ms. Ca fait des affichages inutiles, d'autant plus qu'on n'est pas à 1 seconde près. Faut pas non plus mettre Interval=1000, car il y aura toujours un certain décalage lié à WM_Timer pas très régulier si le CPU marche à fond. Donc 900 est potable. Rien ne nous empêche alors de faire une resynchronisation de temps en temps histoire de ne pas avoir un retard de 1 seconde.
OnIdle = WM_IDLE géré par Windows.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 15 mars 2005 à 10:53
Ha oui, j' allais oublier : merci à toi Japee pour l' éloge! Bien que programmeur professionnel, je 'vois' sur ce site d' excelents programmeurs non professionnels, voir bien meilleur que moi alors tu sais ...
Et oui, je suis souvent admiré par certaines sources de programmeurs non pro, mais aussi biensûr par les autres qui doivent l' etre forcement, vu la qualité de leurs sources: DelphiProg/Manchester/Debiars/VBshare e j' en oublie un paquet, je m' en excuse. A+
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 15 mars 2005 à 10:43
Il me semble que le OnIdle se produit lorsque ton appli ne fait rien... Rien à voir donc, dans le cas où tu as une autre grosse appli qui fait ramer ton PC.
D' un autre côté, chui d' accord pour dire que le TTimer est un peu bidon dans son timing (ouai, c' est con pour un timer quand même) lorsque il faut répéter un truc tous les 10eme de secondes, bref à répétition de très courte durée. Mais bon, y a pire: y a qu' à voir le timer du Visual Basic !
Je cherche un moyen de faire une ani OpenGL avec par exemple 30 images/secondes. On a que le TTimer, mais chui pas convaincu. Ce qu' il me faudrait, c' est un moyen d' executer chaque 'frame' en 1/30 de secondes si possible. Sinon, il y aurait un effet de ralentisemment. Il y aurait bien le timer multimedia (voir source de Kenavo). Bon je laisse tomber, chui hors sujet en plus !
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 15 mars 2005 à 00:33
Tiens, "onidle" je ne connaissais pas...
Je suis allé faire un petit tour dans l'aide en ligne, ça a l'air intéressant.
Ben ça va me faire quelques trucs à me mettre sous la dent, mine de rien, tout ça, et du "costaud" >:(
On verra demain, faut faire reposer le processeur (pas celui de la bécane, il est increvable, mais le mien, il faiblit, lol)
A +
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 15 mars 2005 à 00:21
EddiTheHead >
Désolé que Delphi 3 ne connaisse pas Autosize en plus de ne pas connaître les tableaux dynamiques. J'ai moi-même quelques limitations avec D4, on apprend à les contourner...
Il te faut "relier" le PopupMenu que tu as créé au composant ou au Form qui doit l'appeler.
Car tu peux très bien placer plusieurs PopupMenus sur ta fiche, l'un qui sera appelé d'un clic droit sur une ListBox, l'autre depuis un Edit, un autre depuis le Form, etc...
Donc, par exemple, pour que le PopupMenu1 apparaisse après un clic droit sur Form1 :
- tu déposes un TPopupMenu sur Form1,
- tu n'oublies pas de créer au moins un Item, en cliquant sur les 3 points de Items,
- tu mets par exemple '&Quitter' à la propriété Caption,
- tu doubles-clique sur l'évènement OnClick, et tu saisis le code : "Close;",
- dans l'inspecteur d'objets, dans Propriétés de Form1, tu sélectionnes (triangle pointant vers le bas) 'PopupMenu1'.
- c'est tout.
Tu aurais pu également, si tu ne veux pas utiliser l'inspecteur d'objet, dans le cas où tu veux appeler un autre PopupMenu pendant l'exécution du programme par exemple, écrire dans ton code l'instruction :
Form1.PopupMenu := PopupMenu1; // Form1 est éventuellement inutile, selon le contexte...
Bonne prog'
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 15 mars 2005 à 00:17
Merci pour le bon coding,
Je ne pesais pas tellement a tes bitmaps qui "bouffent assez peux", mais j'imaginais l'afficheur taille 800x600 se déplacant sur un ecran 1280x1024 par exemple...., tu imagine la ram que va utiliser l'appli....
Avec 2bmp barres et qq astuces tu peux faire un affichage qui peux changer de taille, bouffer três peux de ressources ram et rapide ;o))
Quand au composant Ttimer, je ne l'utilise plu parce que il n'est pas toujours maitrisable en delphi, je le remplace souvent par le onidle ou un thread...
Re Bon Coding...
ManChesTer.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 14 mars 2005 à 23:59
Argh... tu me me pousses dans mes derniers retranchements, ManChersTer !
J'étais parti pour un petit bout de code peinard, et voilà que tu m'ouvres des perspectives... trop intéressantes.
Je n'avais pas l'intention, au départ, de développer le concept d'un affichage "digital" qui serait économe en ressources machine, mais bon...
Il va falloir que je bosse un peu, si j'ai bien compris, maintenant que tu m'as donné quelques pistes. ;-)
Mais mis à part le timer qui "bouffe" de la ressource, je ne suis pas convaincu que mon array of TBitmap en consomme tant que ça, si ? Etant donné la taille de chaque bitmap...
Bon, je suis pas têtu... (enfin, pas trop... suis qu'à moitié breton).
Merci pour tes suggestion, bon coding toi-même ;-)
japee
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 14 mars 2005 à 23:34
Je trouve que le systeme que tu nous propose est didactique mais plutot dans le mauvais sens...
En effet, ta technique comme l'ecrit Mauricio est tres gourmande en ressources mémoire & cpu, en fait, pour moi, ton code regrouppe presque tout ce qu'il faut eviter.
Déplace la fenetre et regarde les ressouces cpu (surtout si plusieurs applications sont visibles à l'ècran...). Faire un thread a la place du timer pourrais donner un résultat similaire...
Le résultat est beau, mais a quel prix ?
En fait une solution simple consiste a utiliser 2 bitmap pour les barres (une horizontale, une verticale), a l'aide d'un tableau de constant, il est simple de replacer les barres ou il le faut pour chaque chiffre.
supposont le 8
_ = %1 (barre h du haut)
| |=%110 (2 barre v du haut)
|^^ =%100 (1 barre v du haut (celle de gauche))
^^|=%10 (1 barre v du haut (celle de droite))
_ = %1000 (barre h du milieu)
| |=%110000 (2 barre v du bas)
|^^ =%100000 (1 barre v du bas (celle de gauche))
^^|=%10000 (1 barre v du bas (celle de droite))
_ = %1000000 (Barre h du bas)
.=%10000000 (Le point)
(^ correspondant à un vide).
donc 8 peut etre représenté en 7 bits %1111111
idem pour les autres chifres 9 => %1101111 etc...
En testant les bits ca va vite, et ton dessin ne prendras presque pas plus de temps si tu obtimise bien la routine. Par contre il occuperas beaucoups moins d'espace en mémoire....
Jouer sur le modes de copie du canvas permetrait aussi de faire "l'effet d'afficheur" que tu recherche ;o)) srcand, srccopy &co
Sinon, le reste me semble bien codé et le 2/10 qu'un utilisateur cs t'a mis me semble vraiment injustifiè.
Bon Coding...
ManChesTer.
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDernière intervention 2 juin 2006 14 mars 2005 à 23:07
Slt,
Agréable à regarder et code très court, pour apprendre le delphi c'est parfait. J'ai mis 8/10 pour ça.
Je confirme qu'il ne passe pas avec delphi3, connait pas Form1.AutoSize et Form1.OldCreateOrder et l'unité ImgList. Je l'ai testé en delphi6.
Tu dis qu'il s'adresse aux débutant, je me permets de te poser une question de débutant :
le menu "quitter" à l'aide du bouton droit de la souris est un PopupMenu. Comment ouvrir le menu à l'aide de ce bouton? J'ai créé un PopupMenu mais il ne veut pas s'ouvrir.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 14 mars 2005 à 21:52
En fait, Mauricio, il n'y aura toujours qu'un seul array[0..9] of TPicture, quel que soit le nombre de pendules affichées.
Dans une version plus récente de ce source, j'ai remplacé le array[0..9] of TPicture par un array[0..9] of TBitmap. On devrait économiser ainsi au niveau ressources...
Dans une version encore plus récente, le fichier bmp d'origine contient tous les chiffres, à la manière d'un skin de WinAmp. Ils sont ensuite découpés pour être affectés dans un array[0..9] of TBitmap.
Je mettrai à jour quand je serai sûr que ça apporte un plus à ce code.
De même, je vais continuer à étudier la possibilité d'afficher en fonction des 7 "bâtons" qui dessinent les chiffres, en me servant d'une variable booléene.
Pour les lettres, j'y ai pensé, mais c'est plus "raide".
Je vais bien sûr travailler à optimiser ce code, et j'en ferai à terme un composant, c'est sûr. C'était surtout un prétexte à montrer la possibilité d'afficher l'heure de manière graphique, plus quelques astuces.
Bref, ça s'adresse plus aux débutants qu'aux programmeur chevronnés comme toi.
J'apprécie d'autant plus, dans ces conditions, la note que tu m'as attribuée.
Merci pour tes conseils et remarques.
Quand au pauvre naze qui m'a noté 2/10 (ben oui, 8/10, 8/10, 2/10 = 6/10 de moyenne), il aurait dû nous laisser une espèce de commentaire, ça aurait pu nous apprendre quelque chose, ou nous amuser, à défaut. Dommage... et mesquin.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 14 mars 2005 à 18:52
L' utilisation d' images me semble pas trop aproprié.
En fait, la source que tu nous donne là est 100% fonctionnelle mais moi, j' aurais préféré un compo qui dessine sur son canvas les chiffres sans passer par des images pour des questions de resources, tu vois? non? imagine que tu fais un programme qui utilise 10 displays de ce genre. Avec un compo, tu n' auras qu' à changer la propriété caption et voilà! Si tu fais un compo de ton code, tu vas avoir autant de pictures que de compos fois 10 (pour les 10 chiffres) !
En fait, chaque chiffre est composé de 7 batons qu' on dessine ou pas. Donc, on aurait qu' à garder dans une table comment dessiner chaque chiffre (gràce à un bool pour chaque baton).
Je suis sûr que tu en es capable!
En y ajoutant la possibilité d' utiliser les lettres, ce serait carrement le nirvana! Mais là, vaut mieux créer un autre compo, parce que entre majuscules/minuscules/accents et les chiffres, y a du boulot. De plus, faudrait detailler: au lieu d' utiliser 7 batons, faudrait opter pour des pixels!
8/10 pour cette bonne initiative!
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 13 mars 2005 à 05:02
Ok, kanuxxxL, merci pour ton appréciation.
J'ai pas tout lu, mais le reste a l'air sympas ;-)
Sinon, c'est un bon commentaire : 8/10 :))))))
kanuxxx
Messages postés11Date d'inscriptionlundi 8 novembre 2004StatutMembreDernière intervention 3 septembre 2005 12 mars 2005 à 23:28
Salut,
En première critique je dirais que tu n'as pas changé le nom de tes unités/dpr (Project1.dpr c'est pas cool), pourtant dans tes composants tu leur a donner des noms.
Sinon le reste à l'air sympas, le mieux ce serait de pouvoir gérer la transparence, ou laisse l'horloge en arrière plan tout le temps (sur le bureau quoi).
17 mars 2005 à 23:57
Trops dur de gerer tt ca..., c encore pire que les threads, puis le multithread ca plante, pis arf c trops dur la prog delphi, puis y à jamais d'astuces ;o))
puis delphi il est gourmand en ram, puis delphi il est po performant, puis delphi il fais des gos exe, puis delphi c'est pas pro, na ! ;o))
allez, Bon Coding a tous ..
ManChesTer.
17 mars 2005 à 01:45
Merci pour ton appréciation... :-)
Comme quoi y'a quand même moyen d'y glaner un ou deux trucs intéressants, dans ce code, quoi... ;-)
J'ai moi même appris pas mal en le faisant, et les commentaires concernant la consommation en ressources m'ont grandement sensibilisé au problème.
Avant de coller un Timer n'importe-où pour une raison futile, j'y réfléchirai à deux fois !
Cette fois, j'y vais... (me coucher, pour ceux qui me liraient demain matin)
17 mars 2005 à 01:33
Il est un peu tard pour faire une réponse à chacun.
Je vais donc céder à la procrastination, comme on dit chez Ernest Antoine (enfin, j'imagine...). Bref, je remets à plus tard, comme on dit chez moi.
En gros, je suis quasiment d'accord avec vos commentaires.
Le reproche principal que l'on peut faire à ma pendule, c'est de consommer trop de ressources processeur. Surtout pour un petit bout de machin pas bien gros, et qui ne fait en définitive qu'afficher l'heure, lol !
J'ai optimisé un maximum mon code (je posterai le plus tôt possible), sans trahir le concept de départ, qui était :
- afficher l'heure en me servant d'images, afin d'imiter au plus près l'affichage "digital" de nos chers réveille-matin,
- écouler mon stock de bmp faits sous P.t.Shop et dont je ne savais que faire. Faire un peu de ménage, quoi...
Je sais que le prix à payer est lourd pour nos pauvres CPU, mais n'est ce pas l'occasion d'en changer, tiens, justement ?
Sérieusement, il n'y a pas 36 manières d'économiser les ressources, à moins de :
- régler Timer.Interval autour de 1000, un poil en dessous c'est mieux (OK avec toi grandvizir), mais l'affichage des secondes n'est plus régulier, et ça ne me plait pas;
- supprimer l'affichage des secondes... :( ça me fait de la peine, mais c'est forcément la solution la plus efficace, vu que le Timer, dans ces conditions, on va pas le surmener.
Sinon, en mettant les bmp dans une TListImage, j'ai vu qu'on économisait un peu là aussi.
En définitive, dans la dernière évolution, j'ai opté pour la TListImage.
J'ai également optimisé l'affichage : les images ne sont réaffichées que quand c'est nécessaire, et non plus systématiquement à chaque changement des secondes. J'ai laissé l'intervalle du Timer à 10, mais on peut aller jusqu'à 99 sans trop nuire au rythme.
Je n'irai pas plus loin dans les concessions, car j'agis là essentiellement par commisération pour vos pauvres petits CPU asthmatiques, et n'ayant par ailleurs aucune action chez Intel ou AMD...
> Mon bon Kenavo, je n'avais pourtant pas l'intention d'être désagréable avec toi, mais vois-tu, dans certaines circonstances (tu n'aimes pas, hein, tu sens que ça va pas te plaire...) dans certaines circonstances disais-je, vois-tu... heu comment l'exprimer... je me permets de ne pas partager complètement ton point de vue. Excuse-moi pour la brutalité de mon propos, mais bon... une police de caractère, je trouve que ça le fait pas.
Et puis c'est pourtant vrai que dans mes moments de doute existentiel, j'ai plus confiance dans le hardware que dans mes softs. Dans ces moments là, je me raccroche à l'affichage de mon réveille-matin qui ne m'a jamais trahi (la réciproque ne s'applique pas forcément). A bon entendeur... ;-)
> Mauricio, puisque tu es d'accord avec Kenavo, et bien même réponse. Une font, vectorielle ou pas, c'est moins joli que ce qu'on peut obtenir avec une image. Et puis qu'est-ce que j'en fais de mes bmp, alors ? Même en solde, qui en voudrait...
> grandvizir, faudrait te moderniser, et passer à Delphi 4 et Windows millenium. J'ai entendu dire qu'ils allaient bientôt sortir D5 et Win 2000. Je te taquine ;o) ...Je fonctionne toujours sous 98, et j'aime pas XP >:(
> ManChesTer, merci pour ton exemple d'utilisation de OnIdle. Mais qu'est ce que ça bouffe comme ressource CPU quand c'est à false, lol !
Bon, et bien finalement, je crois que j'ai répondu à tout le monde. On bavarde, on voit plus le temps passer...
A plus pour la mise à jour du code, bonne prog' :p
japee
17 mars 2005 à 01:04
16 mars 2005 à 14:46
Surtout que les fonts sont en vecteur, donc on ne perd pas en bo T quel que soit la taille !
Mais pour ta défense, on dira qu' on a pas besoin d' installer de fonte dans le système ... houai, ça le fait pas : (
16 mars 2005 à 13:42
Merci pour l'info du PopupMenu.
On peut faire beaucoup de chose avec les propriétés et les événements mais je n’ai pas encore le réflexe de les utiliser. J’ai encore le turbo pascal en tête.
16 mars 2005 à 13:14
procedure TForm1.MontreEnCaption(Sender: TObject;var Done: Boolean);
begin
Caption:=TimeTostr(now); // metre l'heure dans le caption du form
Done:=False; // comme onidle n'est appelé qu'1x par event wm_idle, on répond que
// le traitement n'est pas fini comme ca ondile est relancé
// continuellement tant que l'appli ne fais rien...
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnIdle:=MontreEnCaption;
end;
Bon Coding...
ManChesTer.
16 mars 2005 à 10:31
C'est pas pour foutre le bordel, mais .... (j'aime bien quand ça commence comme ça !) autant le déplacement de fenêtre avec affichage du contenu me convient, autant l'utilisation de bmp me laisse dubitatif .....
J'ai quand même une petite préférence pour l'utilisation d'une police spécifique (imitation d'afficheur à led). Il est facile d'y changer taille, couleur, style, sans avoir à gérer autant de paquets d'images des chiffres. Imagine une appli type acquisition de données, avec affichages de données en grand et en petit, en rouge en vert et en orange !....
Il est d'ailleurs plutôt amusant de constater que "les gens" ont plus confiance si les mesures sont affichées en imitant les afficheurs 7 segments ou les matrice LCD, plutôt qu'en utilisant n'importe quelle autre police. Sans doute plus de confiance dans le hard que dans le soft !?
Ken@vo
Et pi c'est pas raisonnable de programmer à 23h06 presque 07 !
15 mars 2005 à 21:21
Mais je voulais initialement dire ceci ...: certes DoubleBuffered est utile pour limiter le scintillement, mais il est également inutile de mettre un timer réglé sur 10ms. Ca fait des affichages inutiles, d'autant plus qu'on n'est pas à 1 seconde près. Faut pas non plus mettre Interval=1000, car il y aura toujours un certain décalage lié à WM_Timer pas très régulier si le CPU marche à fond. Donc 900 est potable. Rien ne nous empêche alors de faire une resynchronisation de temps en temps histoire de ne pas avoir un retard de 1 seconde.
OnIdle = WM_IDLE géré par Windows.
15 mars 2005 à 10:53
Et oui, je suis souvent admiré par certaines sources de programmeurs non pro, mais aussi biensûr par les autres qui doivent l' etre forcement, vu la qualité de leurs sources: DelphiProg/Manchester/Debiars/VBshare e j' en oublie un paquet, je m' en excuse. A+
15 mars 2005 à 10:43
D' un autre côté, chui d' accord pour dire que le TTimer est un peu bidon dans son timing (ouai, c' est con pour un timer quand même) lorsque il faut répéter un truc tous les 10eme de secondes, bref à répétition de très courte durée. Mais bon, y a pire: y a qu' à voir le timer du Visual Basic !
Je cherche un moyen de faire une ani OpenGL avec par exemple 30 images/secondes. On a que le TTimer, mais chui pas convaincu. Ce qu' il me faudrait, c' est un moyen d' executer chaque 'frame' en 1/30 de secondes si possible. Sinon, il y aurait un effet de ralentisemment. Il y aurait bien le timer multimedia (voir source de Kenavo). Bon je laisse tomber, chui hors sujet en plus !
15 mars 2005 à 00:33
Je suis allé faire un petit tour dans l'aide en ligne, ça a l'air intéressant.
Ben ça va me faire quelques trucs à me mettre sous la dent, mine de rien, tout ça, et du "costaud" >:(
On verra demain, faut faire reposer le processeur (pas celui de la bécane, il est increvable, mais le mien, il faiblit, lol)
A +
15 mars 2005 à 00:21
Désolé que Delphi 3 ne connaisse pas Autosize en plus de ne pas connaître les tableaux dynamiques. J'ai moi-même quelques limitations avec D4, on apprend à les contourner...
Il te faut "relier" le PopupMenu que tu as créé au composant ou au Form qui doit l'appeler.
Car tu peux très bien placer plusieurs PopupMenus sur ta fiche, l'un qui sera appelé d'un clic droit sur une ListBox, l'autre depuis un Edit, un autre depuis le Form, etc...
Donc, par exemple, pour que le PopupMenu1 apparaisse après un clic droit sur Form1 :
- tu déposes un TPopupMenu sur Form1,
- tu n'oublies pas de créer au moins un Item, en cliquant sur les 3 points de Items,
- tu mets par exemple '&Quitter' à la propriété Caption,
- tu doubles-clique sur l'évènement OnClick, et tu saisis le code : "Close;",
- dans l'inspecteur d'objets, dans Propriétés de Form1, tu sélectionnes (triangle pointant vers le bas) 'PopupMenu1'.
- c'est tout.
Tu aurais pu également, si tu ne veux pas utiliser l'inspecteur d'objet, dans le cas où tu veux appeler un autre PopupMenu pendant l'exécution du programme par exemple, écrire dans ton code l'instruction :
Form1.PopupMenu := PopupMenu1; // Form1 est éventuellement inutile, selon le contexte...
Bonne prog'
15 mars 2005 à 00:17
Je ne pesais pas tellement a tes bitmaps qui "bouffent assez peux", mais j'imaginais l'afficheur taille 800x600 se déplacant sur un ecran 1280x1024 par exemple...., tu imagine la ram que va utiliser l'appli....
Avec 2bmp barres et qq astuces tu peux faire un affichage qui peux changer de taille, bouffer três peux de ressources ram et rapide ;o))
Quand au composant Ttimer, je ne l'utilise plu parce que il n'est pas toujours maitrisable en delphi, je le remplace souvent par le onidle ou un thread...
Re Bon Coding...
ManChesTer.
14 mars 2005 à 23:59
J'étais parti pour un petit bout de code peinard, et voilà que tu m'ouvres des perspectives... trop intéressantes.
Je n'avais pas l'intention, au départ, de développer le concept d'un affichage "digital" qui serait économe en ressources machine, mais bon...
Il va falloir que je bosse un peu, si j'ai bien compris, maintenant que tu m'as donné quelques pistes. ;-)
Mais mis à part le timer qui "bouffe" de la ressource, je ne suis pas convaincu que mon array of TBitmap en consomme tant que ça, si ? Etant donné la taille de chaque bitmap...
Bon, je suis pas têtu... (enfin, pas trop... suis qu'à moitié breton).
Merci pour tes suggestion, bon coding toi-même ;-)
japee
14 mars 2005 à 23:34
En effet, ta technique comme l'ecrit Mauricio est tres gourmande en ressources mémoire & cpu, en fait, pour moi, ton code regrouppe presque tout ce qu'il faut eviter.
Déplace la fenetre et regarde les ressouces cpu (surtout si plusieurs applications sont visibles à l'ècran...). Faire un thread a la place du timer pourrais donner un résultat similaire...
Le résultat est beau, mais a quel prix ?
En fait une solution simple consiste a utiliser 2 bitmap pour les barres (une horizontale, une verticale), a l'aide d'un tableau de constant, il est simple de replacer les barres ou il le faut pour chaque chiffre.
supposont le 8
_ = %1 (barre h du haut)
| |=%110 (2 barre v du haut)
|^^ =%100 (1 barre v du haut (celle de gauche))
^^|=%10 (1 barre v du haut (celle de droite))
_ = %1000 (barre h du milieu)
| |=%110000 (2 barre v du bas)
|^^ =%100000 (1 barre v du bas (celle de gauche))
^^|=%10000 (1 barre v du bas (celle de droite))
_ = %1000000 (Barre h du bas)
.=%10000000 (Le point)
(^ correspondant à un vide).
donc 8 peut etre représenté en 7 bits %1111111
idem pour les autres chifres 9 => %1101111 etc...
En testant les bits ca va vite, et ton dessin ne prendras presque pas plus de temps si tu obtimise bien la routine. Par contre il occuperas beaucoups moins d'espace en mémoire....
Jouer sur le modes de copie du canvas permetrait aussi de faire "l'effet d'afficheur" que tu recherche ;o)) srcand, srccopy &co
Sinon, le reste me semble bien codé et le 2/10 qu'un utilisateur cs t'a mis me semble vraiment injustifiè.
Bon Coding...
ManChesTer.
14 mars 2005 à 23:07
Agréable à regarder et code très court, pour apprendre le delphi c'est parfait. J'ai mis 8/10 pour ça.
Je confirme qu'il ne passe pas avec delphi3, connait pas Form1.AutoSize et Form1.OldCreateOrder et l'unité ImgList. Je l'ai testé en delphi6.
Tu dis qu'il s'adresse aux débutant, je me permets de te poser une question de débutant :
le menu "quitter" à l'aide du bouton droit de la souris est un PopupMenu. Comment ouvrir le menu à l'aide de ce bouton? J'ai créé un PopupMenu mais il ne veut pas s'ouvrir.
14 mars 2005 à 21:52
Dans une version plus récente de ce source, j'ai remplacé le array[0..9] of TPicture par un array[0..9] of TBitmap. On devrait économiser ainsi au niveau ressources...
Dans une version encore plus récente, le fichier bmp d'origine contient tous les chiffres, à la manière d'un skin de WinAmp. Ils sont ensuite découpés pour être affectés dans un array[0..9] of TBitmap.
Je mettrai à jour quand je serai sûr que ça apporte un plus à ce code.
De même, je vais continuer à étudier la possibilité d'afficher en fonction des 7 "bâtons" qui dessinent les chiffres, en me servant d'une variable booléene.
Pour les lettres, j'y ai pensé, mais c'est plus "raide".
Je vais bien sûr travailler à optimiser ce code, et j'en ferai à terme un composant, c'est sûr. C'était surtout un prétexte à montrer la possibilité d'afficher l'heure de manière graphique, plus quelques astuces.
Bref, ça s'adresse plus aux débutants qu'aux programmeur chevronnés comme toi.
J'apprécie d'autant plus, dans ces conditions, la note que tu m'as attribuée.
Merci pour tes conseils et remarques.
Quand au pauvre naze qui m'a noté 2/10 (ben oui, 8/10, 8/10, 2/10 = 6/10 de moyenne), il aurait dû nous laisser une espèce de commentaire, ça aurait pu nous apprendre quelque chose, ou nous amuser, à défaut. Dommage... et mesquin.
14 mars 2005 à 18:52
En fait, la source que tu nous donne là est 100% fonctionnelle mais moi, j' aurais préféré un compo qui dessine sur son canvas les chiffres sans passer par des images pour des questions de resources, tu vois? non? imagine que tu fais un programme qui utilise 10 displays de ce genre. Avec un compo, tu n' auras qu' à changer la propriété caption et voilà! Si tu fais un compo de ton code, tu vas avoir autant de pictures que de compos fois 10 (pour les 10 chiffres) !
En fait, chaque chiffre est composé de 7 batons qu' on dessine ou pas. Donc, on aurait qu' à garder dans une table comment dessiner chaque chiffre (gràce à un bool pour chaque baton).
Je suis sûr que tu en es capable!
En y ajoutant la possibilité d' utiliser les lettres, ce serait carrement le nirvana! Mais là, vaut mieux créer un autre compo, parce que entre majuscules/minuscules/accents et les chiffres, y a du boulot. De plus, faudrait detailler: au lieu d' utiliser 7 batons, faudrait opter pour des pixels!
8/10 pour cette bonne initiative!
13 mars 2005 à 05:02
J'ai pas tout lu, mais le reste a l'air sympas ;-)
Sinon, c'est un bon commentaire : 8/10 :))))))
12 mars 2005 à 23:28
En première critique je dirais que tu n'as pas changé le nom de tes unités/dpr (Project1.dpr c'est pas cool), pourtant dans tes composants tu leur a donner des noms.
Sinon le reste à l'air sympas, le mieux ce serait de pouvoir gérer la transparence, ou laisse l'horloge en arrière plan tout le temps (sur le bureau quoi).
Mais sinon c'est une bonne source ;)