Les programmeurs écrivent des interfaces utilisateur depuis déjà une vingtaine d’années et cependant il n’y a pas de façon commune de pratiquer selon qu’on utilise Html/Javascript, Visual Basic, OpenGL, Tcl-Tk, C et Motif sur Unix, C et MFC sur Windows ou Java ... et bien d’autres langages.
On présente ici les concepts, communs à tous ces langages pour définir les traitements qu’un utilisateur déclenche par l’intermédiaire de l’interface. La réalisation des concepts diffère suivant que le langage est interprété ou compilé, et suivant l’environnement graphique mis à la disposition du programmeur.
Voici un exemple de formulaire pour enregistrer une identité (nom,prénom); cinq objets d’interface sont utilisés: deux étiquettes et leur champ de saisie respectif (chNom, chPrénom), et un bouton-poussoir (‘ENREGISTRER’). |
|
Le programmeur désire associer le bouton-poussoir, l’événement ‘clic’, le traitement qui enregistre une nouvelle identité (dans un fichier, une base de données ...) et les données (ici les deux champs chNom et chPrénom, afin d’y récupérer l’identité à enregistrer); nous les appelons données-programmeur.
Cet exemple met en avant la nécessité, pour le traitement déclenché par l’appui sur ‘ENREGISTRER’ de connaître chNom et chPrénom.
L’animation d’une interface utilisateur se fait grâce aux éléments suivants :
L’environnement graphique mis à la disposition du programmeur intervient pendant deux phases distinctes: d’une part quand le programmeur écrit ses instructions, d’autre part quand l’interface programmée s’exécute.
Pendant la première phase, cet environnement graphique fournit au programmeur:
Pendant la deuxième phase les routines de l’environnement graphique animent les OI prédéfinis (édition de champ de saisie, apparence d’un bouton enfoncé/relaché, changement de couleur d’un texte quand la souris passe dessus ...) et appellent les réflexes définis par le programmeur en leur communiquant les données pertinentes pour le traitement. C’est pour cela que les réflexes ont un prototype défini par l’environnement graphique. Les réflexes sont appelés par les routines de l'environnement et non par une instruction du programmeur.
Il faut noter que les données de l’environnement graphique accessibles au réflexe sont souvent un paramètre prévu dans le prototype imposé du réflexe. Ces données comprennent des informations sur l’événement (position de la souris, caractère frappé au clavier ...) et l’objet graphique source de l’événement.
Par contre les données-programmeur sont rarement prises en compte par l’environnement graphique. Cependant on trouve
Dans tous les langages, le réflexe peut accéder à des informations globales, comme n’importe quel sous-programme du langage; cette possibilité d’accès aux variables globales est fortement déconseillée car cela rend la maintenance de programme difficile; cependant il est courant qu’un ouvrage déconseille l’usage d’informations globales dans son premier chapitre, et oublie cet adage dans le chapitre ‘interface utilisateur’.
Voyons quelques façons de réaliser l’association OI-EV-RFX-D, suivant le langage.
En C et Motif, l’association OI-EV-RFX-D entre l’objet graphique, l’événement, le réflexe et les données programmeurs se fait par appel du sous-programme XtAddCallback, qui reçoit en paramètre l'objet graphique, l'événement déclencheur, le réflexe (adresse de fonction) et les données-programmeur.
void reflexe(Widget btn, XtPointer donProg, XmPushButtonCallbackStruct *pevt) { ... }
Widget btn = XmCreatePushButton(fenetre, "Valider", NULL, 0);
donPrg = ...;
XtAddCallback(btn, XmNactivateCallback, reflexe, donPrg);
En java , comme un sous-programme ne peut pas être utilisé en argument d’une méthode, on utilise une classe qui implante alors une méthode (spécifique à l'événement déclencheur) correspondant au réflexe voulu, en ajoutant dans cette classe les données-programmeur. On crée ensuite au moins un objet de cette classe.
Puis l’association entre objet graphique et réflexe est faite par une méthode (spécifique à l’événement attendu) de l'objet graphique; par exemple pour un objet de classe Button, addActionListener permet l'association entre le bouton et l'objet 'réflexe' créé.
Classe CReflexe implements ActionListener { Donnees donProg; CReflexe(Donnees d) { donProg=d; } void actionPerformed( ActionEvent evt} { ... } } donnéesProgrammeur = ... CReflexe objReflexe = new CReflexe ( donnéesProgrammeur); Button btn = new Button(‘ENREGISTRER’); btn.addActionListener(objReflexe) ;
Il exisite d’autres possibilités de programmation où la classe CReflexe paraît absente ou incomplète.
Ces possibilités de programmation peuvent être utilisées dans les cas
simples où il n’y a pas de données-programmeur. Par exemple si on désire
terminer l'application par un bouton, sans demander confirmation à
l'utilisateur, le traitement-réflexe n'utilise aucune information
C'est
admissible pour un exercice mais cela l'est moins si votre application
doit conserver des résultats, car alors la moindre des choses est de
prévenir l'utilisateur s'il n'a rien enregistré; cela sous-entend
qu'avant de fermer il faut disposer de l'information:
'des résultats ont-ils été conservés'.
En Visual Basic, une fois l'objet graphique créé, l'association est faite en définissant le réflexe comme un sous-programme dont le nom est imposé, car composé du nom de l'objet graphique (voir text1 ci-dessous) et de celui de l'événement déclencheur (voir KeyPress ci-dessous). L'accès au données-programmeur se fait en forçant ces données à avoir une portée globale dans la feuille, afin qu'elles soient accessibles dans le sous-programme.
Private Sub text1_KeyPress(toucheAscii As Integer) Select Case KeyAscii ... End Select End Sub
En Html/Javascript , on utilise une propriété de l'objet graphique, spécifique à l'événement déclencheur; cette propriété reçoit, sous forme chaîne de caractères, l'instruction à exécuter. L'accès aux données-programmeur se fait en utilisant un paramètre lors de l’appel (il existe aussi la notion de portée globale dans la page qu’il vaut mieux éviter d’utiliser).
Exemple 1, voir propriété onClick:
<form> nom : <textarea name="nom" rows=3 cols=55> Exemple </textarea> <input type="button" value="exécution" onClick="jexecute(this.form)"> </form>
Exemple 2, voir propriétés onMouseOver, onMouseOut:
<a href="javascript:alert('On clique ...')" onMouseOver="document.images.main.src='../u/lettres/main1.gif'" onMouseOut="document.images.main.src='../u/lettres/main.gif'"> <img name="main" src="../u/lettres/main.gif" align="bottom" border="0" alt="main.gif"> </a>
http://cpcug.org/user/clemenzi/technical/Languages/
chercher ‘Basic Windows GUI Tasks’
http://msdn.microsoft.com/library/default.asp
http://www.cs.cf.ac.uk/Dave/X_lecture/node5.html
http://www.cppfrance.com/rechcodesndx.aspx