SUPINFO International University

SUPINFO Institute of Information Technology
Laboratoire Microsoft




Tous les Articles du Laboratoire Microsoft

Les News font peau Neuve...
Accueil > Articles > Actualité
Auteurs 
Olivier BOISNE
LABORATOIRE MICROSOFT


 Tous les articles de cet auteur

3,1/5

Assez Bien


34673
88/278
Sommaire
Partie 1 - Structure d'un programme Windows
Partie 2 - Les MFC et les outils de développement proposés par Visual C++
Partie 3 - Création d'un agenda grace aux MFC

3e partie : Création d'un agenda gâce aux MFC

Manipulation des données membres via UpdateData()


Dans notre précédent exemple "Hello World", vous avez sans doute remarqué l'utilisation d'une fonction nommée UpdateData. Cette fonction permet au programme de récupérer, et d'initialiser les données membres des contrôle d'une fenetre (par exemple, le texte tapé dans un contrôle d'édition).En fournissant l'argument true à cette fonction le programme récupère l'intégralité des données entrés par l'utilisateur via l'interface graphique, et les stock dans les variables créer à cet effet. C'est d'ailleurs la méthode que nous avons utilisé dans notre programme Hello World, nous avons créer une "Member variable" via Class Wizard que nous avons appelé m_nom puis nous appelons la fonction UpdateData(true) lors d'un clic sur le bouton OK. Ainsi le texte tapé dans le contrôle d'édition se retrouve copié dans m_nom.

L'opération inverse est bien évidement possible en passant l'argument false à la fonction UpdateData.Dans ce cas, la valeur stocké dans la "Member Variable" est envoyé dans le contrôle lui étant rattaché. Ainsi si nous stockions dans m_nom la chaine de caractère "Test", et que nous appelions la fonctions UpdateData(false) , le contrôle IDC_NOM aurait affiché "Test".

MFC + Liste chainée = CList

Vous avez certainement déjà utilisé des listes chaînées dans vos programmes au paravent. Si ce n'est pas le cas, sachez que la conception d'une liste chaînée consiste à relier, via l'utilisation de pointeur, une série d'entités de même type, le plus souvent des structures. Chaque entité ayant l'adresse de l'entité ayant l'adresse de la suivante (et de la précédente dans le cas d'une liste doublement chaînée).

L'élaboration d'une liste chaînée, ainsi que le groupe de fonctions permettant de la manipuler étant une opération relativement délicate, Microsoft à inclus dans les MFC la Class CList qui simplifie grandement l'implémentation d'une liste chaînée dans une application. De plus un nombre impressionnant de méthodes permettant de manipuler cette liste chaînée est disponible.

La déclaration d'une liste chaînée CList se fait de la manière suivante:

CList <Type_objet,Type_transfert&> nom_liste;

Type_objet étant le type d'élément qui composera la liste chaînée (par exemple CBox), etType_transfert représente la façon dont les éléments seront injectés dans la liste chaînée, ici il s'agit d'un transfert par référence, il peut également se faire par pointeur ou par valeur (une copie donc). nom_liste étant le nom de l'objet désignant notre liste chaînée. Cet objet possède une batterie de méthodes permettant de manipuler la liste chaînée, en voici quelques une :

Accés de tête ou de fin de liste  
GetHead Renvoie le premier élément de la liste
GetTail Renvoie le dernier élément de la liste
   
Opérations  

RemoveHead

Supprime le premier élément de la liste
RemoveTail Supprime le dernier élément de la liste
AddHead Insert un élément en tête de liste
AddTail Insert un élément en fin de liste
RemoveAll Supprime tous les éléments de la liste
   
Iteration  
GetHeadPosition Retourne la postion du premier élément de la liste
GetTailPosition Retourne la position du dernier élément de la liste
GetNext Renvoie l'élément suivant
GetPrev Renvoie l'élément précédent
   
Récupération et modification  
GetAt Renvoie un élément à une position donnée
SetAt Remplace l'élément d'une position par un autre
   
Insertion  
InsertBefore Insert un élément juste avant celui se trouvant à la position précisée
InsertAfter Insert un élément juste aprés celui se trouvant à la position précisée
   
Recherche  
Find Renvoie la position d'un élément passé en paramêtre
FindIndex Renvoie la position, sur une base d'index de 0, d'un élément passé en paramêtre
   
Status  
GetCount Renvoie le nombre d'élement de la liste
IsEmpty Test si la liste est vide (aucun élément)

 

Comme vous pouvez le constater, ces fonctions sont d'une grande utilité dans la gestion d'une liste chaînée !!!

Pour plus d'information sur CList, consultez la MSDN de Visual C++.

 

Notre programme Agenda pour illustrer ces nouvelles fonctionnalitées

Le but de ce deuxième exemple est de montrer que l'élaboration d'un programme d'une complexité moyenne se fait de manière très simple via les MFC.

Nous allons donc développer un agenda qui stockera (en mémoire uniquement) le nom, prénom, adresse et numéro de téléphone de contacts. Il sera possible d'ajouter, supprimer, modifier et de naviguer dans notre agenda. Il va sans dire que ces contacts seront gérés en mémoire via liste chaînée de type CList.

Etape 1: Création de l'application MFC Agenda avec AppWizzard

 

Puis...

On click sur Finish

 

Etape 2 : Insérer les contrôles de notre agendas comme nous l'avons fais avec "Hello World"

 

On continue, en attribuant à chaque contrôle facilement identifiable

 

ID choisis dans notre exemple:

Contrôle d'édition pour le nom IDC_NOM
Contrôle d'édition pour le prénom IDC_PRENOM
Contrôle d'édition pour l' adresse IDC_ADRESSE
Contrôle d'édition pour le numéro de téléphone IDC_PHONE
Contrôle bouton suivant IDC_NEXT
Contrôle bouton précédent IDC_PREV
Contrôle bouton ajouter IDC_ADD
Contrôle bouton modifier IDC_MODIDY
Contrôle bouton supprimer IDC_DEL

Etape 3 : Ajouter les variables membres des contrôles avec ClassWizzard (Ctrl+W)

 

Etapes 4 : Définir les fonctions qui seront appelé en cas de clic sur un des boutons

 

Etape 5 : Elaboration et ajout de notre class contact dans notre projet Agenda

Nos contact seront en fait des objets d'une class contact ayant 4 variables membres publics de type CString que vous deviner sans doute : nom,prénom,adresse,et phone.

En voici la forme:

class contact

{

public :

CString nom,prenom,adresse,tel;

};

Pour insérer cette classe à notre projet il suffit de cliquer sur Agenda classes dans l'onglet ClassView:

 

Nous choisirons ensuite l'option Generic class comme type de class, car notre classe n'est pas une classe MFC:

 

 

Nous entrons le nom de notre classe, puis validons:

 

Nous constatons que notre classe est maintenant ajouter à notre projet.

Il nous suffit maintenant d'ajouter les 4 membres de cette classe, et l'header de la class CContact dans le .cpp qui l'utilisera (c'est à dire AgendaDlg.cpp).

Pour ajouter ces 4 membres nous faisont un clic droit sur notre class CContact , et choisissont l'option Add Member Variable

 

Dans la fenetre suivante, nous entrons le type de variable, et le nom de la variable, et Visual C++ s'occupe d'injecter cette déclaration à l'intérieur du code

nous recommençons cette opération pour chaque membres à ajouter dans notre classe contact. Puis nous ajoutons "Contact.h" dans AgendaDlg.cpp

 

Etape 6 : Déclaration de notre liste chainée

Maintenant que nous avons notre classe contact, nous pouvons déclarer notre liste chainé reposant sur ce type de class (CContact). Pour se faire nous allons ajouter dans la déclaration de la classe AgendaDlg la ligne de code suivante:

Nous déclarons ainsi un objet CList qui s'apelle list_contact qui stockera sous forme d'une liste chaînée les différents contacts que nous entrerons, ainsi qu'une variable current_pos de type POSITION représentant la position courante dans la liste chainée.

 

Etape 7 : Ajout d'une objet tampon nommé current

Etant donnée que les données récupérer avec UpdateData(true) ne sont pas retourné sous forme d'objet CContact nous de vont créer un objet current dans lequel nous stockerons les valeurs récupérées par le UpdateData.

 

Etape 8 : Editer la méthode OnAdd

Nous devons maintenant éditer le code de la fonction OnAdd pour que les informations entrées dans l'interface soient insérées sous forme d'une entité de la liste chaînée:

Etape 9 : Editer la méthode OnModify

Ici nous allons utiliser la méthode SetAt pour modifier un contact à une position donnée:

 

Etape 10 : Editer la méthode OnDel

Pour supprimer un élément de la liste chainée nous allons utliser la méthode RemoveAt :

Etape 11 : Editer la méthode OnNext

Pour récupérer l'objet suivant dans la liste chaînée list_contact, il suffit d'appeler la méthode GetNext(position_courante). Cette méthode renvoie l'élément suivant celui se trouvant à la position position_courante. Il convient également de vérifier lors d'un appel à la fonction GetNext que nous ne "sortons pas" de la liste chaînée et accédons à des zones mémoires protégées. Le code de la méthode OnNext est donc celui ci:

 

Etape 12 : Editer la méthode OnPrev

Comme vous pouvez l'imaginer très peu de choses différencie cette méthode avec la précédente, nous appelons tous simplement la méthode GetPrev, au lieu de GetNext et nous vérifions si nous ne somme pas au début de la liste avec GetHeadPosition au lieu de GetTailPosition, le reste du code restant inchangé pour des raisons évidentes.

 

Etape 13 : Compiler le projet et l'executer

Après avoir compilé le projet, nous pouvons voir que notre application fonctionne parfaitement bien, et gère toutes les options que nous voulions !!!

Télécharger le code source ici

 

La sérialisation : un puissant systeme de sauvegarde

Bien que notre programme agenda fonctionne parfaitement bien, il à un handicape majeur : les données sont stockées en mémoire, résultat en quittant l'application, nous perdons l'intégralité des informations entrées. Une solution serait de créer un fichier texte, et d'y stocker les informations. Il faudrait alors définir un certain nombre de balises à l'intérieur du fichier texte pour que des fonctions qu'on rajouterait au code puissent se retrouver dans le fichier. Il va sans dire que cela demanderait une quantité de travail supplémentaire non négligeable.

Heureusement Microsoft Visual C++ 6.0 propose une solution permettant de gérer l'intégralité des données manipuler par votre programme. Il s'agit de la sérialisation. Cette méthode permet de sauvegarder des objets et de les recharger en mémoire avec un minimum d'effort, toute la partie concernant la gestion du fichier de sauvegarde est géré par le processus de sérialisation. En fait tous ce qu'il nous reste à faire c'est d'implémenter cette méthode dans nos classes, et de procéder à une sauvegarde ou à un chargement des objets du programme en fonction des besoins de l'utilisateur.

Nous nous servirons donc de la sérialisation pour stocker les informations manipulées par notre agenda, c'est à dire notre liste chaînée contenue dans l'objet list_contact.


Sommaire
Partie 1 - Structure d'un programme Windows
Partie 2 - Les MFC et les outils de développement proposés par Visual C++
Partie 3 - Création d'un agenda grace aux MFC



En Savoir Plus 
Evaluez cet article 


Pour afficher ou poster un commentaire, cliquez sur ce lien : Forum-Microsoft



Retrouvez ci-dessous les autres sections du Laboratoire Microsoft