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 :

Problème de méthode de récupération pour création automatique d'objet


Sujet :

VB.NET

Vue hybride

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut Problème de méthode de récupération pour création automatique d'objet
    Bonjour à toutes et à tous,


    Je souhaiterais de l'aide pour une méthode, car je n'ai plus beaucoup d'idées pour attaquer le problème, pour cette raison que je me tourne vers vous.

    Ce problème est de récupérer des variables, sachant que leurs noms peuvent être identique mais pas la casse. Quand j'extrait tout dans un Dictionary, celà ne pose pas de problème, car les clés ne tiennent pas compte de la casse.

    Par contre, je me sers du nom des clés pour automatisé la création de mes checkboxs, et dans le nom que se soit "yf" ou "YF" il n' y a aucune différence, donc problème en vue.

    Déroulement du code :

    Je vais détailler les étapes du programme pour vous donner une idée global de son fonctionnement :

    1. Tout d'abord, il faut ouvrit un explorer via un bouton, afin de sélectionner un fichier en .rtf (format du rapport)
    2. Le programme se charge de convertir le fichier .rtf en fichier texte .txt
    3. Une fois le fichier texte créé, le programme l'ouvre dans un streamreader qui récupère la globalité du fichier (soit 800 lignes ~)
    4. Les données du streamreader sont stockées dans une variable "String" pour ensuite, avec une RegEx, récupérer les lignes clés dans une collection.
    5. La collection est testée avec d'autres motifs de RegEx, afin de récupérer la désignation des variables et leurs valeurs numériques.
    6. Le programme stocke les données de chaques lignes dans un "Dictionary" (la clé étant la désignation, et la valeur de celle-ci la valeurs numériques.
    7. Une fois toutes les données rentrées dans le "Dictionary", je réalise les checkboxs automatiquement, le nom de chaque checkbox étant "CheckBoxName_" et la clé du "Dictionary" (se qui donne par exemple "CheckBoxName_yf"). Les checkboxs permettent à l'utilisateur de sélectionner les variables à retenir, pour sortir leur valeurs sous format Excel.
    Le problème est que la propriété nom (.Name) des checksBoxs ne fait pas la différence entre "yf" et "YF" qui ont tous deux des désignations différentes.


    Au début je testais les clés dans mon "Dictionary" en forçant tout en ".ToUpper" et quand une clés est déjà présente je rajoute derrière la clé "_1" (ainsi de suite). Au début s'était suffisant, mais maintenant moi même ne sais plus la différence entre les variables YF et YF_1...

    Voici le code pour l'extraction des variables et la création des checkboxs :


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    Public Dictionnaire as Dictionary (Of String, Object) 
     
    Private Sub ExempleDeMonCode(ByVal fichierChemin As String)
     
     
            Dim objStreamReader As StreamReader     'Variable pour StreamReader
            Dim TailleFichier As Integer		'récupération de la taille du fichier pour la ProgressBar
     
     
     
            '---------------------- Test ouverture fichier .txt ---------------------
     
     
            'Essai d'ouvrir le fichier .txt car il y a de la latence entre la fermeture de word et l'ouverture du fichier .txt
            '(physique lier au processeur), alors que via le StreamReader aucun latence, problème
            'Donc temps qu'on ne peut pas ouvrir le fichier on est dans la boucle, en attendant que le word rend la main sur le .txt
     
            Do
                FSIsOk = OuvertureExclusive(fichierChemin)
            Loop Until FSIsOk = True
     
            InitialisationProgramme()	'Initialise une partie des varaibles
     
            'MsgBox(FSIsOk)
     
            'MsgBox(ouvrirChemin)
     
     
            '------------------------------ StreamReader ----------------------------
     
     
            'Ouvrir le fichier dans StreamReader.
            objStreamReader = New StreamReader(ouvrirChemin, System.Text.Encoding.Unicode)
            'MsgBox(objStreamReader)
     
            TailleFichier = objStreamReader.BaseStream.Length
            Dim fichierComplet As String
     
            fichierComplet = objStreamReader.ReadToEnd
            objStreamReader.BaseStream.Seek(0, 0)
     
            objStreamReader.Close()
     
     
    	Dim pattern As String = "\s([\w\)\(\/\.\°\,\-\*\'\²\³\ ]*)\[{1}([\w\'\,\°\-\+\*\.\=\-\/²]*)\]{1} *([\-\(A]?" & _
                "[\d+\.?]+ {0,2}[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?) *([\-\(A]?[\d+\.?]*" & _
                " {0,2}[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?)? *([\-\(A]?[\d+\.?]* {0,2}" & _
                "[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?)?\s"
     
            Dim retourPrincipal As MatchCollection
     
            retourPrincipal = Regex.Matches(fichierComplet, pattern)
     
            For Each m As Match In retourPrincipal
                Dim j As Integer
                j += 1
     
                Dim i As Integer = 1
     
                Dim nomVariable As String
     
                nomVariable = m.Groups(2).Value
     
     
     
                For i = 1 To i
                    For k = 0 To Dictionnaire.Count - 1
                        'MsgBox(nomVariable.ToUpper & vbNewLine & Dictionnaire.Keys(k).ToUpper)
                        If nomVariable.ToUpper = CStr(Dictionnaire.Keys(k).ToUpper) Then
                            If InStr(nomVariable, "_") Then
                                nomVariable = Mid(nomVariable, 1, InStr(nomVariable, "_")) & i
                                k = 0
                            Else
                                nomVariable = nomVariable & "_" & i
                                k = 0
                            End If
                            i += 1
                        End If
                    Next
                Next
     
    	If IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) Then
                    Dictionnaire.Add(nomVariable, m.Groups(3).Value)
                ElseIf Not IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) Then
                    Dictionnaire.Add(nomVariable, m.Groups(3).Value)
                ElseIf IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) And _
                    IsNothing(Replace(nomVariable, " ", "")) Then
                    Dictionnaire.Add(nomVariable, "Pas de valeurs")
                Else
                    Dictionnaire.Add(nomVariable, m.Groups(3).Value)
                End If
     
                ApplicationMenu.PGB_PROGRESSION.Value = 100 * j / retourPrincipal.Count
                ApplicationMenu.LBL_PROGRESSION.Text = "Lecture encours ..."
            Next
     
            ApplicationMenu.LBL_PROGRESSION.Text = "Lecture terminée"
     
     
    	ApplicationMenu.LBL_VariablesRecup.Text = Dictionnaire.Count
     
            CreationCheckBoxs()
     
    End Sub

    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
    42
    43
    44
    45
    Private Sub CreationCheckBoxs()
     
            Dim x As Integer = 5
            Dim y As Integer = 5
            Dim checkBoxName As String
     
            For Each ctrl In Parametres.Panel1.Controls
                If TypeOf ctrl Is CheckBox Then
                    Parametres.Panel1.Controls.Remove(ctrl)
                End If
            Next
     
     
     
            For i = 0 To Dictionnaire.Count -1
     
                ReDim Preserve a(i)
                a(i) = New CheckBox
     
     
                With a(i)
                    Parametres.Panel1.Controls.Add(a(i))
     
     
                    checkBoxName = "checkBox_" & Dictionnaire.Keys(i)
     
                    .Text = Dictionnaire.Keys(i)
                    .Checked = True
                    .Left = x
                    .Top = y
                    y = y + 20
                    .Width = 100 'Definit la largeur de l'objet 
                    .Height = 20 'Definit la hauteur de l'objet 
     
                    a(i).Name = checkBoxName
                    'MsgBox(checkBoxName & vbNewLine & a(i).Name)
                    .Visible = True
                    .Enabled = True
     
                    'MsgBox(a(i).Created)
                End With
     
            Next
     
    End Sub
    J'ai vu que l'on peut déclarer un "Dictionary" dans un autre, est ce une solution, ou je vais droit dans le mur ? Existe t'il d'autres méthodes ou cas qui peuvent résoudre se problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public dictionnaire() As Dictionary(Of Boolean, Dictionary(Of Object, String))
     
    'afin de faire (ce n'est qu'a titre d'informations pour vous aider à saisir l'idée)
    dictionnaire("yf", Dictionary("Valeur de yf", "Commentaire sur la désignation")
    Si vous avez des questions n'hésitez pas.

    Cordialement,
    Nicolas

  2. #2
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Salut,

    J'ai vu que l'on peut déclarer un "Dictionary" dans un autre, est ce une solution, ou je vais droit dans le mur ? Existe t'il d'autres méthodes ou cas qui peuvent résoudre se problème ?
    Je pense qu'il y a de meilleures solutions (plus adaptées) pour enregistrer tes données..

    Pourquoi na pas créer une classe MaVariable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class MaVariable
        Public Property ID As Integer = 0  'unique, afin de l'assigner à la propriété CheckBox.Name ?!?
        Public Property Name As String = ""
        Public Property Value As Double = 0D
        Public Property Designation As String = ""
        '...
     
    End Class
    Ensuite tu peux charger tes données dans un Dictionary(Of Integer, MaVariable) avec l'ID unique comme clé et l'objet comme valeur..

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut
    Ok ok, merci beaucoup pour l'info, ça m'a l'air beaucoup plus simple que ma méthode. Je le savais que je n'allais pas dans la bonne direction... Faut que je pense à retirer mes oeillères ^^.

    Bref vive la P.O.O. même si je n'ai pas encore ce réflexe, ça m'a déjà bien servi.

    Je vais travailler dessus alors.

    Pour l'ID, la clé unique se forme automatiquement ou je le faire moi même. Car je sais que dans les BDD, les ID sont fait automatiquement une fois le DataSet fait.

    Cordialement,
    Nicolas

  4. #4
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Alors là je pense que ça va être à toi de l'autoincrémenter..
    Si tu charge tes variables en une fois, avec l'aide d'un for each par exemple, tu peux mettre en place un compteur qui s'incrémente à chaque fois et qui assigne l'ID..

    Ce n'est qu'un proposition, je n'ai jamais essayé de cette manière.. tu as peut être d'autres moyen d'obtenir un identifiant unique..

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 81
    Par défaut
    C'est ce que j'allais faire, car j'ai bien une boucle For Each, mais c'était au cas ou ^^.

    En tout cas merci beaucoup, car là j'ai une piste, et déjà des idées pour mon programme.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 31/03/2014, 11h38
  2. [AC-2010] Un défi de taille pour création automatique de formulaires
    Par toumack dans le forum IHM
    Réponses: 3
    Dernier message: 25/02/2011, 06h31
  3. méthode de corrélogramme pour la détection d'objet
    Par tuunisiano dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 04/03/2009, 16h44
  4. Réponses: 8
    Dernier message: 21/09/2008, 12h08
  5. Réponses: 6
    Dernier message: 09/03/2008, 13h12

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