====== Fiche savoirs : programmation événementielle en C# ====== Dans une application de bureau vous mettez en oeuvre une programmation événementielle qui est différente de la programmation en mode console. ===== L'interface ===== Exemple avec cette application graphique de bureau : {{ :bloc1:bureau_22.png?400 |}} L'interface est graphique et l'utilisateur est maître de l'ordre d'exécution : * il peut décider de saisir 2 nombres, puis de cliquer sur l'opération voulue, * éventuellement de cliquer sur la seconde opération sans modifier les 2 nombres ou en n'en modifiant qu'un seul, * etc. C'est l'utilisateur qui choisit à quel moment doit s'exécuter une commande en fonction des objets graphiques qu'il va solliciter. De plus, l'aspect visuel est nettement plus attractif et intuitif : * l'opération est **posée** pour être plus claire * la ligne permet de bien voir la séparation entre la saisie des nombres et l'affichage du résultat, * les dessins (signes d'opérations) sont plus parlants que le texte… Voici les caractéristiques des objets graphiques : {{ :bloc1:bureau_23.png |}} ^ Nom (name) ^ Type ^ Autres propriétés ^ |txtValeur1|TextBox|TextAlign : Right| |txtValeur2|TextBox|(idem txtValeur1)| |txtResultat|TextBox|(idem txtValeur1)| |lblOperation|Label|Font : Size : 16| |btnAjouter|Button|Font : Size : 20| |Font : Bold : True| | | |btnMultiplier|Button|(idem btnAjouter)| |btnEffacer|Button|Image : image fournie de la gomme ou image de votre choix redimensionnée| |btsQuitter|Button|(idem btnEffacer avec une autre image)| En l'état, l'application peut déjà être testée : les boutons ne sont pas encore actifs mais il est déjà possible de saisir des valeurs dans les zones de saisie. ===== Le code événementiel ===== Voici le code de chaque événement : * **Clic sur btnEffacer : ** Vider les 3 zones de texte et le label de l'opération. private void btnEffacer_Click(object sender, EventArgs e) { txtValeur1.Text = ""; txtValeur2.Text = ""; txtResultat.Text = ""; lblOperation.Text = ""; } * **Clic sur btnQuitter :** Quitter l'application. private void btnQuitter_Click(object sender, EventArgs e) { Application.Exit(); } * **Clic sur btnAjouter :** Afficher le signe **+** dans le label de l'opération. \\ Faire la somme des 2 valeurs saisies (si c'est possible) et la transférer dans txtResultat private void btnAjouter_Click(object sender, EventArgs e) { try { txtResultat.Text = (float.Parse(txtValeur1.Text) + float.Parse(txtValeur2.Text)).ToString(); lblOperation.Text = "+"; } catch { }; } * **Clic sur btnMultiplier :** Afficher le signe "x" dans le label de l'opération. \\ Faire la multiplication des 2 valeurs saisies (si c'est possible) et la transférer dans txtResultat. private void btnMultiplier_Click(object sender, EventArgs e) { try { txtResultat.Text = (float.Parse(txtValeur1.Text) * float.Parse(txtValeur2.Text)).ToString(); lblOperation.Text = "x"; } catch { }; } * **Changement de texte dans txtValeur1 :** Vider l'affichage du résultat et le label de l'opération. private void txtValeur1_TextChanged(object sender, EventArgs e) { txtResultat.Text = ""; lblOperation.Text = ""; } * **Changement de texte dans txtValeur2 :** Vider l'affichage du résultat et le label de l'opération. private void txtValeur2_TextChanged(object sender, EventArgs e) { txtResultat.Text = ""; lblOperation.Text = ""; } ===== Le code non événementiel ===== Il est possible de créer des modules non événementiels, comme dans la programmation procédurale classique, pour optimiser le code. Par exemple, on remarque que le code est identique dans les 2 foncions événementielles sur le changement de texte dans **txtValeur1** et **txtValeur2**. On peut alors créer un module isolé et l'appeler dans les deux procédures événementielles. * **Isoler le code :** Créer un module non événementiel private void AnnuleOperation() { lblOperation.Text = ""; txtResultat.Text = ""; } * **Appeler le module :** Appeler le module dans les procédures événementielles (par exemple pour **txtValeur1**). private void txtValeur1_TextChanged(object sender, EventArgs e) { AnnuleOperation(); }