• Aucun résultat trouvé

IFT 1175 - TP 1

N/A
N/A
Protected

Academic year: 2022

Partager "IFT 1175 - TP 1"

Copied!
6
0
0

Texte intégral

(1)

IFT 1175 - TP 1

Ce premier TP constitue une première introduction aux éléments de program- mation traditionnelle et événementielle. Il demande peu de travail de programmation. Par contre il nécessite une bonne analyse des mécanismes en jeu. La première partie consiste donc à bien «suivre» le modèle d'exécution et à bien comprendre son fonctionnement. Le projet, dans son ensemble, vise à permettre à un utilisateur éventuel (le programmeur travaille toujours pour les autres) de visualiser et de modifier les données relatives au personnel d'une entreprise et ce, d'une façon relativement «conviviale». Il est constitué de plusieurs mini-problèmes que vous devrez résoudre pour le mieux. Il comptera pour 20%

de la note des TPs, soit 8% de la note globale.

ÉTAPE 1

La première étape consiste bien sûr à récupérer les documents de travail dans les salles de la DESI ou sur la page Web, ce que vous avez vraisemblablement fait puisque vous lisez ce texte. Ces documents sont placés dans les dossiers «Mod_1», «TP1» et

«RemTP1». Le premier dossier «Mod_1» contient des textes sur la théorie. «TP1»

contient les directives du programme (ce texte-ci) ainsi que l’exemple du programme (un modèle en somme du projet que vous devrez mettre au point) TP1.exe ainsi que le fichier de données EmplTP1.dta qui l’accompagne. Le dernier dossier «RemPT1» contient les fichiers de travail que vous devrez mettre au point, ce qui vous permettra au moment voulu de le «remettre» au correcteur.

Parmi les fichiers présents dans vos dossiers, ceux qui nous intéressent sont les deux suivants : TP1.exe qui contient un modèle du résultat attendu et TP1Empl.sln qui est la porte d’entrée de votre projet en mode de développement.. Les autres fichiers sont des fichiers d’appoint qui sont nécessaires mais qui seront appelés par les deux premiers.

Il s’agit de compléter le projet/solution TP1Empl.sln pour qu’il ressemble au programme TP1.exe. Le contexte de fonctionnement est celui décrit au cours : on a un groupe d’une quarantaine d’employés sur lesquels on a des informations placées dans un tableau (à 1 dimension) d’une variable gEMPLOYES de type personnalisé (structuré) TypEmploye. Il importe peu pour le moment de savoir comment les données se retrouvent dans le fichier : nous pouvons présumer que d'autres applications ont cette fonction. Le projet de départ comprend 1 module et deux feuilles de travail. Le module comprend une procédure de départ sub main() qui lance une première fenêtre de bienvenue. Celle-ci, vous permet d'entrer un mot de passe pré-déterminé vous donnant accès à une deuxième fenêtre avec ou sans la possibilité de modifier les données des employés. Puis, après une pause de quelques secondes pendant laquelle un message d'attente «clignote» à l'écran, la feuille de bienvenue cède sa place à une feuille d’affichage où l’on peut afficher et modifier les données sur les employés.

Au moment de l’apparition de la feuille d’affichage, la variable gEMPLOYES (le

«g» indique qu’il s’agit d’une variable globale) contient déjà les 38 blocs de données provenant du fichier «EmplTP1.dta». La tâche consistera donc compléter la program- mation de la feuille pour nous présenter les données et nous permettre de les modifier facilement.

(2)

ÉTAPE 2

Lancez le programme TP1Empl.sln. en mode «Pas-à-pas» (touche <F8>) et observez son fonctionnement. Il s’agit de faire comme pour le TP0 : modifier le projet de façon à ce qu'il se rapproche du modèle «TP1.exe».

La structure des données est la suivante (dans le module de programmation) :

Public Structure typEmploye

Nom As String ‘ caractères

Numero As String ‘ 3 caractères, comme «099»

Telephone As String ‘ +/- 13 caractères Poste As String ‘+/- 10 caractères

NumPatron As String ‘ même format que le numéro d’employé

DateEmbauche As Date ‘ Format dépendant de votre installation Windows Salaire As Short

SiComm As Short ' 0 = Non, 1 = Oui.

MtCommission As Short

NumDepartement As Short ‘ 2 chiffres, peut valoir 10, 20, 30, 40, 50 ou 60 End Structure

Dim gEmployes (50) As typEmploye ' (Tableau d'employés)

On y définit donc le type (Structure) de variable «typEmploye» et un tableau de 51 éléments de ce même type. Toutes ces variables sont «globales» et donc accessibles dans toutes les procédures de la feuille. .

La procédure de départ «Sub Main()» provoque la création et l'affichage de la feuille de bienvenue «frmIntro», provoquant du coup l'exécution de sa procédure événementielle «Form_Load()». Celle-ci fait la lecture du fichier de données dans le tableau, après quoi elle active les minuteries en leur fixant un intervalle de quelques secondes.

La minuterie «tmrMess» intervient à chaque demi seconde pour afficher/effacer le label du message d'attente. À son tour, la minuterie «tmrMdeP» déclenche le processus de remplacement (fermeture et ouverture) de la feuille de bienvenue par celle de l'affichage des employés. Lors du chargement de la nouvelle feuille, le programme

«construit» la liste des postes d'employés. Il «ajoute» le poste du premier employé dans la zone de liste déroulante, puis, pour chacun des autres employés (du deuxième au dernier), il n'ajoute le poste à la liste qu'après s'être assuré qu'il ne s'y trouve pas déjà.

L'avantage d'une liste déroulante sur la zone de texte standard, c'est que l'utilisateur ne risque pas de mal épeler un poste (exemple : «secretaire» au lieu de

«secrétaire») et d'en créer un nouveau par inadvertance. Une fois la feuille chargée et affichée, c'est l'action de l'utilisateur qui déclenchera les différents événements liés aux éléments de la feuille.

Sur la feuille de travail frmEmpl se trouvent les boutons de commande

(3)

déjà programmée est de placer dans les contrôles de la feuille les données du premier employé du tableau : gEmployes (1). On y trouve donc

EcrEmp (gRangEmp)

gRangEmp = 1 LireEmp (gRangEmp)

c'est-à-dire appeler la procédure qui écrira dans la liste la fiche courante (celle affichée dans la fenêtre), puis mettre 1 dans la variable «gRangEmp» et enfin appeler la procédure de lecture pour lire ce premier élément de la liste. Puis dans le cas où (au début) les autres boutons seraient «inaccessibles» (Enabled = False), on procède, après affichage, à l'activation de tous les autres boutons.

La procédure EcrEmp(... RgEmp ...) sert à placer les informations de la feuille dans l'élément «RgEmp» de la liste, à condition bien sûr que le paramètre «RgEmp» soit bien compris entre 1 et 38, ce qui n'est pas le cas au premier coup. Si une valeur a été modifiée par l'utilisateur, elle sera recopiée dans le tableau.

De la même façon, la procédure LireEmp((... RgEmp ...) permet de placer sur la feuille les informations contenues dans l'élément «RgEmp» du tableau des données… si

«RgEmp» est valide. La feuille contient d’autres contrôles qui visent à permettre à l’utilisateur de visualiser et de modifier les données. Ces contrôles doivent avoir les caractéristiques suivantes.

Les zones de textes sont les plus simples : elles permettent d’afficher et de modifier l’information directement. Ici, le nom et la date sont des zones «ouvertes»

puisqu’on peut y placer n’importe quoi. Par contre, le numéro d’employé et le rang dans le tableau ne doivent évidemment pas pouvoir être changés. On leur donnera donc la propriété «Locked». On utilisera aussi des zones de texte pour les données numériques.

Par ailleurs, la zone d’étiquette «Label» nommée «Revenu annuel» doit afficher en tout temps la valeur adéquate : 26 périodes de salaire plus la commission, cette dernière valeur n'étant prise en compte dans le calcul que si le statut de l’employé l’autorise. Si un employé «non à commission» affiche une valeur dans «Commission», on ne l’efface pas mais on ne l’utilise pas dans le calcul du revenu annuel. Pareillement le

«Label Années d’ancienneté» doit afficher le nombre d’années complètes depuis l’embauche de l’employé.

(4)

ÉTAPE 3

Après avoir bien analysé le «pas-à-pas» de votre programme, il vous faudra lui apporter les modifications suivantes.

ƒ ( 2 points) Vérifiez et empêcher les «dépassements» des boutons «Suivant»,

«Précédent», etc.

ƒ ( 3 points) Le programme prévoit que les employés sont et seront toujours au nombre de 38. On peut envisager que ce nombre ne dépassera pas la cinquantaine (50), mais non pas qu'il sera immuable. Or, sachant que la fonction (méthode) Peek() associée au «Lecteur» UnLecteur vaut «-1» s'il ne lui reste plus rien à lire, modifiez le programme pour qu'il devienne indépendant du nombre effectif d'employés.

ƒ (3 points) Dans le modèle, la zone de texte «txtMotDePasse» permet d'entrer un code

«caché» qui, s'il est valide (égal à «BIDULE» ou «COMMUN» en minuscules ou majuscules) lancera la suite de l'exécution. La procédure «Change» du contrôle activera la minuterie en lui fixant un intervalle de quelques secondes dès que l'utilisateur aura entré l'un des deux mots de passe. S'il s'agit de «BIDULE», il placera une variable booléenne globale «gPermis» à «True». En conséquence de la valeur mise dans «gPermis», le programme verrouillera/déverrouillera, lors du chargement de la feuille des employés, les contrôles d'affichage, permettant ou non à l'utilisateur de modifier les données de l'employé.

ƒ (2 points) Ajoutez le bouton de commande «Inverser» qui permet à l'utilisateur d'échanger les données de l’employé courant avec celle de l’employé précédent (ils changent simplement de rang dans le tableau) et donc de réordonner à son choix l'ordre des employés (leur rang, pas leur numéro).

ƒ (2 points) Le calcul de l'ancienneté est erroné car il ne tient pas compte de la période de l'année où a eu lieu l'embauche. Comment ajuster le calcul ? Il suffit d'ajouter (fonction «DateADD») le nombre d'années calculé à la date d'embauche et voir si cette date est dans le passé ou dans le futur … donc si la dernière année calculée est complétée ou non.

ƒ (3 points) Dans l'état actuel du programme, si on modifie le salaire bi-hebdomadaire ou le statut «A commission» d'un employé, le revenu affiché ne sera pas recalculé. Il le sera cependant si, passant d'une fiche à l'autre, vous revenez à cette fiche. Il sera alors recalculé. Modifiez le programme en ajoutant des procédures événementielles

«Click» ou «Change» de telle façon qu'après avoir entré une modification au salaire, à la valeur ou au statut de la commission, le revenu annuel soit recalculé automatiquement (une procédure serait ici bien utile pour éviter des répétitions).

ƒ (2 points) Dans le programme actuel, toute modification apportée à la fiche d'un employé sera répercutée dans le tableau mais non dans le fichier. Si donc ré-exécute le programme, les modifications seront perdues. Modifiez le programme de manière à ce que lors de la fermeture, un nouveau fichier «EmplTP1Nouv.dta» contienne les nouvelles valeurs des enregistrements des employés.

Les derniers 3 points seront accordés à la valeur de l’écriture, les commentaires et

(5)

Les contrôles comme interface utilisateur-données

Les contrôles de la feuille servent en fait à présenter à l’utilisateur les informations dont il a besoin et lui permettent s’il y a lieu de modifier celles-ci. Par ailleurs la plupart des applications requièrent une grande masse de données qui doivent être conservées entre les moments de l’utilisation de l’application. D’où l’importance des fichiers (cf. le deuxième module).

Le scénario type est donc : l’application est lancée, le(s) fichier(s) est ouvert, les données sont acheminés soit directement vers les contrôles, soit dans des variables qui sont ensuite recopiées dans les contrôles. Dans le TP1, la phase de lecture du fichier est «occulte» et les données sont placées dans le tableau de variables «gEmployes(1 to 38)» et toutes les manipulations se font ensuite à partir des variables elles-mêmes.

La façon la plus simple d’interagir avec les données est de placer dans les zones de texte où l’utilisateur peut les manipuler à sa guise. Par exemple : txtNom.Text = vNom place la données existante dans le contrôle et, après modification, vNom = txtNom.Text fait l’inverse. L’inconvénient : l’utilisateur peut se tromper en entrant une valeur pré-définie comme le titre d’un poste qui peut valoir certaines valeurs uniquement.

Les zones de liste et les listes modifiables ont pour avantage d’afficher la donnée en clair mais de limiter le choix de l’utilisateur aux valeurs permises. Si la liste est très courte et très stable, (ex. le choix de la province parmi les dix prévues) on peut toujours en définir manuellement la liste lors du développement (dans la fenêtre des propriétés). Mais si la liste doit changer, on doit modifier l’application et recompiler ensuite. On peut aussi charger la liste au moment de l’exécution : LstListe.Items.Add «Québec » etc. Il faut quand même modifier le programme pour modifier la liste.

Si au contraire la liste se trouve dans un fichier, il suffit de modifier le fichier, puis au moment du lancement de l’application, la liste des choix sera adaptée. Une fois la liste établie, la donnée courante sera copiée dans la propriété «Text» de la liste.

LstListe.Text = vPoste. Automatiquement, la valeur correspondante de la liste sera

«sélectionnée». Si l’utilisateur clique sur un autre choix, la valeur de «.Text» sera ajustée en conséquence. De plus la propriété «.ListIndex» indiquera le rang (0 à n –1) de l’item choisi. Pour sauvegarder la nouvelle valeur dans la variable, on utilise soit «.Text», soit

«.List(Index)».

Si la sélection multiple est activée, la liste «.Selected(I)» de booléens indiquera quels sont les items retenus. La variable utilisée pour contenir cette information devra refléter cette multiplicité. Par exemple, une chaîne de 10 caractères, un pour chacun des choix. Ainsi, la chaîne « QOBC » tiendra pour «Québec+Ontario+N.Bruswick+Colombie-B.». A la lecture, on bouclera sur chacun des caractères et on sélectionnera les éléments corres- pondants de la liste.

(6)

For I = 0 to lstListe.Items.Count –1

If correspondance entre le caractère et lstListe.Items(I) then lstListe.SelectedItems(I) = True

End If Next

Si la liste de sélection change après intervention de l’utilisateur, on opère l’action inverse : pour chaque objet sélectionné de la liste, on ajoute un code dans la variable.

Pour les boutons d’option ou les cases à cocher, on les active lors la lecture selon la valeur de la variable : chkSiComm.Value = (vSiComm =1). L’inverse a lieu à l’écriture.

Attention : si vous avez plus d’un bouton d’option, le fait d’en activer un désactives tous les autres de la liste mais en désactiver un ne désactive pas les autres bien sûr. Quant aux cases à cocher, elles agissent indépendamment, donc on doit les contrôler par

programmation.

Références

Documents relatifs

JUDICIAIRE DE LA JEUNESSE GRAND CENTRE - Siège DIJON GESTIONNAIRE GESTION ADMINISTRATIVE COLLECTIVE EN RESSOURCES HUMAINES. DIRECTION INTERREGIONALE DE

Rédige des questions afin que les mots soulignés en soient la réponse:.. Ben sleeps eight hours

Familiarisation avec l'environnement de travail. Exercices dirigés et réalisation du travail pratique no 1. ▫ Gestions d’erreurs et débogage. ▫ Programmation

Cocher oui, cocher non (CheckBox nommé chkCoche) : la case à cocher manque ici complètement de réaction car elle n’a pas été programmée… Il en va de même pour la bulle

[r]

Vous devrez définir une classe d'objets de type «Ballon» et utiliser cette classe pour manier des objets de ce type dans une application. Le

Pour créer «l'historique» des ballons», il suffit d'ajouter le titre et la durée du ballon (donc deux éléments à la fois) à la collection «1». Puis à la fin, pour transférer

[r]