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

  1. #1
    Membre habitué Avatar de CLeBeR
    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
    Points : 188
    Points
    188
    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
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    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
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre habitué Avatar de CLeBeR
    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
    Points : 188
    Points
    188
    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
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  4. #4
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    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).
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Membre habitué Avatar de CLeBeR
    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
    Points : 188
    Points
    188
    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
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    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)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  7. #7
    Membre habitué Avatar de CLeBeR
    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
    Points : 188
    Points
    188
    Par défaut
    Bonjour Sehnsucht & clementmarcotte,
    Merci beaucoup pour ton aide, le problème est résolu ! Pour les heures, effectivement c'était un problème d'interface, la dernière colonne n'était pas visible, elle dépassait du form !
    Voici donc le code pour générer un tableau de textbox :
    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 tab(6, 23) As CheckBox
      Dim x As Integer
            Dim y = 104
            For jour = 0 To tab.GetLength(0) - 1
                x = 187
                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
    Le code pour tester si une case est cochée ou non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Dim Collone As Integer = DateTime.Now.DayOfWeek - 1
            Dim Heure As Integer = DateTime.Now.Hour
     
            If (Now.DayOfWeek = DayOfWeek.Sunday) Then
                Collone = 6
            End If
     
            If tab(Collone, Heure).Checked And InternetDesactive = False Then
                CoupureInternet()
                InternetDesactive = True
            ElseIf tab(Collone, Heure).Checked = False And InternetDesactive = True Then
                RemiseInternet()
                InternetDesactive = False
            End If
    Merci pour l'aide !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

+ 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