Visual Studio est l'environnement de développement proposé par Microsoft. Il permet d'utiliser différents langages et ceci au sein d'un même projet. Cet environnement allège un certain nombre de tâches, mais contrairement à VB6 le code généré n'est pas masqué, ce qui pourra troubler dans un premier temps. Nous allons le découvrir ici. Ceci s'adresse aux lecteurs familiers avec la programmation événementielle.
Création d'un projet.
Après avoir lancé Visual Studio.net, faire Fichier/Projet/Nouveau. Une fenètre s'ouvre permettant de sélectionner différents éléments :
Nous avons sélectionné une application Windows en C#.
Cliquer sur OK.
Le projet s'ouvre sur le projet avec différentes fenètres, dont l'une correspondant au formulaire de démarrage.
Si nous ouvrons l'explorateur de solutions (Affichage/Explorateur de solutions), nous obtenons l'écran suivant :
Le projet AppliTest contient :
Analyse du code du formulaire.
Si on passe en mode "code" Affichage/Code (ou click droit sur le formulaire) on peut reconnaître le code C# généré, commentons les points particuliers :
VS.net propose un mécanisme de pliage/dépliage du code en cliquant sur les plus ou moins présents à la marge gauche de la page de code.
Par ailleurs, on peut ateindre une partie du code en sélectionnant dans les listes déroulantes les objets et leurs membres :
Ajoutons un bouton dans le formulaire. Pour cela ouvrons la boite à outil sur la gauche et insérons on bouton; affichons sa page de propriétés : sélection du bouton, click droit/propriété (ou Affichage/Fenêtre propriétés et sélection du bouton dans les propriétés).
Les propriétés sont triées par catégories :
Ajoutons du code dans l'événement click :
Pour cela sélectionner et double-cliquer sur l'événement Click du bouton dans la page de propriétés :
private void btnOK_Click(object sender, System.EventArgs e)
{
MessageBox.Show("Bonjour");
}
Lancer l'application.
Attention, contrairement
à VB6, la gestion des événements est parfois délicate;
si vous supprimez un événement dans la page de code il faudra
en supprimer sa référence dans la méthode InitializeComponents.
Une première application. Réviser ses tables de multiplication.
Construisons un petit logiciel qui contiendra deux formulaires, l'un pour afficher la table de multiplication souhaitée et l'autre pour proposer 5 questions concernant une table choisie par l'utilisateur, celui-ci a deux essais par questions avec 0, 1 ou 2 points selon le résultat. A la fin de l'interrogation un message annonce le résultat.
Voici une description du scénario sous la forme d'un cas d'utilisation (UML) qui décrit les interactions entre le système et l'acteur.
Cas d'utilisation : révision d'une table de multiplication
Acteur principal : l'apprenant
Scénario normal
1. le système présente une interface de sélection de table de multiplication
2. l'apprenant indique la table
3. le système pose une question aléatoire
4. l'apprenant fournit sa réponse.
5. le système évalue la réponse : 0, 1 ou 2 points selon le numéro de l'essai. Retour à 3.
Scénarios alternatifs.
3.1 5 questions ont été posées, le système donne une évaluation générale.
Enchaînement des écrans.
Nous allons mettre en oeuvre la notion de MDI (Multiple Document Interface). Ceci permet d'avoir un formulaire parent conteneur d'autres formulaires, un menu unique sera utilisé. Une application MDI comprend un formulaire conteneur et des formulaires nommés MDI child.
Ouvrez un nouveau projet. Dans le formulaire présent indiquer qu'il sera le formulaire conteneur :
Nommer ce formulaire FrmMenu, modifier sa propriété text :"Révision des tables".
Ajouter deux formulaires : Projet/Ajouter un formulaire Windows :
Dans le formulaire conteneur ajouter un composant de type MainMenu à partir de la boite à outils.
Nommer le pemier Item MnFichier avec comme propriété Text "&Fichier" (le symbole & indique que ce menu peut être atteint par les touches ALT+F); ajouter un sous-menu Quitter. Dans le deuxième Item Lancer, deux sous-menus figureront : Réviser et Interrogation (MnRevise et MnInterro). Exécuter (F5).
Lorsque l'on cliquera sur le menu Réviser une fenètre FrmRevise doit s'ouvrir :
Dans le code de l'événement click de MnRevise :
private void MnRevise_Click(object sender, System.EventArgs e)
{
FrmRevise frmRevise =
new FrmRevise();
frmRevise.MdiParent =
this;
frmRevise.Show();
}
Nous devons construire une instance de la classe FrmRevise (première ligne); cette instance demande à devenir une MDI child du formulaire courant, ici this, (deuxième ligne); enfin l'objet se montre (troisième ligne).
Contrairement à
VB6, il ne suffit pas de créer des formulaires pour les rendre utilisable;
en effet un formulaire est une classe et toute utilisation d'un formulaire passe
par la création d'instance (opérateur new). Ce n'est pas le cas
pour les composants graphiques qui sont déja des objets. Ainsi pour les
formulaires la propriété Name désigne une classe
mais pour les composants graphiques cette propriété désigne
une instance.
Faire de même pour le menu Interrogation :
private void MnInterro_Click(object sender, System.EventArgs e)
{
FrmInterro frmInterro
= new FrmInterro();
frmInterro.MdiParent=this;
frmInterro.Show ();
}
Vérifier l'enchaînement des formulaires.
Formulaire Réviser
Il propose le design suivant :
Nommons les objets : cmbTable pour le ComboBox et lstTable pour la ListBox
Dans le constructeur de la classe FrmRevise nous ajoutons le code de chargement du ComboBox :
public FrmRevise()
{
InitializeComponent();
cmbTable.Items.Clear();
for(int i = 0 ; i <=9 ; i++)
cmbTable.Items.Add (i);
}
Commentaire :
Les ComboBox (et ListBox) contiennent une collection d'Item appellée Items, nous utilisons la méthode Add pour ajouter un nouvel élément. la méthode Clear vide la collection (recommandé).
Lorsque nous sélectionnons une valeur dans ce ComboBox, on charge la ListeBox; le code doit être écrit dans le la méthode liée à l'événement TextChanged -à utiliser plutôt que l'événement Click- :
private void cmbTable_TextChanged(object sender, System.EventArgs e)
{
int table ;
string ch;
table =Convert.ToInt32( cmbTable.Text);
lstTable.Items.Clear();
for(int i =0; i<=10 ; i++)
{
ch
= table + " * " + i + " = " + table * i;
lstTable.Items.Add(ch);
}
}
Commentaire :
Nous devons convertir la zone de texte cmb.Text en entier, pour cela on utilise la classe Convert qui posssède des méthodes statiques de conversion (cf cours précédent).
Notez l'opérateur de concaténation de chaînes (+)
Formulaire interrogation
L'interface se présente ainsi :
La classe FrmInterro devra être modifiée au niveaux de ses membres privées :
description des attributs privés
On rajoute les attributs privés :
/// /// Variable nécessaire au concepteur.
private int NumQuestion = 0;
private int NumEssai =0;
private int NbPoints = 0;
private int Resultat = 0;
Commentaire : noter l'initialisation au moment de la déclaration
chargement
du ComboBox cmbTable
C'est identique que pour le formulaire précédent, on rajoute dans le constructeur :
InitializeComponent();
cmbTable.Items.Clear();
for(int i = 0;i<=9;i++)
cmbTable.Items.Add (i);
la
méthode InitQuestion :
C'est elle qui gère les initialisations nécessaire au début de chaque question :
private int InitQuestion()
{
int table,nbAlea;
this.NumQuestion++;
this.NumEssai=1;
table = Convert.ToInt32(cmbTable.Text);
Random r = new Random ();
nbAlea = r.Next(10);
txtTable.Text = cmbTable.Text ;
txtAlea.Text = nbAlea.ToString();
lblQuestion.Text = "Question "+ this.NumQuestion
;
return this.Resultat= nbAlea * table;
}
Commentaires :
Cette méthode est appelée dans un premier temps au moment du démarrage des questions :
private void btmCommencer_Click(object sender, System.EventArgs e)
{
this.Resultat = InitQuestion();
}
validation
des réponses
Ceci à lieu lorsque l'utilisateur valide sa réponse :
private void btnValider_Click(object sender, System.EventArgs e)
{
int reponse = Convert.ToInt32(txtReponse.Text );
if(this.NumQuestion<=5)
{
if(this.NumEssai==1 )
{
if(reponse
==this.Resultat)
{
this.NbPoints+=2;
MessageBox.Show("Bravo!");
InitQuestion();
}
else
{
MessageBox.Show("Faux,
encore un essai");
this.NumEssai
++;
}
}
else
{
if( reponse==this.Resultat
)
{
this.NbPoints++;
MessageBox.Show(
"C'est bien");
InitQuestion();
}
else
{
MessageBox.Show(
"C'est encore faux ");
InitQuestion();
}
}
lblNbPoints.Text="Nombre de points :"+this.NbPoints
;
txtReponse.Text="";
txtReponse.Focus();
}
}
}
Commentaires :