Site:  Cours VB.net  
5.3 Créer un composant.

On a vu qu'on pouvait CREER SES PROPRES CLASSES dans un projet, mais on peut aussi:

Maintenant nous allons créer des classes ou contrôles, ils seront utilisés par une application cliente.

 

A-Créer une Bibliothèque de Classe:

Pour créer une bibliothèque de Classe, il faut faire menu 'Fichier', 'Nouveau', 'Projet':

Cliquer sur l'icône 'Bibliothèque de Classes'.

Le nom par défaut est ClassLibrary1 , valider sur Ok.

Dans la fenêtre principale, il y a:

Public Class Class1

End Class
 

On peut écrire le code, la description d'une classe avec ses propriétés, ses méthodes, ses constructeurs...(Voir page précédente)

On peut ajouter une autre Classe (Menu Projet, ajouter une Classe), ou importer une Classe (Menu Projet, Ajouter un élément existant)

 

Il n'y a pas de procédure Sub Main. (c'est évident, un composant n'est jamais autonome; c'est l'application cliente qui a cette procédure).

Une bibliothèque de classe ne possède pas les composants que possède une application Windows, il n'y a pas d'interface utilisateur, pas de MessageBox, pas de gestion du curseur; c'est l'application cliente qui s'occupe de gérer l'interface.

 

NameSpace:

Permet de créer un espace de nom dans le composant:

NameSpace Outils

End

 

Il peut y avoir plusieurs niveau:

NameSpace Outils

NameSpace Marteau

....

End

End

 

Equivalent à:

NameSpace Outils

Classe Marteau

....

End Class

End

 

Dans l'application il faudra après avoir référencé le composant (la Dll) importer l'espace de nom pour utiliser le composant.

Imports Outils.Marteau

 

Utilisation du composant:

 

Il faut enfin enregistrer la bibliothèque, la compiler.

 

Comment utiliser ce composant?

-Il faut la référencer: Ajouter la Dll au projet (Menu Projet, Ajouter une référence)

-Importer l'espace de nom par Imports Espace de nom au début du module.

-On peut ensuite utiliser la Classe dans l'application cliente.

 

B- Créer un 'contrôle utilisateur' à partir d'un contrôle existant en le modifiant:

Permet de créer un contrôle spécifique qui enrichira la 'Boite à outils' :

(Pour les 'anciens' c'est comme un contrôle OCX, sauf que c'est un contrôle .NET et que c'est un  fichier .dll)

Exemple: Créer un bouton avec un aspect spécifique à partir du bouton habituel (Ajout d'un cadre).

 

1-Il faut créer une bibliothèque de contrôle:

Pour créer une bibliothèque de Contrôle, il faut faire menu Fichier, Nouveau, Projet, Icône 'Bibliothèque de contrôle Windows' : Nom du projet: WindowControle par exemple.

On obtient une fenêtre qui ressemble à un formulaire mais sans bord,on peut y ajouter un contrôle (un bouton par exemple )

Si on regarde le code correspondant, Vb a crée une Classe UserControl1 qui hérite de la classe  Forms.UserControl

Public Class UserControl1

Inherits System.Windows.Forms.UserControl

End Class

 

Il suffit de substituer à UserControl le nom du contrôle que vous voulez utiliser comme base pour hériter de tous ses éléments. On remplace donc par:

Public Class MonBouton

Inherits System.Windows.Forms.Button

End Class

 

Le 'Design' devient:

 

 

2-Il faut modifier l'aspect graphique du bouton:

Pour cela si vous voulez modifier l’apparence du contrôle, il faut remplacer la méthode OnPaint de Button par la votre(celle-ci dessine le contrôle). Au sein de cette méthode, vous devez appeler la méthode OnPaint de la base (de la classe mère), puis  ajouter vos propres fonctions de dessin.

Il faut donc ajouter la procédure:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

MyBase.OnPaint(e) 'Appel à la méthode de la classe de base, ce qui dessine le bouton

Dim myPen As New Pen(Color.Purple, 3)

e.Graphics.DrawRectangle(myPen, 3, 3, Me.Width - 6, Me.Height - 6) 'Ajoute un cadre sur le dessin du bouton

End Sub

On rappelle que l'argument e  est le graphique du bouton.

 

3-Compilation:

Quand le composant est terminé il faut créer la Dll:

Menu 'Générer' puis 'Générer WindowControle'

On obtient WindowControle.Dll dans le répertoire /bin sous les sources.

 

4-Utilisation du composant dans une autre application VB.

Dans un autre projet VB, si je veux utiliser mon composant MonBouton, il faut l'ajouter dans la boite à outils:

Pour cela cliquer avec le bouton droit de la souris dans la boite à outils. Un menu contextuel s'ouvre, cliquer sur 'Ajouter/Supprimer des éléments' puis dans la fenêtre qui s'ouvre cliquez sur 'parcourir'.. cliquez sur WindowControle.Dll , le composant MonBouton apparaît dans la Boite à outils.

 

Il suffit de le saisir et de le déplacer dans un des formulaires comme un bouton normal.

 

Toutes les procédures évènements (Comme MonBouton1_Click) sont disponibles; elles ont été héritées de Button.

 

Ce qu'il faut comprendre:

C'est que votre nouveau bouton hérite de Control, une classe qui possède un grand nombre d’événements et de méthodes qui n’apparaissent pas dans les listes déroulantes, car inutile dans l’utilisation de l’objet mais très utile dans le comportement d'un objet. C’est le cas de OnPaint OnKeyDown et OnMouseDown...qui déclenchent les évènement Paint, KeyDown, MouseDown. On redéfini ces méthodes (avec Overrides), dans la méthode redéfini on appelle quand même la méthode de la classe mère puis on ajoute les modifications de fonctionnalités .

Exemple:

Différencier une zone droite et une zone gauche sur le bouton:

On utilise l'évènement OnMouseDown, il a pour paramètre e qui contient les coordonnées de la souris (e.x et e.y)

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
 

MyBase.OnMouseDown(e) 'Appel à la méthode de la classe de base
If e.X < Me.Width / 2 Then
    MessageBox.Show("Click sur partie gauche")
Else
    MessageBox.Show("Click sur partie droite")
End if
End Sub

 

MessageBox peut être remplacé par un raisevent pour déclencher un évènement.

 

On vient de créer un composant héritant d'un contrôle, puis on en a modifié les fonctionnalités.

 

C- Créer un 'contrôle utilisateur' contenant un ou plusieurs contrôles pilotés:

 

Pour créer une bibliothèque de Contrôle (un contrôle utilisateur), il faut faire menu Fichier, Nouveau, Projet, Icône 'Bibliothèque de contrôle Windows' : Nom du projet: WindowControle par exemple.

On obtient une fenêtre qui ressemble à un formulaire mais sans bord,on peut y ajouter un contrôle (un textBox par exemple comme ici) ou plusieurs contrôles.

 

Attention: ici la zone de fond grise est importante, le contrôle crée correspond à la totalité de la zone grise du formulaire sans bord, ce qui n'est pas pratique quand on utilise le contrôle (j'en ai dessiné un petit, et je ne voyais pas la textebox!!) Il est donc conseillé de réduire la surface.

 

Si on regarde le code correspondant, Vb a crée une Classe UserControl1 qui hérite de la classe  Forms.UserControl

Public Class UserControl1

Inherits System.Windows.Forms.UserControl

End Class

 

Dans ce Usercontrol il y a les procédures privées des évènements des composants,

Private Button1_Click

End Sub

Bien sur, elles ne seront pas visibles ni accessibles par l'utilisateur du composant.

 

L'interface du Usercontrol (ce que verra l'utilisateur du composant) est créer de toute pièce comme dans un module de Class.

Si on double-clique sur le fond, on voit quand même apparaître:

Private Sub UserControl1_Load(..

End Sub

Mais il faut rajouter des membres publiques qui seront accessibles à l'utilisateur du composant. On utilise pour cela les 'Property', 'Sub' et 'variables' publiques pour créer une interface. Le code contenu dans ces procédures de l'interface va 'piloter' le ou les contrôles (comme le TextBox1). Ce code modifie (dans notre exemple) le comportement du TextBox initial.  

Ici je vais créer une propriété LeTexte qui est le texte qui sera affiché dans le TextBox1. Cette propriété LeTexte va 'piloter' TextBox1.text. Je modifie le comportement de TextBox1.text en empêchant d'afficher Toto (c'est idiot!! ).

Public Property LeTexte() As String

    Get

        LeTexte=TextBox1.Text

    End Get

    Set (ByVal Value As String)

        If Value <> "toto" Then

            TextBox1.Text= Value

        End if

    End Set

End Property

 

Je génère la solution, ajouter WindowControle.Dll à la boite à outils, je met le nouveau composant sur un formulaire; il se nommera UserControl1.

 

Pour utiliser la propriété précédemment écrite :

UserControl1.LeTexte="lulu"    'lulu apparaît dans le textbox

 

UserControl1.LeTexte="toto"    'rien n' apparaît dans le textbox: : j'ai bien modifié le comportement du textbox et c'est transparent pour l'utilisateur.

 

On vient de créer un composant avec la Classe UserControl (au lieu de Forms dans un formulaire ), on a écrit son interface.

Remarque: si on veut avoir accès à une  sub événement  du controle qui est dans un composant, il faut que dans le composant la Sub évènement soit Public.

 

Autre exemple:

Voir cet autre remarquable exemple  de création d'un composant (par CGi et neo51 sur developpez.com): Composant horloge: code source, explication claire: un régal.