Récupérer le jour de la semaine et l'heure

Résolu
Utilisateur anonyme - Modifié par FaonManager le 12/09/2013 à 22:21
 Utilisateur anonyme - 1 sept. 2014 à 00:28
Bonjour,
je voudrais développer une petite application qui coupe internet selon une plage horaire qui à été définie par l'utilisateur. (Faire un truc semblable au contrôle parental de la Freebox.)

http://nsa33.casimages.com/img/2013/09/12/130912102531115594.png

Je pense donc à créer 168 checkbox pour définir la plage horaire.
Je voudrais récupérer le jour de la semaine exemple : Mercredi ainsi que l'heure sans les minutes si possible.
Ainsi je pourrais faire un code du genre :
        Dim Jour As String = Récupération Jour
        Dim Heure As String = Récupération Heure
        If ME18.Checked And Jour = "Mercredi" And Heure = "18" Then
            'Coupure Internet
        End If


Voilà je n'ai trouvé que cette solution, si vous avez mieux merci de me proposer.
Merci.

16 réponses

NHenry
Messages postés
14927
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
162
12 sept. 2013 à 23:12
Regardes le type DateTime, tout est dedans (regardes aussi son ToString).
0
Utilisateur anonyme
12 sept. 2013 à 23:20
Salut,

DateTime.Now.DayOfWeek.ToString et DateTime.Now.Hour.ToString
0
Utilisateur anonyme
21 sept. 2013 à 23:45
Bonjour à tous !
voici la solution que j'ai retenue. J'initialise un tableau de chexbox.
 Dim tab(7, 23) As CheckBox
Dim x
        Dim y = 425
        For jour = 0 To tab.GetLength(0) - 1
            x = -8
            For heure = 0 To tab.GetLength(1) - 1
                x = x + 20
                tab(jour, heure) = New CheckBox()
                tab(jour, heure).Left = x
                tab(jour, heure).Top = y
                tab(jour, heure).Width = 20
                Me.Controls.Add(tab(jour, heure))
            Next
            y = y + 20
        Next


Ensuite il faut tester chaque checkbox pour savoir si le jour et l'heure sont cochés (Voici un exemple pour le lundi à 00h00:
If tab(0, 0).Checked = True And DateTime.Now.DayOfWeek = DayOfWeek.Monday And DateTime.Now.Hour = 0 Then
            CoupureInternet()
            My.Settings.LU0 = True 'Pour retenir que la checkbox est cochée
        Else
            RemiseInternet()
            My.Settings.LU0 = False
        End If


Voilà ! Merci à vous !
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
22 sept. 2013 à 09:10
Salut
c'est plutot

Dim tab(6, 23) As CheckBox
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
22 sept. 2013 à 11:54
Bonjour,
tant de checkboxes = conception à revoir de A à Z , à mon sens !
0
Zermelo
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
14
24 sept. 2013 à 09:48
Bonjour FaonManager.
Malgré l'excellent conseil de ucfoutu, que je salue, vous ne bougez pas. Commencez donc à rédiger un cahier des charges clair, net, et précis, et demandez à une personne de confiance de le relire hors votre présence, puis de vous donner ses commentaires.
Salutations.
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
Modifié par cs_ShayW le 22/09/2013 à 22:38
Salut

evidemment 168 checkboxes ,heureusement que tu n'enregistes
pas les demi heure dans ce cas les checkboxes pousseraient comme des champignons après la pluie LOL

un peu complexe mais possible
tu peux faire ainsi
le tout dans un panel
un combobox avec les jours de la semaine
un CheckedListBox avec 24 heures de choix
un bouton pour valider,un bouton terminer,un bouton modifier

dans un autre panel
afficher les choix

si un item du combo n'a pas été choisi et aussi un/plusieurs item du listbox le bouton valider enabled = false
autrement true
je clique sur valider
il va falloir enregistrer les données dans my.setting
definir une structure de donnée

Private Structure Scheduler
        Public day As String
        Public fromto As String
    End Structure
    Private listscheduler As New List(Of Scheduler)


dans les settings on peut definir le type systemCollections.specialized.StringCollection
s'il n'est pas présent dans la listbox type qui s'ouvre tu as Browse... comme dernier item
clique dessus
dans la liste qui s'ouvre tu as un treeview avec des choix de type
cherche systemCollections.specialized
clique sur le + et choisis stringCollection
ainsi tu as ajouté un nouveau type à ton setting
par ex dans ton setting
name = maliste
type = systemCollections.specialized.StringCollection

pour enregister dans le settings
Private Sub SaveSheduler()
        For Each item As Scheduler In listscheduler
            My.Settings.list.Add(item.day)
            My.Settings.list.Add(item.fromto)
        Next
        My.Settings.Save()
    End Sub


pour écrire dans listscheduler
dans le click event du bouton valider
verifier que le jour et l'heure n'ont pas déja été choisi
si non ajouter à la list listscheduler
maintenant après avoir choisi le jour et l'heure

on peut soit ajouter un autre jour et autre heure
soit cliquer sur terminer
un autre problème qui survient dans le cas ou on veut
modifier ou annuler
un casse tete
je verrais demain
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
24 sept. 2013 à 10:37
Salut

avec un datagridview pour dépanner

 Private listhours As New List(Of String)
 Private Sub BuildListhours()
        Dim hoursstr As String
        For iter As Int32 = 0 To 23
            hoursstr = iter.ToString("D2") & "h:00 - " & (iter + 1).ToString("D2") & "h:00"
            listhours.Add(hoursstr)
        Next
    End Sub

    Private Sub DesignScheduler()
        Dim index, width, height As Integer
        Dim weekday() As String = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"}
        BuildListhours()
        index = 0
        height = 0

        DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
        width = 0
        For col As Integer = 0 To 6
            DataGridView1.Columns.Add("col" & col.ToString, weekday(col))
            DataGridView1.Columns(col).ReadOnly = True
            width += DataGridView1.Columns(col).Width()

        Next

        For Each item As String In listhours
            DataGridView1.Rows.Add()
            DataGridView1.Rows(index).HeaderCell.Value = item
            height += DataGridView1.Rows(index).Height
            index += 1
        Next
        DataGridView1.AllowUserToAddRows = False
        DataGridView1.AllowUserToResizeRows = False
        DataGridView1.AllowUserToResizeColumns = False
        DataGridView1.Width = width + DataGridView1.RowHeadersWidth
        DataGridView1.Height = height
        DataGridView1.Location = New Point(3, 3)
    End Sub

    Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        If e.ColumnIndex < 0 Or e.RowIndex < 0 Then
            Exit Sub
        End If
        DataGridView1.ClearSelection()

        If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.RoyalBlue Then
            DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.White
        Else
            DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.RoyalBlue
        End If

    End Sub
0
Utilisateur anonyme
25 sept. 2013 à 20:48
Très bien merci, je regarderai plus tard.
0
Utilisateur anonyme
27 sept. 2013 à 20:10
Heu... La question initiale demandait juste de récupérer le jour de la semaine et l'heure en cours. Mais j'ai surement mal compris la question ;)

"je regarderai plus tard"
Je comprends bien, tu n'auras que l'embarras du choix pour les réponses. 4 forums de programmation différents pour ta question! Tu n'y vas pas de main morte ;)
0
Utilisateur anonyme
27 sept. 2013 à 20:16
Oui, par contre je pense que je vais faire un combox dans lequel tu choisis l'heure à l'aide de 7 cases, ou autre solution je verrai.
0
Utilisateur anonyme
27 sept. 2013 à 20:24
Le mieux serait un combobox pour les jours et quatre (ou deux) NumericUpDown pour les plages horaires.
0
Utilisateur anonyme
27 sept. 2013 à 21:08
Je suppose que tu auras plusieurs plages horaires dans une même semaine. Le plus simple finalement serait de regrouper ces plages dans un xml par exemple avec tes plages :
<plage>
    <nom>wednesday</nom>
    <debut>16</debut>
    <fin>18</fin>
</plage>
<plage>
     <nom>.wednesday</nom>
     <debut>10</debut>
     <fin>12</fin>
</plage>

Une simple classe comme celle-ci suffirait :
public class clsPlage
    public nom as string
    public debut as integer
    public fin as integer
end class

Enfin, une classe servant de container :
public class clsPlages
    public Plages as new list(of clsplage)
    sub new()
    end sub()
    sub add(element as clsPlage)
         plages.add(element)
    end sub
end class

Pour y insérer des données il te suffira de faire (les noms dans un combo et les heures dans des numericupdown) :
dim Plage1 as new clsPlage with {.nom = "monday", .debut = 15, .fin = 17}
dim Plage2 as new clsPlage with {.nom = "wednesday", .debut = 10, .fin = 12}
dim mesplages as new clsplages
mesplages.add(plage1)
mesplages.add(plage2)

Tu n'auras plus qu'a sérialiser le tout dans un xml :
dim ser as new xml.serialization.xmlserializer(gettype(clsplages))
using flux as new io.streamwriter("monfichier.xml") 
     ser.serialize(flux,mesplages)
end using


Enfin, pour relire ton fichier il faudra le déserialiser :
dim mesplages as new clsplages
dim deser as new xml.serialization.xmlserializer(gettype(clsplages))
using flux as new io.streamreader("monfichier.xml")
     mesplages = ctype(deser.deserialize(flux),clsplages)
end using

Enfin et pour finir, il faudra tester périodiquement qu'au moins un résultat soit retourné pour couper la connexion.
Dim requete As IEnumerable(Of String) = From valeur As clsPlage In mesplages.Plages _
                                                Where valeur.nom = DateTime.Now.DayOfWeek.ToString _
                                                And valeur.debut >= DateTime.Now.Hour _
                                                And valeur.fin <= DateTime.Now.Hour

If requete.Count > 0 Then
      'coupure internet
End If


Bon courage ...
0
Utilisateur anonyme
27 sept. 2013 à 21:14
Un erreur s'est glissée dans mon code, il faut lire :
Dim requete As IEnumerable(Of clsPlage) = ....
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
30 sept. 2013 à 15:01
Salut

voila ce que je propose
1 datagridview avec comme colonnes les jours de la semaine
rangées les heures de 00H à 24H
cellule couleur blanc = internet
cellule couleur bleue = couper
cliquer sur une cellule change de couleur
2 un bouton valider pour écrire dans un fichier xml

le code
 Imports System.IO
  Imports System.Xml.Serialization
  Public Enum week
        sunday
        monday
        tuesday
        wednesday
        thursday
        friday
        saturday
    End Enum

    Public Class Scheduler
        Public dayscheduller As week
        Public hours(23) As Boolean
    End Class

    Private Listscheduler As New List(Of Scheduler)
    Private coloryes As Color = Color.White
    Private colorno As Color = Color.CornflowerBlue
   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 DesignScheduler()
        InitListSheduler()
        LoadSheduler(Application.StartupPath & "SaveScheduler.xml")
        FillSheduller()
        ExecuteScheduler()
   end sub

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'sauvegarder
        SaveScheduler()

    End Sub
    Private Sub BuildListhours()
        Dim hoursstr As String
        For iter As Int32 = 0 To 23
            hoursstr = iter.ToString("D2") & "h:00 - " & (iter + 1).ToString("D2") & "h:00"
            listhours.Add(hoursstr)
        Next
    End Sub

    Private Sub DesignScheduler()
        Dim index, width, height As Integer
        Dim weekday() As String = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"}
        BuildListhours()
        index = 0
        height = 0

        DataGridView2.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
        width = 0
        For col As Integer = 0 To 6
            DataGridView2.Columns.Add("col" & col.ToString, weekday(col))
            DataGridView2.Columns(col).ReadOnly = True
            width += DataGridView2.Columns(col).Width()
        Next

        For Each item As String In listhours
            DataGridView2.Rows.Add()
            DataGridView2.Rows(index).HeaderCell.Value = item
            height += DataGridView2.Rows(index).Height
            index += 1
        Next
        For Each ro As DataGridViewRow In DataGridView2.Rows
            For Each cell As DataGridViewCell In ro.Cells
                cell.Tag = True
            Next
        Next
        DataGridView2.AllowUserToAddRows = False
        DataGridView2.AllowUserToResizeRows = False
        DataGridView2.AllowUserToResizeColumns = False
        DataGridView2.Width = width + DataGridView2.RowHeadersWidth
        DataGridView2.Height = height
        DataGridView2.Location = New Point(3, 3)
        
    End Sub

    Private Sub DataGridView2_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellClick
        If e.ColumnIndex < 0 Or e.RowIndex < 0 Then
            Exit Sub
        End If
        DataGridView2.ClearSelection()

        If DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = colorno Then
            DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = coloryes
            DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = True
        Else
            DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = colorno
            DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = False
        End If

    End Sub
    Private Sub SaveScheduler()

        Dim myFileStream As New StreamWriter(Application.StartupPath & "SaveScheduler.xml")
        For itercol As Integer = 0 To DataGridView2.Columns.Count - 1
            For iterro As Integer = 0 To DataGridView2.Rows.Count - 1
                Listscheduler(itercol).hours(iterro) = DirectCast(DataGridView2.Rows(iterro).Cells(itercol).Tag, Boolean)
            Next
        Next
        Dim serialXML As Xml.Serialization.XmlSerializer = Nothing
        Try
            serialXML = New Xml.Serialization.XmlSerializer(GetType(Collections.Generic.List(Of Scheduler)))
            serialXML.Serialize(myFileStream, Listscheduler)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        myFileStream.Close()
    End Sub
    Private Sub InitListSheduler()
        Dim dayweek As Array
        Listscheduler.Clear()
        dayweek = System.Enum.GetValues(GetType(week))
        For Each item As week In dayweek
            Dim myday As New Scheduler
            myday.dayscheduller = item
            For iter As Integer = 0 To myday.hours.Count - 1
                myday.hours(iter) = True
            Next
            Listscheduler.Add(myday)
        Next
    End Sub

    Private Sub FillSheduller()
        For Each item As Scheduler In Listscheduler
            For iterrow As Integer = 0 To item.hours.Count - 1
                DataGridView2.Rows(iterrow).Cells(item.dayscheduller).Tag = item.hours(iterrow)
                If item.hours(iterrow) Then
                    DataGridView2.Rows(iterrow).Cells(item.dayscheduller).Style.BackColor = coloryes
                Else
                    DataGridView2.Rows(iterrow).Cells(item.dayscheduller).Style.BackColor = colorno
                End If
            Next
        Next
    End Sub
    Private Sub LoadSheduler(ByVal xmlfile As String)
        Dim myFileStream As StreamReader = Nothing
        Dim serialXML As Xml.Serialization.XmlSerializer = Nothing

        Try
            If System.IO.File.Exists(xmlfile) Then
                Listscheduler.Clear()
                serialXML = New Xml.Serialization.XmlSerializer(GetType(Collections.Generic.List(Of Scheduler)))
                myFileStream = New StreamReader(xmlfile)
                Listscheduler = DirectCast(serialXML.Deserialize(myFileStream), Collections.Generic.List(Of Scheduler))
                myFileStream.Close()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


    End Sub

    Private Sub ExecuteScheduler()
 ' bloque ou permet l'internet 
        For Each item As Scheduler In Listscheduler
            If item.dayscheduller = DateTime.Now.DayOfWeek Then
                For iter As Integer = 0 To item.hours.Count - 1
                    If item.hours(iter) And iter = DateTime.Now.Hour Then
                        MessageBox.Show("Play")
                    End If
                    If Not item.hours(iter) And iter = DateTime.Now.Hour Then
                        MessageBox.Show("CUT")
                    End If

                Next
                
            End If
        Next
    End Sub 


ce que je ne comprend pas est ici la sub ExecuteScheduler
permet l'internet selon l'emploi tu temps
je l'ai appelé une fois dans le load event
mais il va falloir l'appeller toute les heures
0
Utilisateur anonyme
8 oct. 2013 à 21:47
Merci pour vos réponses, je n'ai pas encore lancé la bêta de mon programme, j'attends l'avis des utilisateurs pour voir si je modifier mes 168 checkbox !
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
8 oct. 2013 à 21:58
Tu devrais lancé la beta et ne pas faire peur (lol) à l'utilisateur avec 168 checkbox
mets toi à la place de l'utilisateur qui voit afficher 168 checkbox sur l'écran
0
Utilisateur anonyme
8 oct. 2013 à 22:02
Mais le truc c'est que il ne tombe pas directement sur les 168 checkbox, elles sont sur un formulaire à part et bien intégrées avec un design. On verra bien ce qu'ils diront, je changerai si besoin est.
Merci du conseil en tout cas ;)
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
8 oct. 2013 à 22:12
Ah... "le truc c'est que .." !!!
J'ai bien tout relu
Ce ne sera peut-être pas le tout premier formulaire, mais il y arrivera, à un moment ou à l'autre, à un formulaire lui présentant toutes ces checkboxes, hein ...
"on verra bien ce qu'ils diront" ...
tu ferais mieux de leur poser sans attendre cette question. Cela t'évitera de tout concevoir à nouveau !:
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
Modifié par cs_ShayW le 8/10/2013 à 22:42
As tu déja conçu le form avec les 168 checkbox et écrit le code ?
0
Utilisateur anonyme
8 oct. 2013 à 22:45
Oui, le code est écrit et le programme fonctionnel. Je le changerai je pense ne 'inquiète pas ahah !
0
Utilisateur anonyme
31 août 2014 à 22:52
Bonjour à tous !
Petit déterrage de sujet !
Après m'être rendu compte que le code était lourd et qu'il comportait des bugs, j'ai réussi à optimiser le code et supprimer les bugs !
Voici donc le code pour générer un tableau de textbox :

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 :

 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 !
0
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
31 août 2014 à 23:12
Après m'être rendu compte que le code était lourd
non sans rire?
C'est pas comme si plusieurs solutions plus simples et probablement plus efficaces t'avaient été proposée....
0
Utilisateur anonyme
31 août 2014 à 23:26
Bonjour,
Certes des solutions ont été proposées mais je ne voyais pas un gros datagrid en plein milieu (bien que je remercie les membres de l'avoir quand même proposé).
De plus, ce n'est pas la peine d'être aussi ironique, cela frôle l'agression...
0
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
1 sept. 2014 à 00:21
Oui peut être, mais admets que ta phrase tend une perche énorme....
0
Utilisateur anonyme
1 sept. 2014 à 00:28
Je te l'accorde, bien que j'ai toujours su que le code n'était vraiment pas bon, je n'avais point d'idées pour l'optimiser. Donc il est vrai que je m'en suis rendu compte au moment même où je le tapais haha.
Enfin bref, sujet résolu !
0