Générateur de code pour différents langages

Description

Qui n'a pas eu a recopier plusieurs lignes de code en changeant les 1 en 2, puis en 3, etc... ?

Ce petit code le fait pour vous... et permet de sauvegarder en fichier ou dans le presse-papier.

A utiliser sans modération !

Source / Exemple :


Imports System.Windows.Forms
Imports System.Windows.Forms.Application
Imports System.IO
Imports System
Imports System.Windows
Imports System.Text.RegularExpressions

Public Class Form1

    Private Structure Parametre
        Dim Deb As Integer 'début
        Dim Iter As Integer 'Nombre d'itérations
        Dim Pas As Integer 'pas de chaque itér.
        Dim Nom As String 'nom de la variable ( a par exemple) à remplacer par une valeur ds code généré
        Public Sub New(ByVal nom As String, ByVal deb As Integer, ByVal iter As Integer, ByVal pas As Integer)
            Me.Nom = nom
            Me.Deb = deb
            Me.Iter = iter
            Me.Pas = pas
        End Sub
    End Structure 'structure d'un paramètre contenu ds une des chaines du Modèle

    'variables globales :
    Dim LM As New List(Of String) 'liste des chaines du Modèle
    Dim LC As New List(Of String) 'liste des chaines du Code
    Dim LP As New List(Of Parametre) 'liste des paramètres à gérer

    'événements :
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ActualiseLBModele() 'actualise les listbox Modele 
        ActualiseLBCode() '                        Code
        ActualiseLBParametres() '                Paramètres
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.DrawString("Modèle :", Me.Font, Brushes.Black, _
                              ListBoxModele.Location.X + 18, ListBoxModele.Location.Y - 15)
        e.Graphics.DrawString("Code Généré :", Me.Font, Brushes.Black, _
                              ListBoxCode.Location.X + 18, ListBoxCode.Location.Y - 15)
        e.Graphics.DrawString("Variables  :     nom         début    itérations       pas", Me.Font, Brushes.Black, _
                              ListBoxParametres.Location.X + 18, ListBoxParametres.Location.Y - 15)
    End Sub
    Private Sub ButtonModeleAjout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonModeleAjout.Click
        'ajout d'une ligne ds Modèle (en dernière position)
        Dim res As String

        res = Microsoft.VisualBasic.InputBox("Saisissez la ligne " & CStr(LM.Count + 1), "Entrée de la ligne suivante dans le modèle ")
        If res <> "" Then
            LM.Add(res) 'ligne ajoutée
            ActualiseLBModele()

            AjouteLigneParametres(res) 'ajouter les (nouveaux) paramètres contenus dans cette ligne
            ActualiseLBParametres() 'mise à jour de la listbox Paramètres

            Me.Refresh() 'refaire le dessin
            DoEvents()
        End If

    End Sub 'ajouter une ligne ds modèle
    Private Sub ButtonModeleRetrait_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonModeleRetrait.Click
        'retirer la dernière ligne ds modèle
       
        If LM.Count <> 0 Then
            SupprimeLigneParametres(LM(LM.Count - 1)) 'supprimer les paramètres de la dernière ligne si aucune autre ligne ne les contient...
            ActualiseLBParametres() 'mise à jour de la listbox Paramètres

            LM.RemoveAt(LM.Count - 1) 'enlève la dernière ligne
            ActualiseLBModele()
            ButtonModeleRetrait.Text = "Modèle : retrancher ligne " & IIf(LM.Count <> 0, CStr(LM.Count), "")
            'vider la listbox Code Généré pour rappeler la suppression d'une ligne ds le modèle
            LC.Clear() 'vider la liste
            ActualiseLBCode() ' actualiser la listebox Code généré
            ListBoxModele.SelectedIndex = LM.Count - 1 'rendre visible la dernière ligne
            Me.Refresh() 'refaire le dessin
            DoEvents()
        End If

    End Sub 'retirer la dernière ligne ds modèle
    Private Sub ButtonSauver_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSauverFichier.Click
        'sauver le code généré en fichier
        Dim savename As String = ""
        Dim dr As DialogResult
        Dim MyLines(LC.Count) As String
        Dim i As Integer

        dr = SaveFileDialog1.ShowDialog()

        If dr = DialogResult.OK Then 'sauvegarde confirmée
            savename = SaveFileDialog1.FileName
            'recopier la liste des lignes de code en tableau
            For i = 0 To LC.Count - 1
                MyLines(i) = LC(i)
            Next
            File.WriteAllLines(savename, MyLines)
            MessageBox.Show("Le fichier " & savename & " a été sauvegardé.")
            DoEvents()
        End If

    End Sub 'sauver le code généré en fichier
    Private Sub ListBoxParametres_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBoxParametres.DoubleClick
        'double-click sur un paramètre => modifier ses valeurs
        Dim ind, iter As Integer 'indice du paramètre choisi
        Dim res As String 'réponse de l'inputbox
        Dim param As Parametre 'paramètre à modifier
        Dim rg As New Regex("[0-9]") 'vérifier la chaine entrée ds inputbox

        ind = ListBoxParametres.SelectedIndex
        If ind <> -1 Then 'paramètre sélectionné
            param = LP(ind) 'les paramètres ds LP sont ds le mm ordre que ds ListBoxParametres
            'choix du début
            Do
                res = InputBox("Valeur de début :", "Choisissez les valeurs du paramètre " & param.Nom, CStr(param.Deb))
            Loop While res <> "" And Not rg.IsMatch(res) 'tant que Annuler ou réponse correcte (nombre entier)
            If res <> "" Then param.Deb = Val(res)

            'choix du nombre d'itérations
            Do
                res = InputBox("Nombre d'itérations :", "Choisissez les valeurs du paramètre " & param.Nom, CStr(param.Iter))
            Loop While res <> "" And Not rg.IsMatch(res)
            If res <> "" Then
                iter = IIf(Val(res) <> param.Iter, Val(res), 0) 'iter<>0 si le nbre d'itérations a été changé
                param.Iter = Val(res)
            End If

            'choix du pas 
            Do
                res = InputBox("Valeur du pas :", "Choisissez les valeurs du paramètre " & param.Nom, CStr(param.Pas))
            Loop While res <> "" And Not rg.IsMatch(res)
            If res <> "" Then param.Pas = Val(res)
            'change les valeurs du paramètre ds la liste LP
            LP.RemoveAt(ind) 'enlève l'ancien param.
            LP.Insert(ind, param) 'insère le nouveau

            If iter <> 0 Then 'modifier toutes les valeurs d'itération ds LP
                For ind = 0 To LP.Count - 1
                    param = LP(ind)
                    param.Iter = iter
                    LP.RemoveAt(ind) 'enlève l'ancien param.
                    LP.Insert(ind, param) 'insère le nouveau
                Next
            End If

            ActualiseLBParametres()
        End If

    End Sub 'modifier les valeurs d'une variable
    Private Sub ButtonExplications_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonExplications.Click
        MessageBox.Show("Ce programme génère du code en partant du modèle qu'il reproduit un certain nombre de fois " & _
                        "(Itérations)." & vbCrLf & _
                        vbCrLf & "Le modèle est formé de lignes qui comportent des variables à modifier." & vbCrLf & _
                        "Le pas est la valeur (positive ou négative) ajoutée à chaque fois." & _
                        vbCrLf & vbCrLf & "Chaque variable est désignée par le symbole % : " & _
                        vbCrLf & vbTab & "Box%a donnera le mot Box suivi de la valeur de a" & _
                        vbCrLf & vbCrLf & "Les noms des variables peuvent être formés d'une lettre ou d'un chiffre." & _
                        vbCrLf & "Le symbole % peut cependant être utilisé suivi d'un espace : " & _
                        vbCrLf & vbTab & "E% perso donnera E%perso à la génération" & _
                        vbCrLf & vbCrLf & "Les valeurs d'une variable peuvent être modifiées par double-clic dans la liste des variables." & _
                        vbCrLf & vbCrLf & "Une ligne du modèle peut être modifiée par double-clic sur elle-même ou avec le bouton Editer." & _
                        vbCrLf & vbCrLf & "Le modèle peut être lu à partir du presse-papier (en format TXT comportant une ou plusieurs lignes)." & _
                        vbCrLf & vbCrLf & "Le code généré peut être copié dans le presse-papier (clipboard) ou sauvegardé en fichier.")
    End Sub 'donner qq explications
    Private Sub ButtonGeneration_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonGeneration.Click
        'générer le code...et montrer le résultat
        Dim i As Integer

        If LP.Count <> 0 Then 'des parametres existent
            LC.Clear() 'vider la liste
            For i = 0 To LP(0).Iter - 1 'nbre d'itérations
                AjouteIteration(i) 'ajoute dans LC la ième itération du modèle
            Next
        Else
            LC.Clear()
            AjouteIteration(0) 'itère une fois, pour dire...
        End If
        ActualiseLBCode()
        Me.Refresh() 'refaire le dessin
        DoEvents()

    End Sub 'générer le code...et montrer le résultat
    Private Sub ButtonCopierPP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCopierPP.Click
        'copier le code généré ds le clipboard
        Dim i As Integer
        Dim s As String = ""

        For i = 0 To LC.Count - 1
            s &= LC(i) & vbCrLf
        Next

        My.Computer.Clipboard.SetText(IIf(s <> "", s, " "), TextDataFormat.Text)
        MessageBox.Show("Le code généré a été copié dans le presse-papier.")
        DoEvents()

    End Sub 'copier le code généré ds le clipboard
    Private Sub ButtonLireModelePP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonLireModelePP.Click
        Dim i As Integer
        Dim s As String
        Dim lignes() As String
        Dim separateur As Char = vbCrLf

        If My.Computer.Clipboard.ContainsText(TextDataFormat.Text) Then 'texte ds clipboard
            'récupérer le texte
            s = My.Computer.Clipboard.GetText(TextDataFormat.Text)
            'et le décomposer en lignes
            lignes = s.Split(separateur) 'décompose en lignes
            If lignes.Length <> 0 Then 'lignes trouvées
                LM.Clear() 'vider le modèle
                LP.Clear() 'et les variables
                For i = 0 To lignes.Length - 1
                    lignes(i) = IIf(lignes(i).Substring(0, 1) <> vbLf, lignes(i), _
                                    lignes(i).Substring(1, lignes(i).Length - 1)) 'enlever Lf (0x0A) en début de ligne
                    If lignes(i) <> "" Then 'la dernière ligne du clipboard peut être vide
                        LM.Add(lignes(i)) 'ligne ajoutée
                        AjouteLigneParametres(lignes(i)) 'ajouter les (nouveaux) paramètres contenus cette ligne
                    End If
                Next
                'actualise les différentes listbox
                ActualiseLBModele() 'listbox du Modele
                ActualiseLBParametres() 'mise à jour de la listbox Paramètres
                LC.Clear() 'vider la liste
                ActualiseLBCode() ' actualiser la listebox Code généré
                Me.Refresh() 'refaire le dessin
                DoEvents()
            End If
        Else 'pas de texte ds le presse-papier
            MessageBox.Show("Il n'y a pas de texte dans le presse-papier...on essaye de m'embrouiller ?   ;-)")
        End If

    End Sub
    Private Sub ListBoxModele_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBoxModele.DoubleClick
        'éditer une ligne du modèle
        Dim ind As Integer 'indice de la ligne choisie
        Dim ligne As String
        Dim old_ligne As String

        ind = ListBoxModele.SelectedIndex
        If ind <> -1 Then 'ligne sélectionnée
            'les lignes ds ListBoxModele sont dans l'ordre de la liste LM
            old_ligne = LM(ind)
            ligne = InputBox("Modifiez la ligne " & CStr(ind + 1), "Modification d'une ligne du modèle ", LM(ind))
            If ligne <> "" And ligne <> old_ligne Then 'à modifier
                LM.RemoveAt(ind) 'enlève l'ancienne ligne
                LM.Insert(ind, ligne) 'met la nouvelle à la mm place
                SupprimeLigneParametres(old_ligne) 'virer les paramètres de l'ancienne ligne
                AjouteLigneParametres(ligne) 'ajouter les (nouveaux) paramètres contenus dans cette ligne
                ActualiseLBParametres() 'mise à jour de la listbox Paramètres
                ActualiseLBModele()
                ListBoxModele.SelectedIndex = ind 'rendre visible la ligne éditée
                Me.Refresh() 'refaire le dessin
                DoEvents()
            End If
        End If

    End Sub 'éditer une ligne du modèle par double-clic
    Private Sub ButtonEditerLigne_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonEditerLigne.Click
        'éditer une ligne du modèle par le bouton
        Dim res As String 'réponse de l'inputbox
        Dim rg As New Regex("[0-9]") 'vérifier la chaine entrée ds inputbox
        Dim ind As Integer 'indice de la ligne choisie
        Dim ligne As String
        Dim old_ligne As String

        'choix du début
        Do
            res = InputBox("Entrez le numéro de la ligne à éditer : ", "Choisissez la ligne à éditer ")
        Loop While res <> "" And Not rg.IsMatch(res) 'jusqu'à ce que Annuler ou réponse correcte (nombre entier)

        If res <> "" Then 'édition confirmée
            ind = IIf(Val(res) > 0 And Val(res) < LM.Count + 1, Val(res) - 1, 0)
            old_ligne = LM(ind)
            ligne = InputBox("Modifiez la ligne " & CStr(ind + 1), "Modification d'une ligne du modèle ", LM(ind))
            If ligne <> "" And ligne <> old_ligne Then 'à modifier
                LM.RemoveAt(ind) 'enlève l'ancienne ligne
                LM.Insert(ind, ligne) 'met la nouvelle à la mm place
                SupprimeLigneParametres(old_ligne) 'virer les paramètres de l'ancienne ligne
                AjouteLigneParametres(ligne) 'ajouter les (nouveaux) paramètres contenus dans cette ligne
                ActualiseLBParametres() 'mise à jour de la listbox Paramètres
                ActualiseLBModele()
                ListBoxModele.SelectedIndex = ind 'rendre visible la ligne éditée
                Me.Refresh() 'refaire le dessin
                DoEvents()
            End If
        End If

    End Sub 'éditer une ligne du modèle par le bouton

    'routines :
    Private Sub ActualiseLBModele()
        'met à jour la listbox Modele et le bouton ModeleRetrait Ligne ...
        Dim i As Integer

        ListBoxModele.Items.Clear()
        For i = 0 To LM.Count - 1
            ListBoxModele.Items.Add(LM(i))
        Next
        ButtonModeleRetrait.Text = "Modèle : retrancher ligne " & CStr(LM.Count)

    End Sub 'met à jour la listbox Modele
    Private Sub ActualiseLBCode()
        'met à jour la listbox Code
        Dim i As Integer

        ListBoxCode.Items.Clear()
        For i = 0 To LC.Count - 1
            ListBoxCode.Items.Add(LC(i))
        Next

    End Sub 'met à jour la listbox Code
    Private Sub ActualiseLBParametres()
        'met à jour la listbox Paramètres
        Dim i As Integer
        Dim p As Parametre

        ListBoxParametres.Items.Clear()
        For i = 0 To LP.Count - 1
            p = LP(i)
            ListBoxParametres.Items.Add(vbTab & vbTab & p.Nom & " , " & vbTab & (p.Deb) & " , " _
                                        & vbTab & CStr(p.Iter) & " , " & vbTab & CStr(p.Pas))
        Next
    End Sub 'met à jour la listbox Paramètres
    Private Sub AjouteLigneParametres(ByVal s As String)
        'cherche de nouveaux paramètres ds cette ligne :  caractère % suivi d'une lettre
        'et ajoute ces paramètres à la liste LP
        Dim p As New Parametre("", 1, 1, 1) ' = (nom,début,iteration,pas)
        Dim i, ind As Integer
        Dim separateur As Char = "%"
        Dim morceaux() As String 'morceaux de ligne séparés par %

        If LP.Count <> 0 Then p.Iter = LP(0).Iter 'nombre d'itérations déjà fixé ou modifié

        morceaux = s.Split(separateur) 'décompose la ligne en morceaux
        'écarter les lignes vides...
        If morceaux.Length <> 0 And s <> "" Then 'plusieurs morceaux
            For i = IIf(s.Substring(0, 1) = "%", 0, 1) To morceaux.Length - 1 'analyser chaque paramètre possible
                'en partant du 2ième morceau si la ligne ne commence pas par %
                If morceaux(i).Length > 0 Then
                    If MorceauContientParametre(morceaux(i), p) Then 'paramètre trouvé -> p
                        If Not LPContientParametre(p.Nom, ind) Then LP.Add(p) 'si nouveau
                    End If
                End If 'si le morceau n'est pas réduit à "%"
            Next 'morceau suivant ( next i)
        End If 'si morceaux ( % est ds la ligne )

    End Sub 'ajoute les (nouveaux)paramètres de la ligne à la liste LP
    Private Function MorceauContientParametre(ByVal m As String, ByRef p As Parametre) As Boolean
        'analyse le morceau et modifie p.nom , retourne true si paramètre trouvé 
        'cette routine sert aussi pour retirer un paramètre de la liste si la ligne est supprimée
        Dim nom As String
        Dim res As Boolean = False

        nom = m.Substring(0, 1) '1er caractère en partant de la gauche
        If nom <> " " Then
            p.Nom = nom 'exemple : nom = "a" si "%a" ds la ligne
            res = True '1 paramètre trouvé
        End If 'si le nom est défini (morceau <> "% ")

        Return res
    End Function 'analyse le morceau et modifie p.nom , retourne true si paramètre trouvé 
    Private Function LPContientParametre(ByVal nom As String, ByRef ind As Integer) As Boolean
        'cherche si le paramètre de nom "param.Nom" est ds LP (sans tenir compte de ses valeurs)
        'mémorise l'indice ds ind si demandé
        Dim i As Integer
        Dim res As Boolean = False

        For i = 0 To LP.Count - 1
            If LP(i).Nom = nom Then
                res = True
                ind = i 'indice du parametre ds LP
            End If
        Next

        Return res
    End Function 'teste si LP contient ce paramètre
    Private Sub SupprimeLigneParametres(ByVal s As String)
        'enlève les paramètres de cette ligne si aucune autre ligne ne les contient

        Dim p As New Parametre("", 1, 1, 1) ' = (nom,début,iteration,pas)
        Dim i, lig, ind As Integer
        Dim separateur As Char = "%"
        Dim morceaux() As String 'morceaux de ligne séparés par %
        Dim sup As Boolean

        morceaux = s.Split(separateur) 'décompose la ligne en morceaux

        If LM.Count <> 0 Then
            If morceaux.Length <> 0 And s <> "" Then 'plusieurs morceaux
                For i = IIf(s.Substring(0, 1) = "%", 0, 1) To morceaux.Length - 1 'analyser chaque paramètre possible
                    'en partant du 2ième morceau si la ligne ne commence pas par %
                    If morceaux(i).Length > 0 Then
                        If MorceauContientParametre(morceaux(i), p) Then 'paramètre trouvé -> p.Nom
                            sup = True 'supprimer ce parametre à priori
                            If LM.Count > 1 Then 'sinon, une seule ligne ds modèle, sup=True
                                For lig = 0 To LM.Count - 2 'pour chaque ligne du modèle sauf la dernière ligne
                                    If LM(lig).Contains("%" & p.Nom) Then sup = False 'car paramètre ds autre ligne
                                Next
                            End If 'si plus d'une ligne ds modele

                            If sup Then
                                LPContientParametre(p.Nom, ind) 'bonne question ! (le parm. à supprimer peut être ds plusieurs morceaux)
                                ' c'est aussi pour avoir l'indice i
                                If LPContientParametre(p.Nom, ind) Then LP.RemoveAt(ind) 'vire le param de la liste
                            End If
                        End If 'si le morceau contient un parametre
                    End If 'si le morceau n'est pas réduit à "%"
                Next 'morceau suivant ( next i)
            End If 'si morceaux ( % est ds la ligne )
        End If ' si LM.Count<>0

    End Sub 'enlève les paramètres de la ligne à la liste LP ci-nécessaire
    Private Sub AjouteIteration(ByVal iter As Integer)
        'ajoute dans LC la ième itération du modèle
        Dim i, m, ind As Integer
        Dim p As New Parametre("", 1, 1, 1) ' = (nom,début,iteration,pas)
        Dim separateur As Char = "%"
        Dim morceaux() As String 'morceaux de ligne séparés par %
        Dim ligne_code As String 'ligne de code générée

        If iter <> 0 Then LC.Add(" ")

        For i = 0 To LM.Count - 1 'pour chaque ligne du modèle
            ligne_code = ""
            morceaux = LM(i).Split(separateur) 'décompose la ligne en morceaux
            If morceaux.Length <> 0 And LM(i) <> "" Then 'plusieurs morceaux : paramètres ?
                If LM(i).Substring(0, 1) <> "%" Then ligne_code = morceaux(0) 'premier morceau sans code

                For m = IIf(LM(i).Substring(0, 1) = "%", 0, 1) To morceaux.Length - 1 'analyser chaque paramètre possible
                    'en partant du 2ième morceau si la ligne ne commence pas par %
                    If morceaux(m).Length > 0 Then
                        If MorceauContientParametre(morceaux(m), p) Then 'paramètre trouvé -> p
                            LPContientParametre(p.Nom, ind) 'permet d'avoir l'indice du paramètre
                            p = LP(ind) 'permet d'avoir les valeurs du paramètre
                            ligne_code &= CStr(p.Deb + iter * p.Pas) 'valeur du paramètre
                            ligne_code &= morceaux(m).Substring(1, morceaux(m).Length - 1) 'reste du morceau
                        Else 'le caractère % est suivi d'un espace : enlever l'espace
                            ligne_code &= "%"
                        End If
                    Else 'le caractère % n'est pas suivi d'un autre caractère (ex : %%) : le recopier
                        ligne_code &= "%"
                    End If 'si le morceau n'est pas réduit à "%"
                Next 'morceau suivant ( next i)
            Else 'reproduire la ligne telle quelle (pas de variable)
                ligne_code = LM(i)
            End If 'si morceaux ( % est ds la ligne )
            LC.Add(ligne_code)
        Next 'ligne i suivante ds modele

    End Sub 'ajoute dans LC la ième itération du modèle

End Class

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.