| Découplez la puissance de Visual Studio 2008 avec les macros ! | |
| Générez votre code à partir des Macros de Visual Studio 2008 | |
| Etendez la Boîte à Outils de Visual Studio 2008 |
<< Retour à la première partie
Découplez la puissance de Visual Studio 2008 avec les macros ! |
Mais les Codes-Snippets ne sont pas une fin en soi, vous pouvez encore aller plus loin dans la démarche en exploitant une autre fonctionnalité trop méconnue et trop peu utilisée de Visual Studio : les Macros !
Effectivement, bien que je sois un adepte des Codes-Snippets, je dois leur reconnaitre une certaine limite dans leur capacité à accompagner le développeur dans des éléments de génération de code et/ou fonctionnalités particulières comme l’automatisation d’une recherche de syntaxe via Google !
(NDLR : on pourrait faire ça pour Live Search aussi, non ? :-) )
Alors comment atteindre de pareils objectifs en un minimum de temps ? Les macros sont là pour vous aider. Accéder à celles-ci au travers de l’éditeur de macro installé par défaut dans votre Visual Studio.
Pour cela, rien de plus simple, accédez au menu Outils (Tools) et observez la capture suivante présentant l’interface que vous devriez avoir sous les yeux :
.jpg)
Afin de faire mieux connaissance avec les macros, je ne puis que vous encourager à charger le Macro Explorer (Alt+F8) qui vous ouvrira une boîte à outils contenant l’ensemble des macros disponibles par défaut dans votre environnement de développement.
.jpg)
Les macros sont déjà nombreuses et leur objectif est principalement de vous appuyer dans votre apprentissage. La capture précédente vous montre ainsi que non seulement vous aurez un ensemble de macros à disposition (Samples) mais aussi la possibilité de créer vos propres macros, qui dans le cas de cette capture, sont regroupés au sein de WygMacros. Il vous sera ainsi possible d’échanger vos macros avec vos collègues.
Découvrons ainsi une première macro. Pour cela, exploitez l’éditeur de macros qui n’est ni plus ni moins qu’une version de Visual Studio dédié à ce type d’exercice. Vous y accéderez par l’explorateur de macros : faites un clic droit sur une macro afin de faire apparaître le menu contextuel et en choisissez « Edition » (Edit) ou encore passez par Macros / Macros IDE … (Alt+F11) dans le menu Outils (Tools).
.jpg)
Il ne vous reste ainsi plus qu’à découvrir la syntaxe (VB) de création des macros et ensuite à créer les vôtres.
Observez l’exemple suivant permettant d’augmenter la taille de votre font par simple exécution de cette méthode (macro) :
' Increases the font size used within the editor.
Public Sub IncreaseTextEditorFontSize() ' Useful to bind to a keystroke, like Ctrl+Alt+Shift+DownArrow.
Dim textEditorFontsAndColors As Properties
textEditorFontsAndColors = DTE.Properties("FontsAndColors", "TextEditor")
textEditorFontsAndColors.Item("FontSize").Value += fontSizeIncrement
End Sub
Vous remarquerez en tête de module l’exploitation d’un NameSpace « EnvDTE » qui n’est ni plus ni moins que celui qui aidera à exploiter votre environnement de développement (que ce soit les fenêtres, actions, paramètres, etc.). Vous pourrez ainsi manipuler l’entièreté de Visual Studio à partir de cet élément.
Retrouvez l’ensemble des membres de NameSpace à partir de l’adresse suivante : http://msdn.microsoft.com/en-us/library/envdte.aspx
Vous pourrez ainsi créer autant de macros que vous le souhaitez ! Par exemple, la suivante permet une recherche de mots-clés (syntaxes de code) directement depuis votre environnement de développement :
Sub GoogleSearch()
Dim strUrl AsString
Dim selection As TextSelection = DTE.ActiveDocument.Selection()
If selection.Text <> "" Then
strUrl = "www.google.com/search?q=" + selection.Text
DTE.ExecuteCommand("View.URL", strUrl)
Else
MsgBox("Sélectionnez un élément texte")
End If
End Sub
(NDLR : personne pour “http://search.live.com/results.aspx?q=” ?)
Générez votre code à partir des Macros de Visual Studio 2008 |
Mais les macros pourront également vous servir à créer un premier niveau de génération de code ou tout au moins à effectuer des opérations que vous ne pourriez malheureusement faire grâce aux Codes-Snippets. Prenons un exemple relativement simple de génération des membres d’une classe (propriétés – champs) à partir d’une collection de couples « Nom – Type » où le nom est le nom à affecter au membre et le type, celui qui lui est associé. Cette génération devra également s’exécuter dans le bon contexte du langage exploité par l’utilisateur.
Voyons le résultat fonctionnel avant d’explorer un tant soit peu le code en supposant le code suivant dans notre classe employe :
Public Class Employe
Nom String
Prenom String
Salaire Decimal
End Class
Après l’exécution de notre Macro, nous obtiendrions le code suivant :
Public Class Employe
Private _Nom AsString
Private _Prenom As String
Private _Salaire As Decimal
Public Property Nom() As String
Get
Nom = _Nom
End Get
Set (ByVal value AsString)
_Nom = value
End Set
End Property
Public Property Prenom() As String
Get
Prenom = _Prenom
End Get
Set (ByVal value AsString)
_Prenom = value
End Set
End Property
Public Property Salaire() As Decimal
Get
Salaire = _Salaire
End Get
Set (ByVal value AsDecimal)
_Salaire = value
End Set
End Property
End Class
Ceci s’exécute ainsi en moins d’une seconde, délais que vous ne pourriez malheureusement pas obtenir même avec les Codes-Snippets.
Alors comment fonctionne cette macro ? Rien de plus simple ! L’algorithme associé et le code sont relativement basiques, il vous suffit de développer une méthode qui se charge de parcourir votre sélection (la collection de couples nom-type) et pour chaque itération effectuer une manipulation de brute force (génération de texte) en y ajoutant les éléments manquants.
Voici un extrait du point central de cette macro :
Public Sub GenererProprietes() ' Methode public de la macro
' Recuperation de l'extention du fichier
Dim file As String = DTE.ActiveDocument.FullName
Dim fileType AsString = FileIO.FileSystem.GetFileInfo(file).Extension
' Recuperation du texte selectionné
Dim textSelection As TextSelection = DTE.ActiveDocument.Selection()
' Recuperation des n° de lignes de debut et fin
' du texte selectionné
Dim start_line, end_line As Integer
start_line = textSelection.TopPoint.Line
end_line = textSelection.BottomPoint.Line
' Initialisation des tampons a vide
tampon_proprio = ""
tampon_var = ""
' Test si du texte est selectionné
If textSelection.Text = ""Then
MsgBox("Aucun texte selectionné !", MsgBoxStyle.Critical, "Erreur")
ElseIf fileType <> ".vb" And fileType <> ".cs"Then
' Test du langage : VB.net ou C# !
MsgBox("Cette macro ne peut s'executer que sur des fichiers VB.net (.vb) ou C# (.cs) !", MsgBoxStyle.Exclamation, "Erreur de langage")
Else
' Boucle pour toutes les lignes selectionnés
For i As Integer = start_line To end_line
' Allez puis selectionner la ligne
textSelection.GotoLine(i)
textSelection.SelectLine()
' Enregistrement dans tab (2 dimension) du nom et du type de la propriete
Dim tab As String() = FormatTab(textSelection.Text.Split(" "))
' Si ce n'est pas vide, on crée la variable et la propriete
If (tab(0) <> "" Or tab(0) <> Nothing) And (tab(1) <> "" Or tab(1) <> Nothing) Then
' Création de la variable stoké dans tampon_var
tampon_var = tampon_var + CreateVariable(tab(0), tab(1), fileType) + vbCrLf
' Création de la propriete
CreatePropriete(tab(0), tab(1), fileType)
End If
Next
' On suprrime le texte original
For j As Integer = start_line To end_line
textSelection.GotoLine(start_line)
textSelection.SelectLine()
textSelection.Delete()
Next
' Pour finir, on insert les declarations des variables
textSelection.Insert(tampon_var)
textSelection.NewLine()
' .... et les proprietes
textSelection.Insert(tampon_proprio)
End If
'Fin :-)
End Sub
Retrouvez l’entièreté du code depuis le blog de mon assistant Sébastien Warin à l’adresse suivante : http://sebastien.warin.fr/2006/02/07/7-macrosebgenererproprietes/
Retrouvez d’autres exemples de macros et liens à l’adresse suivante : http://blogs.developpeur.org/redo/search.aspx?q=macros&p=1
Mais revenons maintenant à notre solution, et plus précisément à la classe Employe que nous étions occupés à construire. Celle-ci venant d’être développée en moins de temps qu’il n’a fallu pour le dire, nous pouvons poursuivre notre exemple en ajoutant une nouvelle classe « EmployeMgr » qui aura pour tâche de définir un Generics pour notre classe Employe.
Public Class EmployeMgr
Public SharedFunction EmployeList() As List(Of Employe)
Dim empList AsNew List(Of Employe)
empList.Add(New Employe With {.Nom = "Gregory", _
.Prenom = "Renard", _
.Salaire = 30})
empList.Add(New Employe With {.Nom = "Aurelien", _
.Prenom = "Verla", _
.Salaire = 40})
empList.Add(New Employe With {.Nom = "Renaud", _
.Prenom = "Comte", _
.Salaire = 50})
Return empList
End Function
End Class
Etendez la Boîte à Outils de Visual Studio 2008 |
Vous avez la possibilité d’ajouter aisément de nouveaux contrôles en plus des contrôles traditionnels en insérant un nouveau Tab (Groupe de contrôles) et en faisant un clic droit sur celui-ci afin d’y ajouter de nouveau Items (contrôles) comme suit :
.jpg)
Vous avez aussi la possibilité d’ajouter des briques de codes sous forme de raccourcis (copier/coller). Comment réaliser ceci ? Rien de plus simple, il vous suffit de copier la parcelle de code cible et de la coller directement dans la boite à outils qui dans le cas d’un fichier de code ouvert est initialement vide. Cette fonctionnalité, très utile dans le cadre de démonstrations et de formations vous immunisera à l’effet démo.
Soyez cependant vigilant lors de la création de vos Items car ceux-ci ne sont enregistrés qu’à la fermeture de Visual Studio. L’enregistrement s’effectue dan le fichier « CurrentSettings.vssettings » se trouvant dans le répertoire : C:\Users\<VotreNom>\Documents\Visual Studio 2008\Settings
La couche métier de la solution étant maintenant terminée, attaquons-nous à la partie interface utilisateur. Pour cela, créez un nouveau projet de type Winform au sein de votre solution et adaptez le Form1 comme suit :
.jpg)
Il ne nous reste plus qu’à travailler la partie code de ce formulaire afin de charger les données depuis la collection d’employés de la classe EmployeMgr.