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
|
|
 |
Pour afficher ou poster un commentaire, cliquez sur ce lien : Forum-Microsoft
|
|