IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Décalage tableau de checkbox


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut Décalage tableau de checkbox
    Bonjour,

    Je voudrais couper la connexion internet de mon PC selon les heures, j'utilise un tableau de checkbox. Cependant, tout fonctionne parfaitement, par exemple pour Mardi à 18H00 sauf ... Pour les extrémités c'est à dire Lundi à 00H00, et Dimanche à 23H00 que je n'ai pas encore testé. Quand je change la date de mon PC sur lundi 00H00, le programme m'informe de cette erreur :

    Une exception non gérée du type 'System.IndexOutOfRangeException' s'est produite dans Monprogramme.exe

    Informations supplémentaires : L'index se trouve en dehors des limites du tableau.
    Voici le code que j'utilise pour la génération du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    Dim tab(6, 23) As CheckBox
            Dim x As Integer
            Dim y = 104
            For jour = 0 To tab.GetLength(0) - 1
                x = 216
                For heure = 0 To tab.GetLength(1) - 1
                    x = x + 30
                    tab(jour, heure) = New CheckBox()
                    tab(jour, heure).Left = x
                    tab(jour, heure).Top = y
                    tab(jour, heure).Width = 15
                    Me.Controls.Add(tab(jour, heure))
                Next
                y = y + 35
            Next
        End Sub
    Le code pour la vérification de l'état de connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Dim Colonne As Integer = DateTime.Now.DayOfWeek - 1
            Dim Heure As Integer = DateTime.Now.Hour - 1
     
            If tab(Colonne, Heure).Checked And InternetDesactive = False Then
                CoupureInternet()
                InternetDesactive = True
            ElseIf tab(Colonne, Heure).Checked = False And InternetDesactive = True Then
                RemiseInternet()
                InternetDesactive = False
            End If
     
            If InternetDesactive = True Then
                LabelInternetActive.Text = "Internet activé :" & " Non"
            ElseIf InternetDesactive = False Then
                LabelInternetActive.Text = "Internet activé :" & " Oui"
            End If
    Avez-vous une idée de comment résoudre le problème ?

    Vous pouvez télécharger le projet de test en cliquant ici.
    Cordialement.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    A priori (j'ai un peu lu en diagonale ) le souci viendrait d'ici : Dim Collone As Integer = DateTime.Now.DayOfWeek - 1
    Outre la faute sur colonne (oui je chipote là ) DayOfWeek renvoie déjà une valeur entre 0 et 6 ; donc lui appliquer un -1 décale l'intervalle de -1 jusqu'à 5 ce qui va poser problème dans le cas du -1

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    J'ai rectifié la faute
    Effectivement j'enlève 1 à chaque fois c'est pour que graphiquement, je puisse mettre en colonne tous les jours de la semaine, car il y aurait un décalage si je ne faisais pas cela.
    C'est pour cela qu'il faut gérer je pense les deux extrémités. J'ai pensé à quelque chose de ce genre, mais mes tests n'ont pas été concluants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If tab(Colonne + 1 = 0, Heure).Checked Or tab(Colonne + 1 = 0, Heure + 1 = 0).Checked Or tab(Colonne, Heure + 1 = 0).Checked And InternetDesactive = False Then
    CoupureInternet()
    InternetDesactive = True
    ElseIf tab(Colonne + 1 = 0, Heure).Checked = False Or tab(Colonne + 1 = 0, Heure + 1 = 0).Checked = False Or tab(Colonne, Heure + 1 = 0).Checked = False And InternetDesactive = True Then
    RemiseInternet()
    InternetDesactive = False
    End If

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je pense que tu dois être prudent avec DayOfWeek. Chez-nous, au Canada, et aux États-Unis, malgré la norme ISO, le premier jour de la semaine, donc le jour 0 est le dimanche. Si je me fie à ce que j'ai trouvé dans cette rubrique:

    DayOfWeek, énumération



    Le 0 est pour dimanche. Et, cela pourrait peut-être expliquer ton décalage. J'ai téléchargé ton fichier et je vais le tester pour noir ce que cela donne au Canada.


    L'énumération DayOfWeek représente le jour de la semaine dans les calendriers comptant sept jours par semaine. La valeur des constantes dans cette énumération est comprise entre DayOfWeek.Sunday etDayOfWeek.Saturday.Lorsque la constante est castée en entier, sa valeur est comprise entre zéro (qui indique DayOfWeek.Sunday) et six (qui indiqueDayOfWeek.Saturday).

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Bonjour,
    Nous sommes actuellement Dimanche, il est 12H46 et si je laisse les "-1" dont parlais Sehnsucht à Colonne et Heure, j'obtiens l'erreur :
    Une exception non gérée du type 'System.IndexOutOfRangeException' s'est produite dans TableauCheckbox.exe

    Informations supplémentaires : L'index se trouve en dehors des limites du tableau.
    Je pense que c'est dû au Dimanche car tout fonctionnait jusqu'à présent. En revanche, si je les enlève je n'ai plus d'erreur mais il y a ce décalage de 1 jour en trop et 1 heure en trop. Il faut donc actuellement si je veux couper ma connexion que je coche Lundi à 13H00.
    J'ai mis à jour le projet avec un fond pour qu'on puisse mieux s'y retrouver. Je vous propose de le télécharger à nouveau : TableauCheckbox.zip

  6. #6
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Reprenons tout ça:
    Si tu laisse quelque chose de ce style : Dim colonne = Now.DayOfWeek - 1 ; tant que tu es dans un jour compris entre Lundi et Samedi ça va ; en effet DayOfWeek renvoie un nombre compris entre 1 (Monday) et 6 (Saturday) donc colonne est compris entre 0 (Monday - 1) et 5 (Saturday - 1). Le problème survient lorsqu'on est Dimanche ; en effet DayOfWeek renvoie alors 0 (Sunday) et donc colonne vaut -1 (Sunday - 1) ; hors tenter d'accéder à l'indice -1 d'un tableau ça plante (et c'est ce que tu as pour le moment). Ce qu'il faudrait c'est que Sunday renvoie 7 ainsi colonne = (Sunday - 1) renverrait 6 et tout irait bien.
    Donc il faut faire en sorte d'obtenir cela pour cela je vois 2 moyens à peu près équivalent :
    Tester le cas du dimanche et faire un truc spécial : Dim colonne = If(Now.DayOfWeek = DayOfWeek.Sunday, 7, Now.DayOfWeek) - 1 ; ici on donne directement la valeur 7 dans le cas du dimanche, si on garde la valeur normale et on fait notre -1 dans tous les cas
    En faisant un petit calcul dans tous les cas : Dim colonne = (Now.DayOfWeek + 6) Mod 7 ; ici on ajoute 6 (en fait 7 - 1) ce qui nous donne Dimanche = 6, Lundi = 7 ... Samedi = 12 et ensuite on fait un Modulo 7 pour revenir à un nombre compris entre 0 et 6 et on a bien Dimanche = 6, Lundi = 0 ... Samedi = 5
    Les 2 façons sont équivalentes, la première est peut-être plus claire sur l'objectif de différencier le Dimanche, mais duplique l'accès à Now.DayOfWeek ; à choisir selon le goût de chacun.

    Maintenant il y a un autre souci au niveau de l'heure, en effet Now.Hour renvoie toujours un nombre compris entre 0 et 23 ; donc en faisait Dim heure = Now.Hour - 1 on se retrouve avec exactement la même problématique entre 0h et 0h59 à savoir que Hour renvoie alors 0 et heure vaudra (Hour - 1) soit -1 ; donc plantage au niveau du tableau.
    La question là est pourquoi ce -1 à la base étant donné que Hour renvoie entre 0 et 23 et le tableau est indicé également entre 0 et 23 il y a donc un mappage direct entre les deux. Cela a sans à voir avec l'interface, il n'y a pas de colonne pour 0 (et on peut voir une colonne supplémentaire vide sans entête après le 23).

    Moralité si je résume, avec colonne définie par l'une ou l'autre méthode exposée plus haut, et heure définie simplement comme Now.Hour ; je n'ai aucun souci à faire tourner l'application (mis à part le décalage dans l'interface dû à l'absence de colonne pour l'heure 0)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recuperer un tableau de checkbox
    Par jojo22222 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/05/2006, 08h43
  2. Récupérer un tableau de checkbox !
    Par SunSyS dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/02/2006, 14h36
  3. Tableau de checkbox
    Par rdams dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/08/2005, 17h31
  4. récupérer un tableau de checkbox
    Par mr.t dans le forum ASP
    Réponses: 3
    Dernier message: 05/04/2005, 16h11
  5. Style d'une ligne d'un tableau et Checkbox
    Par echecetmat dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/01/2005, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo