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 :

Optimisation d'un code de sauvegarde paramètres 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 Optimisation d'un code de sauvegarde paramètres checkbox
    Bonjour,
    je voudrais optimiser un code très lourd que j'ai écris il y a quelques temps, ce code sert à charger et sauvegarder des paramètres booléens My.Settings qui déterminent si une textebox est coché ou non dans mon tableau de checkbox qui représente un calendrier de la semaine.
    J'utilise donc actuellement le code suivant pour sauvegarder les paramètres de mon tableau de checkbox qui correspond aux jours et heures de la semaine :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
            If tab(0, 0).Checked Then
     
                My.Settings.LU0 = True
            Else
     
                My.Settings.LU0 = False
            End If
     
            If tab(0, 1).Checked Then
     
                My.Settings.LU1 = True
            Else
     
                My.Settings.LU1 = False
            End If
            If tab(0, 23).Checked Then
     
                My.Settings.LU23 = True
            Else
     
                My.Settings.LU23 = False
            End If
     
    '...
     
     
            If tab(1, 0).Checked Then
     
                My.Settings.MA0 = True
            Else
     
                My.Settings.MA0 = False
            End If
     
            If tab(1, 1).Checked Then
     
                My.Settings.MA1 = True
            Else
     
                My.Settings.MA1 = False
            End If
    Voilà donc pour la sauvegarde des cases cochées sachant que les 24 tests qui correspondent à chaque heure sont effectués pour les 7 jours...

    Je voudrais donc l'optimiser ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            Dim Jour As Byte = 0
                For Heure As Byte = 0 To 23
                    If tab(Jour, Heure).Checked Then
                        My.Settings.LU + Heure
                End If
            Next
     
            Jour = 1
            For Heure As Byte = 0 To 23
                If tab(Jour, Heure).Checked Then
                    My.Settings.MA + Heure
                End If
            Next
    Ma question est : comment puis-je utiliser une variable pour le My.Settings ?

    J'ai le même problème pour la lecture des paramètres, j'utilise actuellement le code suivant :

    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
            If My.Settings.LU0 = True Then
                tab(0, 0).Checked = True
            End If
     
            If My.Settings.LU1 = True Then
                tab(0, 1).Checked = True
            End If
     
    '...
     
            If My.Settings.MA0 = True Then
                tab(1, 0).Checked = True
            End If
            If My.Settings.MA1 = True Then
                tab(1, 1).Checked = True
            End If
     
    '...
    Je voudrais l'optimiser ainsi mais même problème... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            Dim Jour As Byte = 0
            For Heure As Byte = 0 To 23
                If My.Settings.LU + Heure Then
                    tab(Jour, Heure).Checked = True
                End If
            Next
     
            Jour = 1
            For Heure As Byte = 0 To 23
                If My.Settings.MA + Heure Then
                    tab(Jour, Heure).Checked = True
                End If
            Next
    En espérant que quelqu'un pourra m'aider !
    Merci.
    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
    Déjà lire ceci est juste horrible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If tab(0, 0).Checked Then
        My.Settings.LU0 = True
    Else
        My.Settings.LU0 = False
    End If
    Si Checked est True on met le setting à True ; sinon (s'il est False) on met le setting à False ; ça serait pas mieux d'assigner directement le setting à la valeur du Checked
    My.Settings.LU0 = tab(0, 0).Checked
    Ensuite, My.Settings est dérivé de ApplicationSettingsBase qui présente un indéxeur prenant en argument le nom de la propriété à accéder en tant que string (attention ça renvoie un Object, donc ce n'est plus fortement typé)
    Du coup on peut faire My.Settings("LU0") à partir de là ça ne devrait pas être trop dur d'arriver à quelque chose

    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
    Dim dayPrefixes = { "LU", "MA" } ' à compléter
     
    ' sauvegarde
    For day = 0 To 6
        For hour = 0 To 23
            My.Settings(dayPrefixes(day) & hour) = tab(day, hour).Checked
        Next
    Next
     
    ' lecture
    For day = 0 To 6
        For hour = 0 To 23
            tab(day, hour).Checked = My.Settings(dayPrefixes(day) & hour) ' nécessite peut-être un cast Object -> Boolean (avec CBool par exemple)
        Next
    Next
    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
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    .net offre des tas de possibilités pour faire du code simple et court, utiliser un tableau et plein de settings c'est pas génial
    après niveau ergonomie, tu connais beaucoup d'utilisateurs qui aiment voir 150 checkbox ?
    il y a beaucoup mieux à faire, sur la freebox il y a un calendrier horaire avec 3 état possible par heure de la semaine, et en 3 clics en remplit tout le tableau (sélection du mode, puis sélection multi case en laissant cliqué quand on glisse la souris)
    et ca doit se faire en 20 lignes de code

    du code comme ca c'est ni fait ni à faire
    (faut essayer de prendre ca comme un encouragement à progresser )

    il faut prendre le temps de comprendre les concepts de POO, il faut essayer d'imaginer du code plus efficace et il faut surtout s'inspirer de ce qui existe et qui est bien ; plutot que de répondre à une problématique en transposant simplement celle ci sans la retravailler
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    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
    @Sehnsucht
    Merci beaucoup pour ton code, je l’intégrerai plus tard !
    Après c'est vrai qu'utiliser des My.Settings n'est pas l'idéal, surtout que je dois les créer manuellement via les propriétés du projet , je pense que ça doit se faire avec un fichier .ini ou .txt non ?

    @Pol63
    Je suis entièrement d'accord avec toi, j'ai moi même la Freebox et je trouve son système de tableau génial et super simple. Justement hier après avoir crée le sujet j'ai commencé à réfléchir à comment en faire un similaire (je savais que ça allait crier au scandale pour la GUI ). J'ai pensé à en faire un avec des picturebox, qu'en penses-tu ?
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  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 à tous,
    je me suis renseigné sur les moyens qui me permettraient de ne plus utiliser les paramètres My.Settings, mes recherches m'ont conduits jusqu'au cours de sérialisation de Developpez. J'ai donc opté pour la sérialisation binaire. J'ai crée ma classe, mes variables qui représentent mes jours et heures ... Le problème c'est que pour éviter le code redondant, je voudrais à nouveau faire un système de boucle qui assigne la valeur de ma checkbox à la variable.
    Je souhaite donc réutiliser le code que tu m'a donné Sehnsucht mais l'IDE attend un identificateur à la place du nom dynamique...
    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
        Private MaVariable As New ClassePlanning
        Sub AssignationValeursVariables()
            Dim dayPrefixes = {"LU", "MA", "ME", "JE", "VE", "SA", "DI"}
            For day = 0 To 6
                For Heure = 0 To 23
                    MaVariable.(dayPrefixes(day) & Heure) = tab(day, Heure).Checked ' L'IDE attend un identificateur connu
                Next
            Next
     
            Dim myFileStream As Stream = File.Create("Planning.bin")
            Dim serializer As New BinaryFormatter
            serializer.Serialize(myFileStream, MaVariable)
            myFileStream.Close()
     
     
        End Sub
    Voilà si vous pouvez me dire comment solutionner le problème... Par ailleurs, pensez vous que c'est une bonne solution ? (Je changerai plus tard de système de tableau comme l'a conseillé Pol63).

    Merci.
    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
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ca vient de là .(dayPrefixes(day) & Heure)

    quand on écrit unevariable. après le point il faut le nom d'un membre, pas une parenthèse
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2013
    Messages : 36
    Points : 56
    Points
    56
    Par défaut
    Salut,

    Dans ton cas l'appsettings, ce n'est pas génial.
    mais pour éclaircir un point :
    tu peux accéder à une variable de type boolean via Parse. (comme my.settings ne te renvoie que du string)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim check As Boolean = Boolean.Parse(My.Settings.TBChecked)
    Il existe aussi une méthode plus sécurisée dans le sens ou elle ne provoque pas d'erreur en cas ou la valeur que l'on tente d’interpréter est erronée pour x raison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim check As Boolean        
    Boolean.TryParse(My.Settings.TBChecked, check)
    la méthode renvoie true si la conversion s'est bien déroulée. sinon check est False quoiqu'il en soit, c'est c'est la valeur par défaut lors de la déclaration de la variable.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Citation Envoyé par CLeBeR Voir le message
    (Je changerai plus tard de système de tableau comme l'a conseillé Pol63).
    Tu devrais tout de suite réaliser ton programme proprement plutôt que de recommencer plusieurs fois, non ?
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    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
    Citation Envoyé par Pol63 Voir le message
    ca vient de là .(dayPrefixes(day) & Heure)

    quand on écrit unevariable. après le point il faut le nom d'un membre, pas une parenthèse
    Oui c'est ce que me propose IntelliSense mais n'y a t-il pas moyen d'utiliser un nom dynamique comme je l'ai fais dans mon code ?

    @popoels
    En fait ce que je cherche à faire c'est assigner la valeur de mes checkbox à un nom de variable dynamique. Si j'ai bien compris ton code sers à tester les valeurs de checkbox, comment puis-je l'utiliser pour régler mon problème ? Je n'ai pas bien saisi...
    Merci à tous
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  10. #10
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par CLeBeR Voir le message
    Oui c'est ce que me propose IntelliSense mais n'y a t-il pas moyen d'utiliser un nom dynamique comme je l'ai fais dans mon code ?

    @popoels
    En fait ce que je cherche à faire c'est assigner la valeur de mes checkbox à un nom de variable dynamique. Si j'ai bien compris ton code sers à tester les valeurs de checkbox, comment puis-je l'utiliser pour régler mon problème ? Je n'ai pas bien saisi...
    Merci à tous
    Bonsoir,

    Si tu veux faire qqch de propre suis le conseil de rv26t () et perso pour régler ton soucis de "variable dynamique" pourquoi ne créés-tu pas simplement des classes représentant la constitution d'un calendrier ???? Il faudrait franchir le pas un moment ou à un autre plutôt que de faire du bidouillage ...ne crois-tu pas...?

    A+

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu as posé tes checkbox à la main (ou tes picturebox), supprimes les et essaie de les poser par code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    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 wallace1,
    J'aimerais trouver la solution pour voir si cela est possible, dès que j'aurai fini je me pencherai immédiatement sur une solution plus propre avec un "vrai" tableau !

    @Pol63
    J'utilise du code pour générer le 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
            Dim x As Integer
            Dim y As Integer = 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
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  13. #13
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    tu avais déja aborder le sujet
    http://www.developpez.net/forums/d13...maine-l-heure/

  14. #14
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par CLeBeR Voir le message
    Bonjour wallace1,
    J'aimerais trouver la solution pour voir si cela est possible, dès que j'aurai fini je me pencherai immédiatement sur une solution plus propre avec un "vrai" tableau !
    Tu ne comprends pas ....mais fais-toi plaisir avec ton "vrai" tableau...^^




    Effectivement ...sacré déterrage... et il n'a toujours pas avancé sur son pb depuis le temps O_O

  15. #15
    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
    Bon allé, j'abandonne l'idée, je vais suivre vos conseils. Vous voulez que je reprenne l'ancien sujet ?
    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. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53
  2. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  3. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    Réponses: 20
    Dernier message: 09/03/2007, 14h00
  4. Sauvegarder paramètres d'imprimantes
    Par walid_kerkoub dans le forum Delphi
    Réponses: 5
    Dernier message: 19/02/2007, 13h07
  5. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47

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