L'application Pocket-PC

 

- L'application Pocket PC

a-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 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

 

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.

 

 

b-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

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";

 

 

 

c-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 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]);

 

 

d-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’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