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 2003 é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). Ce choix nous obligera en développement, à lier les données (présentes en mémoire) aux contrôles des formulaires par le code plutôt que par les assistants et à 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 »
Puis choisir votre plate
forme dans la boite de dialogue :
Après validation, un canevas de projet est automatiquement créé et le concepteur de formulaire apparaît.
Remarque : Si
l’option Pocket PC n’existe pas ou si elle ne propose que des versions
antérieures (seulement Pocket PC 2002 par exemple), vous devez installer le SDK
Pocket PC 2003, en téléchargement gratuit sur le site de MicroSoft (Cf. Annexe
2).
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
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.
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
Puis
cliquez sur « Services Web sur l’ordinateur local »
Puis
choisir dans la liste « http://localhost/AntoineWS/Service1.asmx »
Puis
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 :
Dans la méthode click du
bouton bntValider, créer une
instance de la référence Web ajoutée :
xavier.Service1 iws = new
AntoinePPC.xavier.Service1();
Vous aurez ainsi accès à toutes les méthodes du service Web.
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 getEnvironnement 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 contenant l’ensemble de l’environnement utile (cf. annexe 1).
Dans ce DataSet figure une DataTable « table_service » 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 une colonne supplémentaire (de la DataTable) cette disponibilité.
Vous allez ajouter une colonne nommée occupe de type Booléen à la DataTable « table_service » avec comme valeur par défaut faux (table libre).
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.
Rappel Ajout d’une colonne a
une DataTable
Création d’une
DataColumn
DataColumn occupe = new DataColumn();
occupe.DataType =
System.Type.GetType("System.Boolean");
occupe.ColumnName =
"occupe";
occupe.DefaultValue = false;
Ajout d’une
DataColumn à une DataTable d’un DataSet
monDs.Tables["table_service"].Columns.Add(occupe);
Générer et déployer
l’application sur l’émulateur (cf. ci-dessous)
Remarque : Pour déployer l’application sur un Pocket PC voir Annexe 3.
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 à la DataTable « Note » du DataSet reçu par le formulaire.
Le DataGrid ne doit présenter que les notes en cours. Nous utiliserons le Contrôle DataView pour effectuer ces sélections. Le contrôle DataView permet de rechercher, filtrer et trier les données présentes dans un objet DataTable. Chaque DataTable possède par défaut un DataView (monDS.Tables["Note"].DefaultView).
Pour choisir les colonnes de la DataTable à afficher dans le DataGrid nous utiliserons le contrôle 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 « table_service » et de son DataView par défaut.
Travail à Faire
Dans le constructeur du formulaire
ajouter :
DataView dvNote = new DataView(monDS1.Tables["Regrouper"]);
dvNote.RowFilter = String.Format("idNote = {0} and prepare
= false",idN);
dgNote.DataSource=dvNote;
dvNote.AllowDelete=false;
dvNote.AllowEdit=false;
dvNote.AllowNew=false;
DataGridTableStyle TS_N = new DataGridTableStyle();
TS_N.MappingName=Convert.ToString(dvNote.Table);
if (!dgNote.TableStyles.Contains("Note"))
dgNote.TableStyles.Add(TS_N);
dgNote.TableStyles[0].GridColumnStyles[0].Width=60;
dgNote.TableStyles[0].GridColumnStyles[0].HeaderText="Date";
dgNote.TableStyles[0].GridColumnStyles[1].Width=50;
dgNote.TableStyles[0].GridColumnStyles[1].HeaderText="N°
Note";
dgNote.TableStyles[0].GridColumnStyles[2].Width=55;
dgNote.TableStyles[0].GridColumnStyles[2].HeaderText="N°
Table";
dgNote.TableStyles[0].GridColumnStyles[3].Width=0;
dgNote.TableStyles[0].GridColumnStyles[4].Width=60;
dgNote.TableStyles[0].GridColumnStyles[4].HeaderText="Couverts";
dgNote.TableStyles[0].GridColumnStyles[5].Width=0;
cmbTable.DataSource=monDS1.Tables["table_service"].DefaultView;
cmbTable.DisplayMember="id";
cmbTable.ValueMember="id";
Dire quelle donnée est
affichée dans le contrôle cmbTable, et quelle est celle qui sera référencée dans le programme en
cas de sélection.
cmbTable.DisplayMember="id";
cmbTable.ValueMember="id";
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 suivantes :
Création d’une nouvelle ligne (DataRow) dans la DataTable
« Note »
DataRow NLigne =
monDS1.Tables["Note"].NewRow();
Valoriser 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();
Signifier que la table est occupée (DataTable « table_service » colonne occupe =
true)
Rafraîchir le DataGrid dgNote en utilisant la méthode Refresh du contrôle
Rendre inactif (enabled=false) les contrôles suivants :
btnOk, btnSuite, btnAddition, cmbTable et txtNbCouverts
Afficher le formulaire frmSaisiPlat
et passer en paramètres du formulaire le DataSet monDS1 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 déclenche les opérations suivantes :
- 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 « Note » ;
- 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 comme 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
« Regrouper » (cf.
annexe1) en sélectionnant (par l’intermédiaire du DataView par défaut) 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 ». 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.
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 « double cliquer » sur le contrôle cmbFamille, pour générer la méthode cmbFamille_SelectedIndexChanged.
Remplir le
DataGrid dgMenu à partir de la DataTable « Plats » et du numéro de
famille sélectionné (cmbFamille.SelectedValue).
Ecrire une fonction (nbPlatsCommandesParFamille) qui renvoie
le nombre de plats déjà commandés dans cette note pour cette famille
(paramètres numeroNote et numeroFamille)
Appeler la
méthode nbPlatsCommandesParFamille et afficher le résultat dans le contrôle txtNbPlatFamille.
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 = monDS1.Tables["Regrouper"].NewRow();
Initialiser les colonnes d’un DataRow :
ligneR["dateJour"]=DateTime.Now.ToShortDateString();
Ajouter la
ligne dans la DataTable :
monDS1.Tables["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 « Regrouper » 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 « Regouper » 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 vous 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 « Regrouper ») à 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’appuie sur ce bouton déclenche les opérations suivantes :
- Création d’un DataSet par « clonage » du Dataset « monDS1 » (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 « Regrouper » pour cette note (txtNote.Text) ;
- Création d’une instance de la référence Web xavier et appel de la méthode insereNote ;
- Modification des lignes de la DataTable « Regrouper » envoyées (colonne prepare = vrai) dans le DataSet initial (monDS1);
- 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 = monDS1.Clone();
Importer une ligne dans un DataSet :
dsAPreparer.Tables["Note"].ImportRow(ligneN[0]);
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’appuie 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 » ;
- Création d’une instance de la référence Web xavier et appel de la méthode factureNote ;
- 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 « table_service ») ;
- 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 ces fonctionnalités.
ANNEXE 1
Nous allons utiliser un DataSet (en mémoire) pour stocker les données reçu du service Web suite à l‘authentifications et celles saisies par le serveur dans l’application Pocket PC.
Ce DataSet contient les DataTables suivantes :
table_service (table attribué au serveur pour ce service) :
idServeur
id (identifiant de la table attribué au serveur ce jour)
nbPlaces (nombre de places de la table)
occupe (0 la table est libre, 1 la table est occupée) : colonne ajouté après récupération du DataSet lors de l’appel de la méthode getEnvironnement du service web.
famille (trié par libéllé) :
id
libelle
Plat :
designation
id
idFamille
Note (note du jour pour le serveur trié par id note) :
dateJour
id
idTableService
idServeur
nbCouverts
facturee
Regrouper (contenu des notes non facturées du jour pour le serveur) :
designation (de l’entité Plat)
idPlat
idServeur
dateJour
idNote
quantite
prepare
idFamille (Famille du Plat)
ANNEXE 2
Si vous ne disposez pas dans Visual Studio 2003 de version récentes de l’émulateur vous devez :
-
Télécharger le SDK Pocket PC 2003 sur le site de
MicroSoft
Microsoft Pocket PC 2003
SDK.msi
- Installer Microsoft Pocket PC 2003 SDK.msi
-
Télécharger les émulateurs :
Windows Mobile 2003 Second Edition Emulator Images for Pocke.msi
Windows Mobile 2003 Second Edition Emulator Images for Pocket PC - FRA.msi
- Installer ces émulateurs.
ANNEXE 3
Pour déployer votre application sur un Pocket PC vous devez disposer :
- D’un Pocket PC muni de Windows Mobile 2003 ;
- Sur l’ordinateur possédant Visual Studio 2003 vous devez avoir MicroSoft ActiveSync (en téléchargement sur le site de MicroSoft rubrique Pocket PC) ;
- Connecter votre Pocket PC à votre ordinateur par l’intermédiaire du port USB ;
-
Choisir dans Visual Studio 2003 de déployer sur Pocket
PC
Puis générer l’application
- Elle s’exécute alors sur le Pocket PC.
Pour utiliser le Pocket PC de façon indépendante (sans être connecté au port USB)
- Vous devez déjà avoir déployé l’application par le port USB
- Votre Pocket PC doit pouvoir se connecter au réseau en Wi-Fi, votre serveur SQL doit être en fonctionnement, et le service Web doit pouvoir y accéder.
-
Pour exécuter l’application :
menu Démarrer
Explorateur de Fichiers
Mon Pocket PC
Program Files
ChezAntoinePPC
AntoinePPCVersion0.exe