Application Formulaire + avec Visual C++



Documents pareils
Le langage C. Séance n 4

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

Cliquez sur le site que vous souhaitez consulter, il s affichera directement dans le navigateur.

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

ESPACE COLLABORATIF SHAREPOINT

BIRT (Business Intelligence and Reporting Tools)

Construire des plug-ins pour SAS Management Console SAS 9.1

SOMMAIRE. Présentation assistée sur ordinateur. Collège F.Rabelais 1/10

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Access 2007 FF Access FR FR Base

Édu-groupe - Version 4.3

COURS WINDEV NUMERO 3

Formation. Module WEB 4.1. Support de cours

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

FEN FICHE EMPLOIS NUISANCES

Comment accéder à d Internet Explorer

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

Once the installation is complete, you can delete the temporary Zip files..

Tapez le titre de la page «BASTIA ville méditerranéenne», puis allez deux fois à la ligne à l aide de la touche Entrée.

PRÉSENTÉ PAR : NOVEMBRE 2007

Modélisation et Gestion des bases de données avec mysql workbench

VAMT 2.0. Activation de Windows 7 en collège

MANUEL TBI - INTERWRITE

Mise en scène d un modèle dans l espace 3D

GESTION DES MENUS. Un menu est un ensemble de liens permettant la navigation dans le site.

Manuel d utilisation de l outil collaboratif

Publier dans la Base Documentaire

Publier un Carnet Blanc

MISE AU POINT FINANCIÈRE GUIDE DE L UTILISATEUR. Le logiciel MISE AU POINT FINANCIÈRE est offert sous licence par EquiSoft.

SUPPORT DE COURS ACCESS 2010

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

26 Centre de Sécurité et de

Excel 2007 Niveau 3 Page 1

VOCABULAIRE LIÉ AUX ORDINATEURS ET À INTERNET

TD/TP 1 Introduction au SDK d Android

Tutoriel de formation SurveyMonkey

Créer sa première base de données Access Partie 3/4 - Création d un formulaire

Manuel d utilisation du site web de l ONRN

Guide d utilisation pour W.access - Client

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

FACTURATION. Menu. Fonctionnement. Allez dans le menu «Gestion» puis «Facturation» 1 Descriptif du dossier (onglet Facturation)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Eclipse atelier Java

Groupe Eyrolles, 2006, pour la présente édition, ISBN :

Excel 2010 Intermediaire

GUIDE MEMBRE ESPACE COLLABORATIF. Février 2012

Formation Word/Excel. Présentateur: Christian Desrochers Baccalauréat en informatique Clé Informatique, 15 février 2007

Mise en route de Cobian Backup

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var Tel : bij@agasc.fr Word: Les tableaux.

Rapport financier électronique

La base de données dans ArtemiS SUITE

Guide d usage pour Word 2007

Création d un service web avec NetBeans 5.5 et SJAS 9

Utiliser un tableau de données

1 CRÉER UN TABLEAU. IADE Outils et Méthodes de gestion de l information

Guide pour le bon fonctionnement des applications académiques avec Internet Explorer 7.x

PRISE EN MAIN D ILLUSTRATOR

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Rapports d activités et financiers par Internet. Manuel Utilisateur

CREER ET ANIMER SON ESPACE DE TRAVAIL COLLABORATIF

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

PARTAGER UN ANNUAIRE COLLECTIF DE SIGNETS AVEC DEL.ICIO.US

Cours Excel : les bases (bases, texte)

Access 2010 Entraînement 1 Garage Renault Dossier 24 MCD

ESPACE COLLABORATIF. L Espace Collaboratif : votre espace de partage entre acteurs régionaux

TwinCAT 3 C++ Création de modules C++ sous TwinCAT 3 VERSION : 1.0 / PH

F O R M A T I O N S LOTUS NOTES. 8.5 Utilisateurs rue de la Bôle. E U R L. a u c a p i t a l d e

Your Detecting Connection. Manuel de l utilisateur. support@xchange2.net

Création d'un questionnaire (sondage)

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO

Call Center View Alarm Reporter

Installation et utilisation du client FirstClass 11

Computer Link Software

I) INTRODUCTION... 3 II) ENREGISTREMENT DE SON TYROS

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Caisses Sociales de Monaco - Déclarations de Salaires DIDACTICIEL. Version 3.2

Tuto 2 : Configuration Virtual box, Configuration et installation du serveur XiBO

Lancez le setup, après une phase de décompression, la fenêtre d installation des prérequis apparaît, il faut les installer :

Création et Gestion des tables

Introduction à Eclipse

Créer et partager des fichiers

FICHIERS ET DOSSIERS

Tutoriel. Votre site web en 30 minutes

EVOLUTION 7.1 Déroulement DREAM INFO 1 Dossier 23 Ciel Gestion Commerciale.

SOMMAIRE ÉTAPES OBLIGATOIRES. Récupérer le connecteur... 3

sommaire ÉTAPES OBLIGATOIRES Récupérer le connecteur... 3

MAÎTRISE DE L ENVIRONNEMENT WINDOWS VISTA

HP Data Protector Express Software - Tutoriel 3. Réalisation de votre première sauvegarde et restauration de disque

Guide Expert Comptable Production Coala

Troisième projet Scribus

Manuel d utilisation de la base de données nationale sur la situation de l enfance en Tunisie CHILDINFO 6.0

Manuel d utilisation du logiciel RÉSULTATS. Édition destinée aux départements

Sélection du contrôleur

GUIDE D UTILISATION DU BROWSER DE BEYOND 20/20

Guide de l utilisateur. Faites connaissance avec la nouvelle plateforme interactive de

Manuel. Administration P.CONSEIL. 12 avril Statut :

Transcription:

Application Formulaire + avec Visual C++ Squelette de l application FormulairePlus Présentation L objectif de cette application FormulairePlus est de maintenir une table dynamique, triée par ordre alphabétique, de personnes. Pour chaque personne, la table stocke : le NOM, le Prénom, le sexe, l age. L interface graphique présente une liste de type List Control en mode Report. Quatre colonnes : NOM, Prénom, Sexe et Age y présentent les enregistrements effectués. Une barre d outil Manipulation supplémentaire possède des boutons pour effectuer des actions sur cette liste! Une option Manipulation dans le menu Affichage permet d activer ou de désactiver cette barre d outils. Enfin, lors de l ajout d un enregistrement (par un click sur le bouton approprié), une boite de type CDialog s affiche, présentant des zones de saisie et une Combo Box pour le nouvel enregistrement. Des suggestions d améliorations pourront être apportées lorsque la partie guidée sera terminée! Présentation de l application : #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 1/12

Réalisation du squelette Tout d abord, créer un projet avec l AppWizard, ce projet sera nommé FormulairePlus : application de type Single Document SDI, avec une liste de 8 fichiers récents d extension fdb, la classe CFormulairePlusView doit être du type CFormView. Cela Donne : Valider, puis visualiser dans l onglet RessourceView du Workspace, les classes suivantes : CFormulairePlusApp : lance l application et crée les autres composants CMainFrame : cadre de la fenêtre, contenant menus, barre d outils, barre de status, CFormulairePlusDoc : contient le document, c est à dire un ensemble d informations le décrivant, elle reçoit les entrées utilisateurs de la classe CFormulairePlusView, gère l enregistrement et l affichage via CFormulairePlusView des documents CFormulairePlusView : elle présente le document à l utilisateur et reçoit ses actions, elle interagit avec CFormulairePlusDoc pour maintenir le document. CWinApp CFrameWnd CDocument CView Préparation de l application La classe CPersonne Tout d abord, nous allons gérer des enregistrements simples contenant les informations suivantes : Nom : nom de la personne Prénom : prénom de la personne Sexe : sexe masculin M ou féminin F Âge : age de la personne La première étape est donc de créer une classe, nommée CPersonne, et stockant pour chaque personne ces informations : Dans ClassView, cliquer droit sur FormulairePlus Classes et sélectionner New Class Créer une classe de type Generic Class, nommée CPersonne, et de classe de base CObject publique public. #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 2/12

Valider OK, et ignorer le message : Cette erreur stipule que la classe CPersonne devrait manuellement inclure le fichier d entête de la classe CObject. Mais cela est géré automatiquement par le logiciel. Dans le cas d une classe externe, il faudrait faire soit même la manipulation. Ici, c est inutile. Puis, en cliquant droit sur la classe CPersonne, et en choisissant Add Member Variable, ajouter les variables privées suivantes : CString m_snom, CString m_sprenom, CSTring m_ssexe, int m_iage. Ensuite, en cliquant droit sur la classe CPersonne, et en choisissant Add Member Function, ajouter un constructeur complet publique : <pas de type> CPersonne(CString snom, CString sprenom, CString ssex, int iage) Puis aller éditer cette méthode en développant l arborescence CPersonne, puis en cliquant sur la méthode CPersonne(CString snom, CString sprenom, CString ssex, int iage). Ajouter le code suivant de manière à permettre l initialisation des variables de CPersonne lors de sa création : CPersonne::CPersonne(CString snom, CStringsPrenom, CString ssexe, int iage) m_snom=snom; m_sprenom=sprenom; m_ssexe=ssexe; m_iage=iage; Ensuite, nous allons rajouter les méthodes classiques et indispensables pour ce type de classe de données : les méthodes Set etget : Ajouter, directement dans le fichier d en-tête (définition en ligne) pour le nom de la personne les méthodes publiques : void CPersonne::SetNom(CString snom) m_snom=snom ; CString CPersonne::GetNom() return m_snom ; Cette méthode de définition est dite en ligne car directement incluse dans la déclaration de classe. Cela peut être fait aussi dans le fichier d implémentation, avec le paramètre inline. La méthode générique Set fixe une variable privée de classe, et Get récupère le contenu de cette variable. Dans notre application, nous n auront pas nécessairement besoin des méthodes Set, car nous avons un constructeur qui fait ce travail dans la foulée. Cependant, par souci de standardisation, il est préférable de la définir. Faire de même pour les variables m_sprenom, m_ssexe et m_iage. #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 3/12

Pour terminer, et préparer l utilisation de la classe CPersonne.h dans notre projet, ajouter au début des fichiers d implémentation de CFormulairePlusView et CFormulairePlusDoc l inclusion : #include Personne.h Faire de même dans le fichier de déclaration de CFormulairePlusDoc, qui doit déclarer des méthodes renvoyant des pointeurs sur CPersonne. A ce point de développement, la classe CPersonne étant pour l instant complète, tenter une compilation du programme afin de déceler des erreurs éventuelles, et les corriger! La classe CFormulairePlusDoc Tableau d objets dynamique Maintenant, complétons la classe CFormulairePlusDoc, afin de permettre au document de mémoriser un ensemble de personnes. Tout d abord, les enregistrements de personnes seront stockés dans un tableau d objet qu il faut déclarer : Ajouter une variable privée m_oapersonnes du type CObArray. Ce type de variable est un tableau dynamique pouvant contenir différents types d objets. Cependant, dans notre cas, il n en contiendra qu un : CPersonne. Il existe aussi des tableaux dynamiques plus spécifiques comme CStringArray, CByteArray, Méthodes Get Ajoutons maintenant deux méthodes : l une renvoyant le nombre total de personnes du tableau, et l autre une personne à l emplacement spécifié. Ajouter deux méthodes publiques : int GetNombrePersonnes(), CPersonne* GetPersonne(int iindex). Puis les implémenter ainsi : int CFormulairePlusDoc::GetNombrePersonnes() return m_oapersonnes.getsize(); CPersonne* CFormulairePlusDoc::GetPersonne(int iindex) return (CPersonne*)m_oaPersonnes[iIndex]; Ajout d enregistrements Ensuite, il faut ajouter une méthode AddPersonne( ) permettant d ajouter des enregistrements de CPersonne à ce tableau. Cette méthode doit créer une instance de CPersonne, tester si la mémoire est suffisante pour compléter m_oapersonnes, puis placer l enregistrement au bon endroit en tenant compte de l ordre alphabétique sur les noms des personnes. Enfin, elle renvoie un pointeur sur la personne crée afin de pouvoir manipuler le nouvel enregistrement. Ajouter la méthode : CPersonne* AddPersonne(CString snom, CString sprenom, CString ssexe, int iage) Puis l implémenter : CPersonne* CFormulairePlusDoc::AddPersonne(CString snom, CString sprenom, CString ssexe, int iage) CPersonne* pnvpersonne=new CPersonne(sNom,sPrenom,sSexe,iAge); int iindex=0,icmp=0; int itotal=getnombrepersonnes(); // recherche où placer le nouvel élément if(itotal) do icmp=strcmp(pnvpersonne->getnom(),getpersonne(iindex)->getnom()); iindex++; while ((icmp>0)&&(iindex<itotal)); if(icmp<0) --iindex; // essai d'ajouter un élément au tableau à l'endroit précédemment trouvé try m_oapersonnes.insertat(iindex,pnvpersonne,1); #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 4/12

SetModifiedFlag(); // marquer que le document a été modifié catch(cmemoryexception* perr) AfxMessageBox("Mémoire insuffisante",mb_iconstop MB_OK); if(pnvpersonne) // si une nouvelle personne fut créée, la supprimer delete pnvpersonne; pnvpersonne=null; perr->delete(); // suppression de l'erreur perr -> non renvoyée davantage return pnvpersonne; Vidage du document Il faut pouvoir aussi effacer le contenu du document en cas de création d un nouveau document. Pour cela, avec ClassWizard, ajouter une méthode pour le message d événement DeleteContents de la classe CFormulairePlusDoc, et l implémenter comme suit : void CFormulairePlusDoc::DeleteContents() // TODO: Add your specialized code here and/or call the base class int itotal=getnombrepersonnes(); if(itotal) for(int i=0;i<itotal;i++) delete m_oapersonnes[i]; // suppression des personnes m_oapersonnes.removeall(); // vidage du tableau (suppression des pointeurs) CDocument::DeleteContents(); A ce point de développement, la classe CPersonnePlusDoc étant pour l instant complète, tenter une compilation du programme afin de déceler des erreurs éventuelles, et les corriger! La classe CFormulairePlusView La classe CFormulairePlusView doit interagir avec CFormulairePlusDoc pour en afficher le contenu. Pour cet affichage, nous allons utiliser une liste instance de CListCtrl, qui permet un listage à la façon du cadre droit de l Explorateur. Aller dans l onglet RessourceView du Workspace, et éditer la boite de dialogue IDD_FORMULAIREPLUS_FORM, en y plaçant un List Control sur toute sa surface : Éditer ses propriétés comme suit : ID IDC_LISTEPERSONNES Style Report, Single Selection Ensuite, dans ClassWizard, affecter à l identificateur IDC_LISTEPERSONNES la variable m_clistepersonnes (de catégorie Control et de type CListCtrl). L affichage du document est presque près, mais il faut préparer les colonnes Nom, Prénom, Sexe et Age. Il se trouve que CListCtrl hérite de CView. Or CView possède une méthode virtuelle appelé lors de l initialisation de la fenêtre : OnInitialUpdate(). Il suffit donc d appeler cette méthode, en prenant garde à commencer par appeler celle de la classe dont on hérite CListCtrl. Commencer par ajouter la méthode OnInitialUpdate() virtuelle de type void, et publique à la classe CFormulairePlusView, avec ClassWizard (message OnInitialUpdate) ou manuellement. #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 5/12

Puis, afin de créer les colonnes, l implémenter ainsi : void CFormulairePlusView::OnInitialUpdate() CFormView::OnInitialUpdate(); for(int i=0;i<4;i++)m_clistepersonnes.deletecolumn(0); m_clistepersonnes.insertcolumn(0, "NOM", LVCFMT_LEFT, 160, 0); m_clistepersonnes.insertcolumn(1, "Prénom", LVCFMT_LEFT, 160,0); m_clistepersonnes.insertcolumn(2, "Sexe", LVCFMT_CENTER, 40, 0); m_clistepersonnes.insertcolumn(3, "Age", LVCFMT_RIGHT, 40, 0); Ensuite, lancer l application pour contrôler le résultat obtenu. Il se trouve que les dimensions de départ ne sont par convenables. Il faut obtenir à l affichage un résultat comme celui-ci : Aller dans RessourceView modifier la taille du List Control pour qu il soit adapté aux colonnes. Puis éditer la méthode BOOL PreCreateWindow(CREATESTRUCT& cs) de CMainFrame, qui permet de définir le style de la fenêtre de trame avant l initialisation grâce à la structure CREATESTRUCT& cs, et fixer les membres cs.cx et cs.cy de taille initiale à des valeurs appropriées. Mise en place de l application. Une boite de saisie Nous allons maintenant créer une boite de dialogue de saisie personnalisée, pour saisir à volonté des enregistrements de personnes. Aller dans RessourceView, et insérer une nouvelle boite de dialogue d identifiant IDD_SAISIE. La titrer Ajout d une personne (dans Properties), ne pas supprimer les boutons OK et Annuler. Puis, l équiper des éléments de saisie nécessaires : #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 6/12

Éléments Propriétés Static Text ID IDC_STATIC Caption &Nom : Edit Box ID IDC_NOM Static Text ID IDC_STATIC Caption &Prénom : Edit Box ID IDC_PRENOM Static Text ID IDC_STATIC Caption &Sexe : Combo Box ID IDC_SEXE Data M et F (avec ctrl+entrée) Type Drop List Styles Sort Static Text ID IDC_STATIC Caption &Age : Edit Box ID IDC_AGE Régler l ordre de tabulation et contrôler la redondance des mnémoniques. Puis appeler le ClassWizard, qui propose alors de créer une nouvelle classe : Cliquer OK et créer une classe CSaisie de classe de base CDialog puis valider par OK. Ensuite, associer des variables membres aux identificateurs : L age sera compris entre 0 et 130 ans. Les nom et prénom feront 30 caractères maximum. Une nouvelle barre d outils Création Nous allons maintenant créer une nouvelle barre de boutons qui contiendra pour commencer le bouton de saisie d un nouvel utilisateur. Aller dans RessourceView et insérer une nouvelle barre de boutons (Toolbar), d identifiant IDR_MANIPULATIONS. Puis faire un dessin dans la première icône. Lorsque c est fini, double cliquer dessus et l identifier ainsi : #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 7/12

La ligne Prompt permet de fixer : le texte affiché par la barre d état et l info bulle lors du survol du bouton. séparés par \n Affichage Ensuite, il faut permettre l affichage de la barre d outils. Pour cela, il faut ajouter à CMainFrame une variable protégée m_wndmanipulations de type CToolBar. Puis éditer la classe CMainFrame et compléter la méthode int OnCreate(LPCREATESTRUCT lpcreatestruct) : int CMainFrame::OnCreate(LPCREATESTRUCT lpcreatestruct) if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndtoolbar.create(this)!m_wndtoolbar.loadtoolbar(idr_mainframe)) TRACE0("Failed to create toolbar\n"); return -1; // fail to create // Notre barre pour la saisie if (!m_wndmanipulations.create(this)!m_wndmanipulations.loadtoolbar(idr_manipulations)) TRACE0("Failed to create toolbar\n"); return -1; // fail to create if (!m_wndstatusbar.create(this)!m_wndstatusbar.setindicators(indicators, sizeof(indicators)/sizeof(uint))) TRACE0("Failed to create status bar\n"); return -1; // fail to create // TODO: Remove this if you don't want tool tips or a resizeable toolbar m_wndtoolbar.setbarstyle(m_wndtoolbar.getbarstyle() CBRS_TOOLTIPS CBRS_FLYBY CBRS_SIZE_DYNAMIC); m_wndmanipulations.setbarstyle(m_wndmanipulations.getbarstyle() CBRS_TOOLTIPS CBRS_FLYBY CBRS_SIZE_DYNAMIC); // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndtoolbar.enabledocking(cbrs_align_any); m_wndmanipulations.enabledocking(cbrs_align_any); //pour les manipulations EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndManipulations); //pour les manipulations return 0; Exécuter l application et contrôler que la nouvelle barre s affiche. Intégration des barre d outils et boite de saisie dans l application Ensuite, lancer ClassWizard et associer une méthode OnNouveau() à l identificateur ID_NOUVEAU et au message COMMAND. #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 8/12

Puis, ajouter au fichier d implémentation de CFormulairePlusView la ligne #include Saisie.h de manière à ce que CFormulairePlusView puisse instancier CSaisie Implémenter la méthode de manière à ce qu elle affiche la boite de dialogue crée. Pour cela, ajouter à la classe CFormulairePlusView une variable privée m_dsaisie de type CSaisie. Et compléter la méthode précédemment crée comme suit : void CFormulairePlusView::OnNouveau() // TODO: Add your command handler code here m_dsaisie.m_snom="votre nom"; m_dsaisie.m_sprenom="votre prénom"; m_dsaisie.m_ssexe="m"; m_dsaisie.m_iage=0; if(m_dsaisie.domodal()==idok) CPersonne* ppersonne=getdocument()->addpersonne( m_dsaisie.m_snom,m_dsaisie.m_sprenom,m_dsaisie.m_ssexe,m_dsaisie.m_iage); Rafraichir(); Puis il faut ajouter la méthode Rafraichir() privée à la classe CFormulairePlusView, afin de rafraîchir complètement le contenu du List Control : void CFormulairePlusView::Rafraichir() CPersonne* ppersonne; int inbpersonnes=getdocument()->getnombrepersonnes(); m_clistepersonnes.deleteallitems(); for(int i=0;i<inbpersonnes;i++) ppersonne=getdocument()->getpersonne(i); CString sage; sage.format("%d",ppersonne->getage()); m_clistepersonnes.insertitem(i,ppersonne->getnom()); m_clistepersonnes.setitem(i,1,lvif_text,ppersonne->getprenom(),0,0,0,0); m_clistepersonnes.setitem(i,2,lvif_text,ppersonne->getsexe(),0,0,0,0); m_clistepersonnes.setitem(i,3,lvif_text,sage,0,0,0,0); Enfin, compléter la méthode OnInitialUpdate() de CFormulairePlusView avec Rafraichir() : void CFormulairePlusView::OnInitialUpdate() CFormView::OnInitialUpdate(); for(int i=0;i<4;i++)m_clistepersonnes.deletecolumn(0); m_clistepersonnes.insertcolumn(0,"nom",lvcfmt_left,160,0); m_clistepersonnes.insertcolumn(1,"prénom",lvcfmt_left,160,0); m_clistepersonnes.insertcolumn(2,"sexe",lvcfmt_center,40,0); m_clistepersonnes.insertcolumn(3,"age",lvcfmt_right,40,0); Rafraichir(); A ce point, compiler l application FormulairePlus et tester son fonctionnement. Interaction menu barre d outils L objectif est ici de pouvoir désactiver notre barre d outils Manipulations à partir du menu d affichage, au même titre que la Barre d outils standard. Edition du menu Editer le menu standard dans RessourceView et ajouter une option intitulée Manipulations entre Barre d outils et Barre d état : #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 9/12

Mise à jour du menu Dans ClassWizard, ajouter une méthode dans CMainFrame, gérant l événement UPDATE_COMMAND_UI pour ID_MANIPULATIONS, et cochant/décochant l option Manipulations en fonction de la présence/absence de la barre d outils : void CMainFrame::OnUpdateManipulations(CCmdUI* pcmdui) // TODO: Add your command update UI handler code here pcmdui->setcheck((m_wndmanipulations.getstyle()&ws_visible)!=0); Réaction au menu Ensuite ajouter une méthode dans CMainFrame, gérant l événement COMMAND pour ID_MANIPULATION, et masquant ou affichant notre barre d outils : void CMainFrame::OnManipulations() // TODO: Add your command handler code here BOOL bvisible; bvisible=((m_wndmanipulations.getstyle()&ws_visible)!=0); ShowControlBar(&m_wndManipulations,!bVisible,FALSE); RecalcLayout(); Sérialisation Présentation Le plus simple Il faut sérialiser les données pour pouvoir sauvegarder le travail, puis le récupérer. Ce n est pas une obligation, mais c est la méthode la plus simple et la plus souple et fiable! La sérialisation est prise en charge par AppWizard et les MFC à tel point que seules les méthodes de sérialisation des nouvelles classes sont à créer. CArchive et CFile Sans entrer dans le détail, la sérialisation va utiliser la classe CArchive qu elle doit attacher à une classe de type CFile. Ensuite, l archive peut être utilisée avec des flux d entrée ou de sortie. Principe d utilisation de la sérialisation Le principe de la sérialisation est que l objet à sauvegarder, ici notre document (c est à dire la classe CFormulairePlusDoc) implémente une méthode de sérialisation Sérialize(CArchive* ar). Cette méthode va stocker les données contenues dans la classe à la manière d un flux de façon à pouvoir retrouver les données dans l ordre où elles ont été sauvegardées, sans en perdre et sans les altérer. Sans Sérialize(CArchive* ar), il faudrait nous même gérer la façon dont les nombreuses données potentielles de la classe de document seraient sauvegardées, c est à dire placées les unes à la suite des autres dans un fichier, ce qui se révélerait fastidieux, long et risqué. Ensuite, la méthode de sérialisation s occupe de sauver et restituer correctement les données spécifiées grâce à CArchive, pour peu qu elles soient elles mêmes sérialisables! Dans notre cas, il nous faut donc rendre sérialisable la classe CPersonne afin : que la classe de document puisse sérialiser la sauvegarde des instances de CPersonne que les toutes variables de CPersonne à sauvegarder le soient bien. La méthode sera donc ici la suivante : le document spécifie de sauvegarder m_oapersonnes puis la classe Personne défini un ordre de sauvegarde pour les variables membres que l on souhaite voir sauvegardées. Ne pas oublier les macros! Cependant, pour que notre application prenne en charge la sérialisation de manière transparente, il faut le lui spécifier : lors de la création du projet pour que le document intègre Sérialize(CArchive* ar), avec deux macros de Visual C++ afin qu elles se charge de tout le travail sous-jacent sur chaque classe dont les variables membres sont à sauvegarder, c est à dire sérialiser! Dans notre cas, seule CPersonne est à sérialiser. #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 10/12

Macros de sérialisation Commencer par placer les macros de Visual C++ nécessaires à la sérialisation sur CPersonne. Dans Personne.h : DECLARE_SERIAL(<nom de la classe à sérialiser>) class CPersonne : public CObject DECLARE_SERIAL(CPersonne); public: CString GetAge() return m_iage; CString GetSexe() return m_ssexe; CString GetPrenom() return m_sprenom; CString GetNom() return m_snom; void SetAge(int iage) m_iage=iage; void SetSexe(CString ssexe) m_ssexe=ssexe; void SetPrenom(CString sprenom) m_sprenom=sprenom; void SetNom(CString snom) m_snom=snom; CPersonne(CString snom,cstring sprenom,cstring ssexe,int iage); CPersonne(); virtual ~CPersonne(); Dans Personne.cpp : IMPLEMENT_SERIAL(<classe, cl. parente, version du format (1puis2 )>) #include "stdafx.h" #include "FormulairePlus.h" #include "Personne.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]= FILE ; #define new DEBUG_NEW #endif IMPLEMENT_SERIAL(CPersonne,CObject,1); // classe,héritage,version du logiciel Implémentation de Serialize Seul le tableau m_oapersonnes de CFormulaireDoc est à sauvegarder. Donc éditer la méthode Serialize de CFormulaireDoc : void CFormulairePlusDoc::Serialize(CArchive& ar) m_oapersonnes.serialize(ar); Pour chaque instance de CPersonne, il faut en sauvegarder les variables membres : m_snom, m_sprenom, m_ssexe, m_iage Ajouter une méthode Serialize(CArchive & ar) publique à la classe CPersonne : void CPersonne::Serialize(CArchive & ar) CObject::Serialize(ar); if(ar.isstoring()) ar << m_snom << m_sprenom << m_ssexe << m_iage; else ar >> m_snom >> m_sprenom >> m_ssexe >> m_iage; #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 11/12

Pour aller plus loin avec FormulairePlus Voici quelques suggestions de modifications pour notre application. Attention cependant à ne pas trop charger les méthodes existantes. De nouvelle méthodes, parfois privées, pourront être créées afin de gagner en lisibilité et modularité. Enregistrements A propos de la table linéaire d enregistrements : Faire en sorte que, si une personne saisie possède le même nom qu une personne existante, le tri alphabétique se fasse sur le prénom. Ensuite, ce principe pourra être étendu au sexe (par exemple M puis S) et à l âge Faire en sorte que, lors de la saisie, une personne en double (mêmes noms, prénom, sexe et âge) soit détectée et non pas ajoutée à la table dynamique. L utilisateur doit en être averti clairement! Faire en sorte qu un double click sur un nom de la liste ouvre une boite de dialogue proposant son édition ou son effacement. Dans le cas ou l utilisateur choisit l effacement, supprimer la ligne du document puis mettre à jour l affichage et avertir l utilisateur du l opération effectuée. Dans le cas de l édition, appeler notre boite de saisie. Lorsque l utilisateur valide sa modification, effectuer dans le document les changements sur l enregistrement (personne) précédemment sélectionné. Interface A propos de l interface : Faire en sorte que notre barre d outils se place au départ à la droite de celle déjà présente. Puis faire en sorte que la sauvegarde du document mémorise l état des barres d outils, et que ces états personnalisés soit récupérés et appliqués lors de l ouverture du même document (question difficile). Faire en sorte que le redimensionnement du MainFrame par l utilisateur engendre celui du List Control et de ses colonnes qui seront gérées proportionnelles à la taille du List Control (à implémenter étape par étape). Générer une application Multiple Documents qui soit seulement capable de charger les fichiers de FormulairePlus et d en afficher le contenu dans un List Control. A chaque fichier chargé, une nouvelle fenêtre fille (ChildFrame) sera donc ouverte! #njc Lycée «la Briquerie» TP application Formulaire avec Visual C++ & page 12/12