|
Site |
Cours VB.net |
|
|
|
Créer un composant. |
|
|
On a vu qu'on pouvait CREER SES PROPRES CLASSES dans un projet, mais on peut aussi:
créer une Classe autonome qui sera utilisée par plusieurs autres programmes, c'est une Bibliothèque de Classe.
créer un contrôle utilisateur utilisé lui aussi par d'autres programmes.
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?
Si la bibliothèque de Classe a été compilée, on obtient une DLL:
-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.
On peut travailler en même temps sur l'application cliente et le projet de la bibliothèque de Classe en les chargeant tous les 2 dans une solution.
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.UserControlEnd 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.ButtonEnd 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 SubOn 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.UserControlEnd 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.
|
|
|
|
|