L'application PDA

L'application Pocket PC

Version PDF

1-Généralités

Le Pocket PC entre dans la catégorie des Personal Digital Assistant (PDA). Un PDA (ou organiseur personnel en Français) possède les caractéristiques principales d’un ordinateur classique, comme la mémoire, un dispositif de saisie, un écran, des ports de communications et un système d’exploitation. Un PDA est considéré comme un ordinateur de poche ; ce qui implique une faible taille (doit tenir dans une poche) entraînant des modifications d’architecture matérielle, notamment l’absence de disque (seulement ROM et RAM) et l’absence d’un clavier traditionnel. Aujourd’hui Windows Mobile 2005 équipe les Pocket PC ; il est chargé en mémoire (RAM) au moment du démarrage. L’absence de disque dur, l’inexistence de besoin de sauvegarde et le fait qu’aucune donnée n’est sensible vont nous amener à privilégier des structures en mémoire (DataSet). Le choix d’un DataSet Typé (reçu du WebService) nous permettra de lier les données (présentes en mémoire) aux contrôles des formulaires. Par contre il faudra prévoir un dispositif de re-synchronisation en cas de perte de ces données « mémoire ».

Dans l’environnement Visual Studio le développement d’application pour un Pocket PC est très proche d’un développement d’une application Winform à ceci près que les contrôles disponibles sont moins nombreux et le nombre de leurs propriétés plus restreint.

Pour créer un projet pour appareil mobile et notamment pour un Pocket PC procéder ainsi :

     FichieràNouveauàProjet…

     Choisissez « Projet Visual c# » pour le type de projet puis dans le panneau à droite : « Application Smart Device »

           

 

 

Après validation, un canevas de projet est automatiquement créé et le concepteur de formulaire apparaît.

Vous n’aurez pas à effectuer cette tache de création de projet, puisque vous disposez d'un squelette de l'application –AntoinePPCVersion0-. Ouvrez l’application dans Visual Studio.

 

Le Pocket PC n’ayant pas de clavier physique, il faudra utiliser le clavier virtuel pour saisir des informations dans les zones de texte.

Le clavier virtuel est un nouveau contrôle disponible pour le développement des applications « Smart Device ». Il est accessible à partir de la boite à outils, contrôles du périphérique.

Utilisation du clavier Virtuel

 

Travail à faire

Dans le formulaire FrmDebut, glissez le contrôle InputPanel et nommez le leClavier.

Remarque : A l’exécution l’InputPanel s’ouvre au moyen de l’icône placée dans le menu. Le menu a été supprimé des différents formulaires, nous allons voir comment l’ouvrir automatiquement.

La propriété « Enabled » du contrôle va nous permettre d’ouvrir ou de fermer le clavier virtuel.

 

Ecrivez les deux procédures suivantes :

 

private void textBox_GotFocus(object sender, System.EventArgs e)

{

      leClavier.Enabled = true;

}

private void textBox_LostFocus(object sender, System.EventArgs e)

{

      leClavier.Enabled = false;

}

 

La première procédure permet d’ouvrir le clavier virtuel, la seconde de le fermer.

A chaque fois qu’un contrôle de saisie reçoit le focus, il faut afficher le clavier virtuel en appelant la procédure « textBox_GotFocus » et dès qu’il perd le focus, il faut refermer le clavier virtuel en appelant la procédure « textBox_LostFocus ».

 

Lier les événements « GotFocus » et « LostFocus » de tous les contrôles de saisie utilisant un clavier virtuel aux procédures « textBox_GotFocus » et « textBox_LostFocus »

 

                         

 

Il faut prévoir aussi de fermer le clavier à la fermeture l’application.

Copier la procédure ci-dessous :

 

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

      leClavier.Enabled = false;

}

Lier la procédure à l’événement « closing » du formulaire par l’intermédiaire de la liste des événements du panneau propriétés du formulaire.

 

 



2 -Cas d'utilisation : Authentification

Le Pocket PC ne contient aucune donnée résiduelle. Nous allons faire appel à un « Service Web » pour échanger des informations entre la base de données de l’application centrale et l’application s’exécutant sur le Pocket PC.

 

Remarque : Les services Web constituent un moyen d’appeler une méthode distante via le protocole http. Une application cliente invoque une méthode (la plupart du temps pour récupérer des données comme ici les plats pris ce jour) sur un serveur via Internet et le serveur renvoie la valeur de retour de la méthode par le même canal. Les données sont échangées par http via un protocole de plus haut niveau : SOAP, qui va encapsuler un flux XML. Cela permet une grande indépendance entre le fournisseur du service Web et le consommateur de service.

 

Pour contrôler l’existence du code utilisateur et de son mot de passe, nous allons invoquer une méthode d’un service Web.

Pour utiliser un service Web il faut d’abord le référencer dans l’application.

 

Travail à Faire

 Cliquez droit dans l’explorateur de solution sur votre projet et choisir Ajoutez une référence WEB

Cliquez sur « Services Web sur l’ordinateur local »

Choisir dans la liste « http://localhost/AntoineWS/Service1.asmx »

 

Modifiez dans l’url « localhost » par le nom de votre serveur IIS (nom de votre ordinateur)


 

Puis cliquez sur Aller à, puis sur le bouton Ajouter la référence

Vous obtenez :

Vous obtenez aussi de nouveaux composants que vous pourrez utiliser en mode graphique :

 

Glisser sur le formulaire le composant Service1 et nommez le iws vous aurez ainsi accès à toutes les méthodes du service Web.

 

 

Glisser sur le formulaire le composant DSRestaurant et nommez le monDS.

 

Dans la méthode click du bouton bntValider, nous allons appeler la méthode getIdentiteServeur du service Web pour contrôler la validité des informations saisies.

 

Cette méthode a pour signature :
                                  string[] getIdentiteSeveur (string,string)

Le tableau de string (valeur de retour de la fonction) possède 3 champs :

            Identifiant du serveur                Nom du serveur                       Prénom du serveur

 

La fonction renvoie « null » si les informations saisies sont fausses. Dans ce cas prévenir l’utilisateur avec un message d’erreur dans la propriété Text du Label3.

 

Si la saisie est correcte appelez la méthode getDonneesServeur du service Web pour charger dans le PocketPC l’ensemble des informations utiles au fonctionnement du programme. Le PocketPC récupérera alors un DataSet Typé (utilisez le DataSet monDS comme retour de la fonction getDonneesServeur) contenant l’ensemble de l’environnement utile (cf. annexe 1).

 

Dans ce DataSet figure une DataTable « tableService » contenant l’ensemble des tables dont le serveur a la charge durant le service. Pour pouvoir indiquer au serveur lors de la création d’une note les tables disponibles (non occupées), nous gérerons dans la colonne occupe cette disponibilité.

 

Effectuer l’ensemble de ces opérations et afficher le formulaire FrmNote. Vérifier la signature du constructeur FrmNote pour connaître ces paramètres.

 

 Générer et déployer l’application sur l’émulateur (cf. ci-dessous)


Avant de déployer l’application sur l’émulateur, il faut préparer celui-ci pour pouvoir accéder au webService :

 

Dans le menu Outils de VisualStudion 2005 choisir le menu Gestionnare Device Emulator puis faire un clic droit sur Pocket PC 2003 SE – émulateur, puis Se connecter :

 

 

Puis faire : clic droit et Station d’accueil

 

 

Le logiciel Microsoft ActiveSync doit se lancer (si ce n’est pas le cas le lancer) et choisir partenariat invité

 

Sur l’émulateur cliquer sur les deux flèches à droite du menu démarrer puis propriété et choisir bureau et « pilote miniport de simulateur ethernet ».

 

Vous pouvez alors déployer l’application sur l’émulateur.

 

 

Réalisation de l'interface de gestion des notes.

Elle se présente comme ainsi :

 

Ce formulaire va nous permettre de gérer l’ensemble des notes du serveur, depuis leur création jusqu’à leur finalisation (demande d’addition).

 

La partie supérieure représente l’ensemble des notes du jour en cours pour le serveur.

Une note en cours est une note dont l’addition n’a pas été demandée.

 

Cet affichage utilise un contrôle DataGrid.

Pour remplir le DataGrid (dgNote) nous allons le lier à un BindingSource lui-même lié la DataTable « Note » du DataSet reçu par le formulaire.

Le DataGrid ne doit présenter que les notes en cours. Nous utiliserons la propriétée Filter du BindingSource  pour effectuer ces sélections.

Pour choisir les colonnes de la DataTable à afficher dans le DataGrid nous ajouterons en mode design, l’objet DataGridTableStyle qui permet de mettre en forme les colonnes d’un DataGrid (couleur, largeur, nom colonne, apparition etc.).

Les zones de textes (cmbTable et txtNbCouverts) de la partie inférieure du formulaire seront renseignées à partir de la DataTable « tableService » par l’intermédiaire d’un second BindingSource (bdgTableService).

 

Travail à Faire :

En mode Design

     Ajoutez un dataset typé (DSRestaurant) et nommez le monDS,

      Ajoutez un BindingSource (bdgNote) et renseignez ses propriétés DataSource et DataMember (monDS et Note), modifiez la propriété Filter du BindingSource (bdgNote) pour n’afficher que les notes non facturée,

      Renseignez la propriété DataSource du DataGrid dgNote avec le nom du BindingSource (bdgNote),

Définissez le style du contrôle DataGrid pour afficher les colonnes de la table en ajoutant un objet DataGridTableStyle à la collection TableStyles. Cliquez sur la propriété TableStyles dans le volet Propriétés. Cette action affiche la boîte de dialogue Éditeur de collections DataGridTableStyle. Effectuez ensuite les opérations suivantes :

a.             Ajoutez un objet DataGridTableStyle à la collection TableStyles.

b.             Spécifiez "Note" pour la propriété MappingName.

c.             Cliquez sur la propriété GridColumnStyle. Cette action affiche la boîte de dialogue Éditeur de collections DataGridColumnStyle.

d.             Ajoutez un objet DataGridTextBoxColumn à la collection GridColumnStyles.

e.             Cliquez sur la propriété MappingName et sélectionnez dateJour (date de création de la note).

f.             Définissez les valeurs Texte de l'en-tête et Largeur voulues.

g.             Répétez cette procédure pour les colonnes supplémentaires.

h.             Fermez les boîtes de dialogue.

 

Ajoutez un BindigSource (bdgTableJour) et valorisez ses propriétés DataSource et DataMember (monDS et TableService). Il ne faut prendre en compte que les tables disponible (occupe = ‘false’).

Liez ce bindingSource (bdgTableJour) à la comboBox « cmbTable » 

 

La zone de texte « txtNbCouverts » doit être aussi lié au bindingSource (bdgTableJour) propriété « nbPlaces »

 

 

Dans le constructeur du formulaire ajouter :

 Valorisez l’attribut monDS avec le DataSet reçu en paramètre

La liaison du dataSet monDS avec les propriétés DataSourec des deux BindingSource (bdgNote et BdgTableService) doit être refaite :

this.bdgNote.DataSource = monDS;
this.bdgTableJour.DataSource = monDS;



 3-Cas d'utilisation : Saisie d'une note

 

Pour créer une note, le serveur va cliquer sur le bouton Nouvelle, choisir la table et éventuellement changer le nombre de couverts.

 

Travail à Faire

Ecrire dans l’événement clic du contrôle btnNouveau les lignes suivantes :

 

cmbTable.Enabled=true;

txtNbCouverts.Enabled=true;

btnOk.Enabled=true;

Glisser sur le formulaire un contrôle InputPanel et nommer le « leClavier ».

Ecrire en vous inspirant du formulaire Menu les événements GotFocus, LostFocus et Form1_Closing. Lier le contrôle txtNbCouverts aux événements GotFocus et LostFocus

 

Lorsque le clavier virtuel va apparaître, celui ci va cacher la zone de texte !

Pour éviter cet inconvénient, il faut changer automatiquement la position verticale du contrôle lors de l’apparition du clavier virtuel

 

Ecrire la procédure suivante et lier là à l’événement EnabledChange du contrôle « leClavier »

private void leClavier_EnabledChanged(object sender, System.EventArgs e)

{

// x et y vont être les coordonnées du coin gauche de notre panneau

      int x,y,heightOfMenuBar;

      // On va ajuster le panneau de tel sorte que sa limite basse touche

      // la limite haute, soit du clavier virtuel s'il est affiché, soit du bas de l'écran

      heightOfMenuBar=24;

      x=txtNbCouverts.Location.X; // On ne change pas l'alignement horizontal

      if (leClavier.Enabled)

      {

            y=leClavier.Bounds.Top - heightOfMenuBar - txtNbCouverts.Height;

      }

      else

      {

            y=216;//this.Bounds.Bottom - heightOfMenuBar - txtNbCouverts.Height;

      }

      txtNbCouverts.Location=new Point(x,y);

}

Un click sur le bouton OK va créer une nouvelle note dans la DataTable « Note » et afficher le formulaire FrmSaisiPlat.

 

Travail à Faire

Ecrire dans l’événement clic du contrôle btnOK les lignes permettant :

  •      La création d’une nouvelle ligne (DataRow) dans la DataTable « Note »
          DataRow NLigne = monDS.Note.NewRow();
  •      La valorisation de l’ensemble des colonnes (Cf. annexe1). Le numéro de note est un numéro chronologique pour le serveur et la date.         NLigne["DateJour"]=DateTime.Now.ToShortDateString();
  •      De signifier que la table est occupée (DataTable « tableService » colonne occupe = true)
  •      De rafraîchir le DataGrid dgNote en utilisant la méthode Refresh du contrôle
  •      De rendre inactif (enabled=false) les contrôles suivants :
    btnOk, btnSuite, btnAddition, cmbTable et txtNbCouverts
  •      d'afficher le formulaire frmSaisiPlat et passer en paramètres du formulaire le DataSet monDS et le numéro de la note créée.

 Gestion du bouton Suite :

 

            Ce bouton va permettre de poursuivre la commande de plats pour une note existante.

Un clic sur ce bouton permet :

  • D' utiliser le numéro de ligne sélectionné dans le dataGrid dgNote afin de prendre l’information concernant le numéro de note (dans la DataTable)

  • D'afficher le formulaire frmSaisiPlat ;


Travail à Faire :

  Ecrire ces fonctionnalités dans l’événement clic du contrôle « btnSuite ».

 

 Réalisation de l'interface de saisie des plats.

 

Elle se présente ainsi :

 

Ce formulaire va nous permettre de gérer les commandes de plats pour une note.

Il se compose de 5 parties :

1-     Les références de la note (numéro, table et nombre de couverts) ;

2-     Un contrôle DataGrid (dgNote) contenant les Plats commandés et non transmis en cuisine ;

3-     Un contrôle ComboBox (cmbFamille) pour choisir la famille de plats à commander et le nombre de plats déjà commandés pour cette famille ;

4-     Un contrôle DataGrid (dgMenu) contenant les plats de la famille sélectionnée ;

5-     Une série de bouton pour :
valider un plat (Ok),
supprimer un plat choisi (Enlever),
transmettre en cuisine les plats à préparer (Préparer),
consulter les plats déjà en préparation de la note (Voir).

 

 

Travail à Faire

 Ecrire dans le constructeur du formulaire le code permettant l’affichage des parties 1,2 et 3 :

 

Partie 1 : Le formulaire reçoit en paramètre le numéro de note. Le numéro de table et le nombre de couvert sont stockés dans la DataTable « Note ».

Partie 2 : Le DataGrid dgNote est en consultation, il s’affiche à partir de la DataTable « RegrouperJS » liée à la dataTable « Note » (cf. annexe1) en sélectionnant (par l’intermédiaire de la propriété Filter du BindingSource) les lignes du numéro de note dont la colonne « prepare = faux » (plats non envoyés en cuisine).

    

Partie 3 : Le contrôle ComboBox (cmbFamille) se remplit à partir de la DataTable « famille » et du bindingSource (bdgFamille). La colonne « libelle » est affichée dans le contrôle alors que la colonne « id » est retournée au programme en cas de sélection. Le datagrid de la liste des plats d’une famille (dgMenu) est lié à la relation famille-plats du bindingSource bdgFamille.

 

Générer votre programme ; vous devez obtenir le formulaire suivant :

 

 

 

Affichage des plats en fonction du type de plat sélectionné :

 

 

Travail à Faire :

 En mode conception effectuez les liaisons nécessaires.

 

Dans le constructeur du formulaire ajoutez :

 La valorisation de l’attribut monDS avec le DataSet reçu en paramètre,
la liaison du dataSet monDS avec les propriétés DataSource des deux BindingSource (
bdgNote et Bdgfamille) doit être refaite :

 

this.bdgFamille.DataSource = monDS;
this.bdgNote.DataSource = monDS;

 

 Filtrez le bdgNote avec le numéro de note reçu en paramètre

  • Filtrez le datagrid (dgUneNote) pour n’afficher que les lignes non préparées.
  • Appeler la méthode nbPlatsCommandesParFamille (à écrire) et afficher le résultat dans le contrôle txtNbPlatFamille.

 

Cette méthode (nbPlatsCommandesParFamille) calcule le nombre de plats déjà commandé pour une note (celle affichée) et une famille de plats donnée doit être appelée à chaque changement de famille de plats.

 

Gestion du bouton OK (FrmSaisiPlat) :

 

            Ce bouton va permettre de commander un plat.

Un clic sur ce bouton déclenche les opérations suivantes :

-        Recherche d’une ligne déjà existante non préparée (colonne prepare = faux) dans la DataTable « Regrouper » pour cette note et ce numéro de plat ;

-        Si la ligne n’existe pas, création avec une quantité de 1, si elle existe modification par ajout de 1 à la colonne quantite ;

-        Rafraîchissement du DataGrid dgNote ;

-        Rafraîchissement du contrôle txtNbPlatFamille par appel de la méthode nbPlatsCommandesParFamille ;

-        Activation des contrôles « btnEnlever » et « btnPréparer »

 

Travail à Faire :

  Ecrire ces fonctionnalités dans l’événement clic du contrôle « btnOK ».

     Rappel

          Créer une ligne dans une DataTable :

                DataRow ligneR = monDS.RegrouperJS.NewRow();

            Initialiser les colonnes d’un DataRow :

                  ligneR["dateJour"]=DateTime.Now.ToShortDateString();

            Ajouter la ligne dans la DataTable :

                monDS.Regrouper.Rows.Add(ligneR);

 

 Gestion du bouton Enlever (FrmSaisiPlat) :

 

            Ce bouton va vous permettre de supprimer un plat sélectionné dans le DataGrid dgNote.

Un clic sur ce bouton déclenche les opérations suivantes :

-        Utilisation du numéro de ligne sélectionné dans le DataGrid dgNote afin de récupérer le numéro de Plat ;

-        Recherche de la ligne non préparée (colonne prepare = faux) dans la DataTable « RegrouperJS » pour cette note et ce numéro de plat ;

-        Si la quantité de la ligne est égale à 1, suppression de la ligne de la DataTable « RegouperJS » sinon modification de la ligne par décrémentation de la colonne quantite ;

-        Rafraîchissement du DataGrid dgNote ;

-        Rafraîchissement du contrôle txtNbPlatFamille si le plat supprimé appartient à la famille affichée dans le contrôle cmbFamille ;

-        Mise à l’état actif ou inactif des contrôles « btnEnlever » et « btnPréparer »

 

Travail à Faire :

  Ecrire ces fonctionnalités dans l’événement clic du contrôle « btnEnlever ».

 

 

 Gestion du bouton Voir (FrmSaisiPlat) :

 

            Ce bouton va permettre de consulter pour une note, les plats déjà envoyés en préparation.

Travail à Faire :

  Ecrire les instructions dans l’événement clic du contrôle « btnvoir » pour afficher le formulaire FrmVoirNote.

 

Le formulaire suivant doit s’afficher :

 

 

Travail à Faire :

      Ecrire dans le constructeur du programme FrmVoirNotes.cs le code nécessaire à l’affichage du formulaire. Les lignes affichées ont toutes la colonne « prepare » (dans la DataTable « RegrouperJS ») à la valeur vrai ;

 

  

Gestion du bouton Préparer (FrmSaisiPlat) :

 

            Ce bouton va vous permettre d’envoyer les plats présents dans le DataGrid dgNote en cuisine pour y être préparés. Pour envoyer les lignes à préparer il faudra utiliser un Service Web. Pour alléger le flux XML, le DataSet transmis a service Web, ne contiendra que les données strictement nécessaires : les occurrences de la DataTable « Regrouper » à préparer (colonne prepare = faux) pour un numéro de note.

 

L’appui sur ce bouton déclenche les opérations suivantes :

-        Création d’un DataSet par « clonage » du Dataset « monDS » (copie la structure du DataSet sans les données);

-        Import dans ce nouveau DataSet de la ligne de la DataTable « Note » pour cette note (txtNote.Text)

-        Import dans ce nouveau DataSet, des lignes non préparées (colonne prepare = faux) de la DataTable « RegrouperJS » pour cette note (txtNote.Text) ;

-        Appel de la méthode insereNote à partir de l’instance de la référence Web iws (ajoutée au formulaire e mode design) ;

-        Modification des lignes de la DataTable « RegrouperJS » envoyées (colonne prepare = vrai) dans le DataSet initial (monDS);

-        Rafraîchissement du contrôle dgNote ;

-        Mise à l’état actif ou inactif les contrôles « btnEnlever » et « btnPréparer »

 

Travail à Faire :

      Ecrire ces fonctionnalités dans l’événement clic du contrôle « btnPréparer ».

     Rappel

          Création d’un DataSet par « clonage » :

                DataSet dsAPreparer = monDS.Clone();

            Importer une ligne dans un DataSet :

                  dsAPreparer.Tables["RegrouperJS"].ImportRow(0);

 

 4-Cas d'utilisation : gestion de l'addition

 

Pour demander l’addition d’une note, le serveur va sélectionner la note dans le DataGrid dgNote, puis cliquer sur le bouton Addition.

L’appui sur ce bouton déclenche les opérations suivantes :

-        Récupération du numéro de ligne sélectionné dans le dataGrid dgNote afin de conserver le numéro de note (dans la DataTable « Note » ;

-        Appel de la méthode factureNote à partir de l’instance de la référence Web iws (ajoutée au formulaire e mode design) ;

-        Affichage du montant de l‘addition (fournit en retour de la méthode factureNote) dans un MessageBox ;

-        Changement d’état de la note, qui devient facturée (colonne facture = vrai de la DataTable « Note » ) ;

-        Changement d’état de la table, qui devient disponible (colonne occupe = faux de la DataTable « tableService ») ;

-        Rafraîchissement du DataGrid dgNote

-        Mise à l’état actif ou inactif les contrôles « btnSuite » et « btnAddition »

 

Travail à Faire

Ecrire dans l’événement clic du contrôle btnAddition le code permettant ces fonctionnalités.