Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2791 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VB2005 affichage de 4 chiffres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

VB2005 affichage de 4 chiffres

n°1646102
nimjaben
Posté le 20-11-2007 à 20:28:46  profilanswer
 

Bonjour!
J'aurais besoin d'un petit coup de pouce.
Je suis en DUT GMP et on m'a demandé de créer un algorythme sous VB2005 qui serait un affichage digitale.
J'ai donc créé cela en gros :
_______
|         |
|         |
_______
|         |
|         |
_______
 
J'ai attribué a chacune des barres une couleur suivant le chiffre que l'on rentre.
(ex:pour le 1 il n'y a que celle de droite qui s'allume les autres reste grise)
Mon probléme est le suivant, on me demande de faire la même chose mais avec 4 chiffres.Ma méthode n'est plus applicable car cela me ferait rentrer 9999 combinaisons différentes
C'est pou quoi j'aimerais savoir si vous auriez une astuce


Message édité par nimjaben le 20-11-2007 à 20:54:27

---------------
Feed-Back
mood
Publicité
Posté le 20-11-2007 à 20:28:46  profilanswer
 

n°1646264
tegu
Posté le 21-11-2007 à 09:39:21  profilanswer
 

Je ne suis pas sûr d'avoir compris ton problème, mais tu peux coder tes barres de manière binaire (0=éteinte, 1=allumée).
Vu qu'un chiffre est composé de 7 barres, tu peux le coder sur un octet.
Le fait d'avoir 4 chiffres nécessitera donc 4 octets.
Est-ce que ça t'aide ?

n°1646292
MagicBuzz
Posté le 21-11-2007 à 10:14:05  profilanswer
 

++ Je vois pas trop où ça bloque...
 
Tu traîtes chaque chiffre de ton nombre un à un (si tu sais pas faire un modulo et une division par 10, tu peux toujours passer par une chaîne de caractères)... Après que t'aie 1 chiffre ou 25000, ça changera rien à ton algo...

n°1646346
nimjaben
Posté le 21-11-2007 à 10:34:48  profilanswer
 

Je ne suis qu'un débutant sur Visual Basic.
Mon probléme est le suivant, si j'écrit 2054, mon affichage digitale ne saura pas a quel digit il doit attribuer chaque chiffre.
Je vais essayer de voir vos proposition mais je n'ai pas tout compris


---------------
Feed-Back
n°1646567
nimjaben
Posté le 21-11-2007 à 14:45:37  profilanswer
 

up!!


---------------
Feed-Back
n°1646571
MagicBuzz
Posté le 21-11-2007 à 14:47:21  profilanswer
 

Ben explique ton problème, parceque y'a rien de plus à dire par rapport à ce que tu nous a dit de ton problème...
 
Pis là c'est pas un souci de VB2005 spécifiquement, mais de l'algo pur et dur...
 
Parcourir chaque chiffre d'un nombre dans une boucle c quand même pas la fin du monde :o

n°1646590
tegu
Posté le 21-11-2007 à 14:57:45  profilanswer
 

En quoi ton affichage digital devrait « savoir » quoi que ce soit ?
Que je sache, en programmation c'est le codeur qui décide.

 

Là je te propose de coder 2054 par une suite de 4 octets (1 par chiffre pour faire simple)
Chaque bit d'un octet correspond à l'activation ou non d'une de tes barres.

 

Il suffit de convenir de l'ordre des barres par rapport à l'ordre des bits pour en faire une représentation graphique.
Par exemple 0010010 correspondrait à 1, suivant l'ordre :
vertical haut gauche, horizontal haut centre, vertical haut droit, vertical bas gauche, horizontal milieu, vertical bas droit, horizontal bas centre
Avec ce même ordre (et sauf erreur de ma part) on aurait 2 codé par 0111101
Évidemment pour le 8e bit de ton octet, tu choisis conventionnellement de mettre, soit 0, soit 1.
ps: ça n'est qu'une manière de faire parmi d'autres.


Message édité par tegu le 21-11-2007 à 14:58:21
n°1646610
nimjaben
Posté le 21-11-2007 à 15:14:37  profilanswer
 

Ok je comprends ce que tu veux dire pour coder 1 (0010010) mais pour coder 2054 par exemple comment vais-je pouvoir faire?
En faite mon programme est le suivant: une personne rentre un nombre de 4 chiffres maximum et l'algorithme doit permettre d'afficher se nombre.


---------------
Feed-Back
n°1646615
nimjaben
Posté le 21-11-2007 à 15:28:06  profilanswer
 

On m'a conseillé d'utiliser la fonction MID et Len..j'ai cherché dans l'aide de VB mais j'ai du mal a comprendre


---------------
Feed-Back
n°1646646
MagicBuzz
Posté le 21-11-2007 à 16:02:36  profilanswer
 

Grrrrr !
 
TU N'AS PAS A CODER 2054 :o
 
La base de ton afficheur, c'est UN ET UN SEUL CHIFFRE qu'elle affiche.
 
Donc tu gères un et un seul chiffre à la fois.
 
Sauf que tu gères chacun des 4 chiffres l'un après l'autre.
 
En gros, actuellement, ton programme c'est :
 
Sasir un chiffre
Dessiner le chiffre
 
Maintenant ça devient
 
Saisir un nombre
Pour chaque chiffre du nombre
   Dessiner le chiffre
   Se décaller sur la droite de la largeur d'un chiffre
Fin pour
 
Spa compliqué...
 
t'as toujours qu'un et un seul chiffre à gérer :spamafote:
Même mieux, tu gardes ce que t'as fait, t'as juste à l'encapsuler dans une boucle, et gérer un décallage lors du dessin... C'est pas la mort quand même :o


Message édité par MagicBuzz le 21-11-2007 à 16:03:46
mood
Publicité
Posté le 21-11-2007 à 16:02:36  profilanswer
 

n°1647034
MagicBuzz
Posté le 22-11-2007 à 10:25:50  profilanswer
 

Illustration :o
 
http://img515.imageshack.us/img515/105/digitalxh8.png
 
Obtenu simplement comme ça :

Code :
  1. private void button1_Click(object sender, EventArgs e)
  2.        {
  3.            flowLayoutPanel1.Controls.Clear();
  4.  
  5.            for (int i = 0, cpti = maskedTextBox1.Text.Length; i < cpti; i++)
  6.            {
  7.                Digital d = new Digital();
  8.                d.SuspendLayout();
  9.                d.Height = flowLayoutPanel1.Height;
  10.                d.Width = d.Height / 2;
  11.                d.IntDigit = int.Parse(maskedTextBox1.Text.Substring(i, 1));
  12.                d.LedWidth = 4f;
  13.                d.OnColor = Color.Lime;
  14.                d.OffColor = Color.DarkGreen;
  15.                d.BackColor = Color.Black;
  16.                d.Lighted = true;
  17.                flowLayoutPanel1.Controls.Add(d);
  18.                d.ResumeLayout();
  19.            }
  20.        }


 
Digital est un petit contrôle que j'ai codé en vitesse histoire de faire l'exemple.
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace DigitalClock
  10. {
  11.    public partial class Digital : UserControl
  12.    {
  13.        public enum Digits
  14.        {
  15.            Zero = 119,
  16.            One = 20,
  17.            Two = 59,
  18.            Three = 62,
  19.            Four = 92,
  20.            Five = 110,
  21.            Six = 111,
  22.            Seven = 52,
  23.            Eight = 127,
  24.            Nine = 126
  25.        }
  26.  
  27.        private int digit = 128;
  28.        private Color onColor = Color.LightGreen;
  29.        private Color offColor = Color.DarkGreen;
  30.        private float ledWidth = 1f;
  31.        private bool canDraw = true;
  32.  
  33.        public Color OnColor
  34.        {
  35.            get
  36.            {
  37.                return onColor;
  38.            }
  39.            set
  40.            {
  41.                onColor = value;
  42.                Render();
  43.            }
  44.        }
  45.        public Color OffColor
  46.        {
  47.            get
  48.            {
  49.                return offColor;
  50.            }
  51.            set
  52.            {
  53.                offColor = value;
  54.                Render();
  55.            }
  56.        }
  57.        public float LedWidth
  58.        {
  59.            get
  60.            {
  61.                return ledWidth;
  62.            }
  63.            set
  64.            {
  65.                ledWidth = value;
  66.                Refresh();
  67.            }
  68.        }
  69.  
  70.        public new void SuspendLayout()
  71.        {
  72.            canDraw = false;
  73.        }
  74.  
  75.        public new void ResumeLayout()
  76.        {
  77.            canDraw = true;
  78.            Refresh();
  79.        }
  80.  
  81.        public Digital()
  82.        {
  83.            this.Digit = Digits.Zero;
  84.            this.Lighted = false;
  85.        }
  86.  
  87.        protected override void OnPaint(PaintEventArgs e)
  88.        {
  89.            Render();
  90.            base.OnPaint(e);
  91.        }
  92.  
  93.        protected override void OnBackColorChanged(EventArgs e)
  94.        {
  95.            Render();
  96.            base.OnBackColorChanged(e);
  97.        }
  98.  
  99.        private void Render()
  100.        {
  101.            if (!canDraw) return;
  102.  
  103.            Graphics g = CreateGraphics();
  104.            g.Clear(BackColor);
  105.  
  106.            Pen pon = new Pen(onColor, ledWidth);
  107.            Pen poff = new Pen(offColor, ledWidth);
  108.  
  109.            g.DrawLine(((digit & 128) == 0 || (digit & 64) == 0) ? poff : pon, ledWidth / 2f, ledWidth / 2f, ledWidth / 2f, (float)Height / 2f);
  110.            g.DrawLine(((digit & 128) == 0 || (digit & 32) == 0) ? poff : pon, ledWidth / 2f, ledWidth / 2f, (float)Width - ledWidth, ledWidth / 2f);
  111.            g.DrawLine(((digit & 128) == 0 || (digit & 16) == 0) ? poff : pon, (float)Width - ledWidth, ledWidth / 2f, (float)Width - ledWidth, (float)Height / 2f);
  112.            g.DrawLine(((digit & 128) == 0 || (digit & 8) == 0) ? poff : pon, ledWidth / 2f, (float)Height / 2f, (float)Width - ledWidth, (float)Height / 2f);
  113.            g.DrawLine(((digit & 128) == 0 || (digit & 4) == 0) ? poff : pon, (float)Width - ledWidth, (float)Height / 2f, (float)Width - ledWidth, (float)Height - ledWidth);
  114.            g.DrawLine(((digit & 128) == 0 || (digit & 2) == 0) ? poff : pon, ledWidth / 2f, (float)Height - ledWidth, (float)Width - ledWidth, (float)Height - ledWidth);
  115.            g.DrawLine(((digit & 128) == 0 || (digit & 1) == 0) ? poff : pon, ledWidth / 2f, (float)Height / 2f, ledWidth / 2f, (float)Height - ledWidth);
  116.        }
  117.  
  118.        public Digits Digit
  119.        {
  120.            get
  121.            {
  122.                return (Digits)(digit & 127);
  123.            }
  124.            set
  125.            {
  126.                digit &= 128 + (int)value;
  127.                this.Refresh();
  128.            }
  129.        }
  130.  
  131.        public int IntDigit
  132.        {
  133.            set
  134.            {
  135.                if (value > 9 || value < 0)
  136.                {
  137.                    throw new Exception(string.Format("{0} is not a digit", value));
  138.                }
  139.                switch (value)
  140.                {
  141.                    case 0:
  142.                        digit = (int)Digits.Zero;
  143.                        break;
  144.                    case 1:
  145.                        digit = (int)Digits.One;
  146.                        break;
  147.                    case 2:
  148.                        digit = (int)Digits.Two;
  149.                        break;
  150.                    case 3:
  151.                        digit = (int)Digits.Three;
  152.                        break;
  153.                    case 4:
  154.                        digit = (int)Digits.Four;
  155.                        break;
  156.                    case 5:
  157.                        digit = (int)Digits.Five;
  158.                        break;
  159.                    case 6:
  160.                        digit = (int)Digits.Six;
  161.                        break;
  162.                    case 7:
  163.                        digit = (int)Digits.Seven;
  164.                        break;
  165.                    case 8:
  166.                        digit = (int)Digits.Eight;
  167.                        break;
  168.                    case 9:
  169.                        digit = (int)Digits.Nine;
  170.                        break;
  171.                    default:
  172.                        throw new Exception(string.Format("Unexpected exception! The digit {0} is not reconized!", value));
  173.                }
  174.                this.Refresh();
  175.            }
  176.            get
  177.            {
  178.                switch (Digit)
  179.                {
  180.                    case Digits.Zero:
  181.                        return 0;
  182.                    case Digits.One:
  183.                        return 1;
  184.                    case Digits.Two:
  185.                        return 2;
  186.                    case Digits.Three:
  187.                        return 3;
  188.                    case Digits.Four:
  189.                        return 4;
  190.                    case Digits.Five:
  191.                        return 5;
  192.                    case Digits.Six:
  193.                        return 6;
  194.                    case Digits.Seven:
  195.                        return 7;
  196.                    case Digits.Eight:
  197.                        return 8;
  198.                    case Digits.Nine:
  199.                        return 9;
  200.                    default:
  201.                        throw new Exception(string.Format("Unexpected exception! The internal digit representation {0} is not reconized!", digit));
  202.                }
  203.            }
  204.        }
  205.  
  206.        public bool Lighted
  207.        {
  208.            get
  209.            {
  210.                if ((digit & 128) > 0)
  211.                {
  212.                    return true;
  213.                }
  214.                else
  215.                {
  216.                    return false;
  217.                }
  218.            }
  219.            set
  220.            {
  221.                if (value)
  222.                {
  223.                    digit |= 128;
  224.                }
  225.                else
  226.                {
  227.                    digit &= 127;
  228.                }
  229.                this.Refresh();
  230.            }
  231.        }
  232.    }
  233. }


 
Maintenant, vu comme t'as l'air fluent, pas de pot c'est loin d'être une solution toute faite pour toi... Déjà c'est pas le même langage, mais surtout vu le niveau que t'as, si tu sors le code de ma classe à ton prof t'es grillé direct :p


Message édité par MagicBuzz le 22-11-2007 à 10:32:25
n°1647038
MagicBuzz
Posté le 22-11-2007 à 10:31:11  profilanswer
 

D'autant qu'en relisant, je me rend compte qu'il y a un mega bug dans mes accesseurs de la propriété "IntDigit" :D

n°1647134
nimjaben
Posté le 22-11-2007 à 12:55:34  profilanswer
 

Oui et puis c'était hier :D
J'ai réussi en utilisant la fonction Mid
i=Mid(text_z,4,1)
j=Mid(text_z,3,1)
etc
J'ai donc décomposé le nombre ce qui m'a permis de tout afficher correctement :)
Merci quand même pour ton aide MagicBuzz


---------------
Feed-Back
n°1649855
erwan83
Du Shift DEL tu te méfieras !
Posté le 27-11-2007 à 19:53:35  profilanswer
 

sinon
if nombre > 999 then goto routine_1000
if nombre > 99 and nombre < 1000 then goto routine_100
if nombre > 9 and nombre < 100 then goto routine_10
if nombre < 10 then goto routine_1
 
Routine_1000
Dim milliers, centaines, dizaines,unites, reste as integer
 
'on sait qu'on a forcement affaire à un nombre de 4 chiffres
 
' ici j'extraie le nombre representant les milliers
milliers = int(nombre/1000)
 
' ici je le soustraie au nombre initial
reste = nombre - milliers * 1000  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_100
'ici j'extraie le nombre representant les centaines
centaines = int(reste/100)
 
' ici je le soustraie au nombre initial
reste = nombre - centaines * 100  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_10
' ici j'extraie le nombre representant les dizaines
dizaines = int(reste/10)
 
' ici je le soustraie au nombre initial
reste = nombre - dizaines * 10  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_1
'ici il ne me reste plus que les unités
unites = reste
 
'voila comme ça tu as tous les chiffres composant ton nombre
 
ensuite tu peux ecrire :
 
if notisnull(milliers) then goto FonctionAffichageDuChiffreDesMilliers
if isnull((milliers) and not isnull(centaines) then goto FonctionAffichageDuChiffreDesCentaines
if isnull((centaines) and not isnull(dizaines) then goto FonctionAffichageDuChiffreDesDizaines
if isnull((centaines) and not isnull(unites) then goto FonctionAffichageDuChiffreDesUnites
 
ensuite tu crées tes fonctions indiquées ci dessous, tu n'a plus qu'à coder une "ligne" pour l'affichage de chaque chiffre pour les milliers, une ligne pour l'affichage de chaque chiffre des centaines etc etc ... unités
10 possibilités d'affichage mais :  
 
quand tu veux afficher tes nombres à quatre chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesMilliers
FonctionAffichageDuChiffreDesCentaines
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à trois chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesCentaines
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à deux chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à un chiffre, tu devas appeler la fonction suivante :  
FonctionAffichageDuChiffreDesUnités
 
Voila voila voila, j'espère avoir aidé un peu...


---------------
http://www.ypikay.com
n°1649860
MagicBuzz
Posté le 27-11-2007 à 20:03:35  profilanswer
 

ouais enfin là t'as un 0 pointé direct j'espère :o

n°1650504
erwan83
Du Shift DEL tu te méfieras !
Posté le 28-11-2007 à 18:35:13  profilanswer
 

ben quoi ?


---------------
http://www.ypikay.com
n°1650514
MagicBuzz
Posté le 28-11-2007 à 18:59:53  profilanswer
 

des goto toutes les deux lignes
et aucune refactorisation du code...
 
 
FonctionAffichageDuChiffreDesMilliers  
FonctionAffichageDuChiffreDesCentaines  
FonctionAffichageDuChiffreDesDizaines  
FonctionAffichageDuChiffreDesUnités  
 
=> 4 fonctions, 4 fois rigoureusement le même code (y'a au max une ligne de déclaration qui diffère)
 
et une série de tests inutiles en début de code (plus exactement, qui sont redondants)

n°1650515
MagicBuzz
Posté le 28-11-2007 à 19:02:29  profilanswer
 

Pour résumé, tout ton paté est compressible en ça :
 

Code :
  1. for (int i = 0, cpti = maskedTextBox1.Text.Length; i < cpti; i++)
  2.            {
  3.                        DisplayDigit(maskedTextBox1.Substr(i, 0), i);
  4.            }


 
(cf mon code, sauf qu'au lieu de passer par une fonction, j'instancie un contrôle qui fait le rendu)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VB2005 affichage de 4 chiffres

 

Sujets relatifs
Affichage Requête 2 tablesHTML (?) - Probleme affichage texte trop large.
Forcer le téléchargement d'un fichier vidéo sans affichage WMPaffichage de photo
énorme espace en début d'affichage[AJAX] Problème pour affichage de l'heure
Erreur affichage page par page...Affichage lors du passage de la souri
texbox listox access ado probleme d'affichageaffichage dynamique d'un contenu de dossier
Plus de sujets relatifs à : VB2005 affichage de 4 chiffres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR