|
Site |
Cours VB.net |
|
|
|
Comprendre le code crée par VB. |
|
|
Comprendre le code généré automatiquement par Vb quand on crée une formulaire ou un contrôle.
Code généré automatiquement lors de la création d'un formulaire ou d'un contrôle.
Une application 'Windows Forms' est principalement constituée de formulaires (ou fenêtre), de contrôles et de leurs événements.
Effectivement, pendant la création de l'interface utilisateur de votre application, vous créez généralement une fenêtre contenant des contrôles et des procédures évènements.
Quand vous créer un nouveau projet 'Windows Forms' cela dessine un formulaire, une fenêtre vide et le code correspondant. Ajoutons y un bouton cela donne l'interface utilisateur suivante:

Comme on l'a vu, VB crée le code correspondant et dans ce code une Classe correspondant à la fenêtre
Décortiquons le code:
Vb crée une Class nommé Form1, elle est public (accessible partout)
Public Class Form1
End Class
En VB.Net 2003:
L'onglet Form1.vb contient la Class.
Cette Classe hérite des propriétés de la Classe Form (celle ci est fournis par le Framework)
Inherits System.Windows.Forms.Form

(On rappelle que la véritable fenêtre, l'objet sera instancié à partir de cette classe)
Ensuite il y a une région (partie du code que l'on peut 'contracter' et ne pas voir ou 'dérouler'; Cette région contient :" Le Code généré (automatiquement) par le Concepteur Windows Form ", si on le déroule en cliquant sur le '+', on voit:
-Le constructeur de la fenêtre: la routine Sub New
MyBase fait référence à la classe de base,
MyBase.New appelle le constructeur de la classe de base (Form dans notre cas)
-Le destructeur de la fenêtre: la routine Sub Dispose
-Le créateur des contrôles de la fenêtre: la procédure Sub InitializeComponent
Elle est nécessaire pour créer les contrôles et définir les propriétés de ces contrôles:
Exemple : création d'un label Me.Label1= NewSystem.Windows.forms.Label
Modification d'une propriété:Me.Label.Text="Hello"
Elle définie aussi les propriétés du formulaire:
Me.Name = "Form1"
Exemple d'un formulaire vide nommé Form1
Public Class Form1
Inherits System.Windows.Forms.Form
#
Region " Code généré par le Concepteur Windows Form " Public Sub New() MyBase.New() 'Cet appel est requis par le Concepteur Windows Form.InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent() End Sub 'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Thencomponents.Dispose()
End If End If MyBase.Dispose(disposing) End Sub 'Requis par le Concepteur Windows Form Private components As System.ComponentModel.IContainer 'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form 'Elle peut être modifiée en utilisant le Concepteur Windows Form. 'Ne la modifiez pas en utilisant l'éditeur de code.<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent() ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 266) Me.Name = "Form1" Me.Text = "Form1" End Sub#
End Region
End Class
Si dans la fenêtre Design on ajoute un bouton Button1 cela ajoute
le code:Cette ligne contenant WithEvents indique qu'il y a une gestion d'évènement sur les boutons.
Friend WithEvents Button1 As System.Windows.Forms.Button
Puis dans Sub InitializeComponent()
Cette ligne créée le bouton.
Me.Button1 = New System.Windows.Forms.Button
Cette ligne le positionne:
Me.Button1.Location = New System.Drawing.Point(56, 144)Cette ligne lui donne un nom.
Me.Button1.Name = "Button1"
Cette ligne détermine sa taille
Me.Button1.Size = New System.Drawing.Size(104, 24)
Cette ligne indique ce qui est affiché sur le bouton
Me.Button1.Text = "Button1"
Cela donne:
Private
components As System.ComponentModel.IContainerFriend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent() Me.Button1 = New System.Windows.Forms.Button Me.SuspendLayout() ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(56, 144) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(104, 24) Me.Button1.TabIndex = 0 Me.Button1.Text = "Button1"
En VB.Net 2005:
L'onglet Form1.vb contient:
Public
Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End SubPublic Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent() '<=======Appel d'une routine qui 'initialise les composants de la form
' Add any initialization after the InitializeComponent() call.
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
End Sub
Le Code généré par le 'Concepteur Windows Form' est par contre caché, il n'apparaît pas dans la Class Form1, il faut pour y avoir accès, passer par le menu de droite:
Si on clique sur InitializeComponent, l'onglet Form1.Designer.vb apparaît.
On a ainsi accès à InitialiseComponent et à Dispose qui sont dans une classe Partielle de Form1.
(En VB 2005, une Classe peut être 'découpée' en Classes partielles)
C'est ici qu'il est indiqué que la Class hérite de System.Windows.Forms.Form
Exemple du contenu de Dispose et ItinialiseComponent:
Partial
Public Class Form1 Inherits System.Windows.Forms.Form 'Form overrides dispose to clean up the component list.<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'Button1
'
Me.Button1.FlatStyle = System.Windows.Forms.FlatStyle.System
Me.Button1.Location = New System.Drawing.Point(47, 38)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(177, 42)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
...
Pour VB.Net 2003 et 2005:
Les procédures évènements correspondant au formulaire par exemple sont automatiquement créées:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End SubAttention : Form1_Load est un nom de Sub donné par VB, mais cela pourrait être n'importe quoi, ce qui indique l'évènement déclencheur est ce qui est après Handles ( MyBase.Load ici).
Les 2 paramètres sont:
sender l'objet à la source de l'événement (l'objet quia déclenché l'évènement: ici la form)
e un objet EventArgs qui détaille l'événement qui s'est produit et fournissant des informations sur cet évènement.
On constate qu'il y a une liaison entre la fenêtre Design et le code généré; on pourrait modifier dans le code l'interface utilisateur. C'est déconseillé d'aller trafiquer dans cette zone
de "Code généré par le Concepteur Windows Form ", il faut mieux faire des modifications dans la partie design et dans la fenêtre de propriété.
Substitution de procédures évènement:
Il est possible de substituer une
méthode (utiliser sa propre méthode à la place de la méthode normale qui existe
normalement dans un contrôle)
Exemple 1 créer un contrôle simple affichant toujours 'Bonjour'
Il faut créer une classe héritant des 'Control', détourner son évènement OnPaint qui dessine le contrôle ( avec Overides) Dans la nouvelle procédure On Paint simplement afficher 'Bonjour'
Public Class ControleAffichantBonjour
Inherits Control
Overrides Protected Sub OnPaint ( e As PaintEventArgs )
e.Graphics.DrawString ("Bonjour", Font, new SolidBrush(ForeColor)
End Sub
End Class
Cet exemple ne sert strictement à rien!! Pour une fois!!
Il est aussi possible de détourner des évènements.
Dans le chapitre 'Impression' il y a un bel exemple de création de "lien" entre un objet printdocument et la routine évènement PrintPage (imprimer hello avec un printdocument)
Exemple 2 créer un bouton personalisé.
1-Il faut créer une classe qui hérite de Button:
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 dans la classe, 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.
Dans le chapitre suivant on va utiliser ces connaissances pour, dans le code, créer soi-même des contrôles et leurs évènements.
|
|
|
|
|