• Aucun résultat trouvé

5 Interfaces graphiques

5.5 Composants non visuels

Nous nous intéressons maintenant à un certain nombre de composants non visuels : on les utilise lors de la conception mais on ne les voit pas lors de l'exécution.

5.5.1

Boîtes de dialogue OpenFileDialog et SaveFileDialog

Nous allons construire l'application suivante :

Les contrôles sont les suivants :

type nom rôle

1 TextBox TextBoxLignes texte tapé par l'utilisateur ou chargé à partir d'un fichier

MultiLine=True, ScrollBars=Both, AccepReturn=True, AcceptTab=True

2 Button buttonSauvegarder permet de sauvegarder le texte de [1] dans un fichier texte 3 Button buttonCharger permet de charger le contenu d'un fichier texte dans [1] 4 Button buttonEffacer efface le contenu de [1]

5 SaveFileDialog saveFileDialog1 composant permettant de choisir le nom et l'emplacement du fichier de sauvegarde de [1]. Ce composant est pris dans la barre d'outils [7] et simplement déposé sur le formulaire. Il est alors enregistré mais il n'occupe pas de place sur le formulaire. C'est un composant non visuel.

6 OpenFileDialog openFileDialog1 composant permettant de choisir le fichier à charger dans [1]. Le code associé au bouton Effacer est simple :

1. private void buttonEffacer_Click(object sender, EventArgs e) { 2. // on met la chaîne vide dans le TexBox

3. textBoxLignes.Text = ""; 4. }

Nous utiliserons les propriétés et méthodes suivantes de la classe SaveFileDialog :

Champ Type Rôle

1

2 3 4

string Filter Propriété les types de fichiers proposés dans la liste déroulante des types de fichiers de la boîte de dialogue

int FilterIndex Propriété le n° du type de fichier proposé par défaut dans la liste ci-dessus. Commence à 0. string InitialDirectory Propriété le dossier présenté initialement pour la sauvegarde du fichier

string FileName Propriété le nom du fichier de sauvegarde indiqué par l'utilisateur

DialogResult.ShowDialog() Méthode méthode qui affiche la boîte de dialogue de sauvegarde. Rend un résultat de type DialogResult.

La méthode ShowDialog affiche une boîte de dialogue analogue à la suivante :

1 liste déroulante construite à partir de la propriété Filter. Le type de fichier proposé par défaut est fixé par FilterIndex 2 dossier courant, fixé par InitialDirectory si cette propriété a été renseignée

3 nom du fichier choisi ou tapé directement par l'utilisateur. Sera disponible dans la propriété FileName

4 boutons Enregistrer/Annuler. Si le bouton Enregistrer est utilisé, la fonction ShowDialog rend le résultat DialogResult.OK La procédure de sauvegarde peut s'écrire ainsi :

1. private void buttonSauvegarder_Click(object sender, System.EventArgs e) { 2. // on sauvegarde la boîte de saisie dans un fichier texte

3. // on paramètre la boîte de dialogue savefileDialog1

4. saveFileDialog1.InitialDirectory = Application.ExecutablePath;

5. saveFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"; 6. saveFileDialog1.FilterIndex = 0;

7. // on affiche la boîte de dialogue et on récupère son résultat 8. if (saveFileDialog1.ShowDialog() == DialogResult.OK) {

9. // on récupère le nom du fichier

10. string nomFichier = saveFileDialog1.FileName;

11. StreamWriter fichier = null;

12. try {

13. // on ouvre le fichier en écriture 14. fichier = new StreamWriter(nomFichier); 15. // on écrit le texte dedans

16. fichier.Write(textBoxLignes.Text); 17. } catch (Exception ex) {

18. // problème

19. MessageBox.Show("Problème à l'écriture du fichier (" +

20. ex.Message + ")", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

1 2

22. } finally { 23. // on ferme le fichier 24. if (fichier != null) { 25. fichier.Dispose(); 26. } 27. } 28. } 29. }

ligne 4 : on fixe le dossier initial (InitialDirectory) au dossier (Application.ExecutablePath) qui contient l'exécutable de l'application.

ligne 5 : on fixe les types de fichiers à présenter. On notera la syntaxe des filtres : filtre1|filtre2|..|filtren avec filtrei= Texte|

modèle de fichier. Ici l'utilisateur aura le choix entre les fichiers *.txt et *.*.

• ligne 6 : on fixe le type de fichier à présenter en premier à l'utilisateur. Ici l'index 0 désigne les fichiers *.txt.

• ligne 8 : la boîte de dialogue est affichée et son résultat récupéré. Pendant que la boîte de dialogue est affichée, l'utilisateur n'a plus accès au formulaire principal (boîte de dialogue dite modale). L'utilisateur fixe le nom du fichier à sauvegarder et quitte la boîte soit par le bouton Enregistrer, soit par le bouton Annuler, soit en fermant la boîte. Le résultat de la méthode

ShowDialog est DialogResult.OK uniquement si l'utilisateur a utilisé le bouton Enregistrer pour quitter la boîte de dialogue.

Ceci fait, le nom du fichier à créer est maintenant dans la propriété FileName de l'objet saveFileDialog1. On est alors ramené à la création classique d'un fichier texte. On y écrit le contenu du TextBox : textBoxLignes.Text tout en gérant les exceptions qui peuvent se produire.

La classe OpenFileDialog est très proche de la classe SaveFileDialog. On utilisera les mêmes méthodes et propriétés que précédemment. La méthode ShowDialog affiche une boîte de dialogue analogue à la suivante :

1 liste déroulante construite à partir de la propriété Filter. Le type de fichier proposé par défaut est fixé par FilterIndex 2 dossier courant, fixé par InitialDirectory si cette propriété a été renseignée

3 nom du fichier choisi ou tapé directement par l'utilisateur. Sera disponible dans la propriété FileName

4 boutons Ouvrir/Annuler. Si le bouton Ouvrir est utilisé, la fonction ShowDialog rend le résultat DialogResult.OK La procédure de chargement du fichier texte peut s'écrire ainsi :

1. private void buttonCharger_Click(object sender, EventArgs e) { 2. // on charge un fichier texte dans la boîte de saisie 3. // on paramètre la boîte de dialogue openfileDialog1

4. openFileDialog1.InitialDirectory = Application.ExecutablePath;

5. openFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"; 6. openFileDialog1.FilterIndex = 0;

7. // on affiche la boîte de dialogue et on récupère son résultat 8. if (openFileDialog1.ShowDialog() == DialogResult.OK) {

9. // on récupère le nom du fichier

1 2

3

10. string nomFichier = openFileDialog1.FileName;

11. StreamReader fichier = null;

12. try {

13. // on ouvre le fichier en lecture 14. fichier = new StreamReader(nomFichier);

15. // on lit tout le fichier et on le met dans le TextBox 16. textBoxLignes.Text = fichier.ReadToEnd();

17. } catch (Exception ex) {

18. // problème

19. MessageBox.Show("Problème à la lecture du fichier (" +

20. ex.Message + ")", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

21. return; 22. } finally { 23. // on ferme le fichier 24. if (fichier != null) { 25. fichier.Dispose(); 26. } 27. }//finally 28. }//if 29. }

ligne 4 : on fixe le dossier initial (InitialDirectory) au dossier (Application.ExecutablePath) qui contient l'exécutable de l'application.

ligne 5 : on fixe les types de fichiers à présenter. On notera la syntaxe des filtres : filtre1|filtre2|..|filtren avec filtrei= Texte|

modèle de fichier. Ici l'utilisateur aura le choix entre les fichiers *.txt et *.*.

• ligne 6 : on fixe le type de fichier à présenter en premier à l'utilisateur. Ici l'index 0 désigne les fichiers *.txt.

• ligne 8 : la boîte de dialogue est affichée et son résultat récupéré. Pendant que la boîte de dialogue est affichée, l'utilisateur n'a plus accès au formulaire principal (boîte de dialogue dite modale). L'utilisateur fixe le nom du fichier à sauvegarder et quitte la boîte soit par le bouton Ouvrir, soit par le bouton Annuler, soit en fermant la boîte. Le résultat de la méthode

ShowDialog est DialogResult.OK uniquement si l'utilisateur a utilisé le bouton Enregistrer pour quitter la boîte de dialogue.

Ceci fait, le nom du fichier à créer est maintenant dans la propriété FileName de l'objet openFileDialog1. On est alors ramené à la lecture classique d'un fichier texte. On notera, ligne 16, la méthode qui permet de lire la totalité d'un fichier.

5.5.2

Boîtes de dialogue FontColor et ColorDialog

Nous continuons l'exemple précédent en y ajoutant deux nouveaux boutons et deux nouveaux contrôles non visuels :

type nom rôle

1 Button buttonCouleur pour fixer la couleur des caractères du TextBox 2 Button buttonPolice pour fixer la police de caractères du TextBox

3 ColorDialog colorDialog1 le composant qui permet la sélection d'une couleur - pris dans la boîte à outils [5].

4 FontDialog colorDialog1 le composant qui permet la sélection d'une police de caractères - pris dans la boîte à outils [5]. Les classes FontDialog et ColorDialog ont une méthode ShowDialog analogue à la méthode ShowDialog des classes OpenFileDialog et

SaveFileDialog.

La méthode ShowDialog de la classe ColorDialog permet de choisir une couleur [1]. Celle de la classe FontDialog permet de choisir une police de caractères [2] : 7 6 1 2 3 4 5

[1] : si l'utilisateur quitte la boîte de dialogue avec le bouton OK, le résultat de la méthode ShowDialog est DialogResult.OK et la couleur choisie est dans la propriété Color de l'objet ColorDialog utilisé.

[2] : si l'utilisateur quitte la boîte de dialogue avec le bouton OK, le résultat de la méthode ShowDialog est DialogResult.OK et la police choisie est dans la propriété Font de l'objet FontDialog utilisé.

Nous avons désormais les éléments pour traiter les clics sur les boutons Couleur et Police :

1. private void buttonCouleur_Click(object sender, EventArgs e) {// choix d'une couleur de texte

2. if (colorDialog1.ShowDialog() == DialogResult.OK) { 3. // on change la propriété Forecolor du TextBox 4. textBoxLignes.ForeColor = colorDialog1.Color;

5. }//if

6. }

7.

8. private void buttonPolice_Click(object sender, EventArgs e) { 9. // choix d'une police de caractères

10. if (fontDialog1.ShowDialog() == DialogResult.OK) { 11. // on change la propriété Font du TextBox 12. textBoxLignes.Font = fontDialog1.Font; 13. }

ligne [4] : la propriété [ForeColor] d'un composant TextBox désigne la couleur de type [Color] des caractères du TextBox. Ici cette couleur est celle choisie par l'utilisateur dans la boîte de dialogue de type [ColorDialog].

ligne [12] : la propriété [Font] d'un composant TextBox désigne la police de caractères de type [Font] des caractères du

TextBox. Ici cette police est celle choisie par l'utilisateur dans la boîte de dialogue de type [FontDialog].

5.5.3

Timer

Nous nous proposons ici d'écrire l'application suivante :

1 2 1 2 3 4 5

n° Type Nom Rôle

1 Label labelChrono affiche un chronomètre

2 Button buttonArretMarche bouton Arrêt/Marche du chronomètre

3 Timer timer1 composant émettant ici un événement toutes les secondes En [4], nous voyons le chronomètre en marche, en [5] le chronomètre arrêté.

Pour changer toutes les secondes le contenu du Label LabelChrono, il nous faut un composant qui génère un événement toutes les secondes, événement qu'on pourra intercepter pour mettre à jour l'affichage du chronomètre. Ce composant c'est le Timer [1] disponible dans la boîte à outils Components [2] :

Les propriétés du composant Timer utilisées ici seront les suivantes :

Interval nombre de millisecondes au bout duquel un événement Tick est émis. Tick l'événement produit à la fin de Interval millisecondes

Enabled rend le timer actif (true) ou inactif (false)

Dans notre exemple le timer s'appelle timer1 et timer1.Interval est mis à 1000 ms (1s). L'événement Tick se produira donc toutes les secondes. Le clic sur le bouton Arrêt/Marche est traité par la procédure buttonArretMarche_Click suivante :

1. using System;

2. using System.Windows.Forms; 3.

4. namespace Chap5 {

5. public partial class Form1 : Form { 6. public Form1() {

7. InitializeComponent();

8. }

9.

10. // variable d'instance

11. private DateTime début = DateTime.Now; 12. ...

13. private void buttonArretMarche_Click(object sender, EventArgs e) { 14. // arrêt ou marche ?

15. if (buttonArretMarche.Text == "Marche") { 16. // on note l'heure de début

17. début = DateTime.Now; 18. // on l'affiche

19. labelChrono.Text = "00:00:00"; 20. // on lance le timer

21. timer1.Enabled = true;

22. // on change le libellé du bouton 23. buttonArretMarche.Text = "Arrêt"; 24. // fin 25. return; 26. }// 27. if (buttonArretMarche.Text == "Arrêt") { 1 2