DANS LES SYSTÈMES ACTUELS (LINUX, MAC, WINDOWS), L'UTILISATEUR COMMUNIQUE AVEC L'ORDINATEUR PAR DES "OBJETS GRAPHIQUES" (FENÊTRES)
EXEMPLE :
FICHIER / NOUVEAU DOSSIER
=> CRÉE UN OBJET DE TYPE "DOSSIER" :
COMME TOUS LES LANGAGES, DRSCHEME
--> GUI = "GRAPHICAL USER INTERFACE"
==> CLASSES PRÉDÉFINIES D'OBJETS (FENÊTRE, TEXTE, BOUTON) PARMI LESQUELLES ON CHOISIT LES COMPOSANTS DE L'INTERFACE
"CLASSE" = MÉCANISME GÉNÉRAL POUR
"INSTANCIATION"
==> CET OBJET EST AUTOMATIQUEMENT
DOTÉ DES OUTILS, FONCTIONS, ... DE CETTE CLASSE
EXEMPLE : CLASSE "BOUTON"
. . . SANS QUE LE S'EN OCCUPE !!!
LES FONCTIONS PROPRES À UNE CLASSE SONT APPELÉES DES "MÉTHODES"
(MAKE-OBJECT <CLASSE> <VAL1> <VAL2> ...)
--> INSTANCIE UN OBJET D'UNE CLASSE
EN DONNANT DES VALEURS AUX PARAMÈTRES D'INITIALISATION
(SEND <OBJET> <METHODE> <VAL1> <VAL2> . . .)
--> APPLIQUE UNE MÉTHODE DE LA CLASSE
D'UN OBJET EN DONNANT DES VALEURS AUX ARGUMENTS
CLIQUER, OU ENFONCER UNE TOUCHE,
À LA RECEPTION DE CET ÉVÉNEMENT,
==> . . . C'EST-À-DIRE L'ÉVALUATION D'UNE FONCTION !
|
RÈGLE D'ÉVALUATION POUR UNE ACTION |
ATTENTION : UNE ACTION A OBLIGATOIREMENT DEUX ARGUMENTS (OBJET, ÉVÉNEMENT)
... MÊME SI ON NE S'EN SERT PAS!
PRINCIPALES CLASSES DE DRSCHEME,
(DEFINE W (MAKE-OBJECT FRAME% "Toto"))
--> CRÉE UNE FENÊTRE
(SEND W SHOW #T)
--> AFFICHE LA FENÊTRE
(DEFINE B
(MAKE-OBJECT BUTTON% "Cliquez!" W ACTION))
--> CRÉE UN BOUTON
(SEND B GET-LABEL)
--> DONNE LE TITRE
(DEFINE T
(MAKE-OBJECT TEXT-FIELD% "Texte:" W ACTION))
--> CRÉE UNE FENÊTRE DE TEXTE
(SEND T GET-LABEL)
--> DONNE LE TITRE
(SEND T SET-VALUE "nouveau texte")
--> MODIFIE LE TEXTE
(SEND T GET-VALUE)
--> DONNE LE TEXTE
(SEND T FOCUS)
--> PLACE LE CURSEUR DANS LA FENÊTRE
(SEND E GET-EVENT-TYPE)
--> DONNE LE TYPE DE L'ÉVÉNEMENT
EXEMPLE 1 :
(DEFINE FRAME (MAKE-OBJECT FRAME% "Exemple 1")) (SEND FRAME SHOW #T) (DEFINE (ACTION O E) (DISPLAY (SEND O GET-LABEL)) (DISPLAY " ") (DISPLAY (SEND E GET-EVENT-TYPE)) (DISPLAY " / ")) (MAKE-OBJECT BUTTON% "Toto" FRAME ACTION) (MAKE-OBJECT TEXT-FIELD% "Titi" FRAME ACTION)
EXEMPLE 2 :
(DEFINE FRAME (MAKE-OBJECT FRAME% "Exemple 2"))
(SEND FRAME SHOW #T)
(DEFINE (ACTION O E)
(COND ((EQ? (SEND E GET-EVENT-TYPE) 'TEXT-FIELD-ENTER)
(DISPLAY "STOP: ") (DISPLAY (SEND O GET-VALUE))
(SEND O SET-VALUE ""))
(ELSE (DISPLAY " LETTRE "))))
(MAKE-OBJECT TEXT-FIELD% "Toto" FRAME ACTION)
REMARQUE : (GET-TEXT-FROM-USER "Saisie" "Écris ton texte:")
--> OUVRE UNE FENÊTRE DE SAISIE
--> RENVOIE UNE CHAÎNE DE CARACTÈRES (TEXTE DE L'UTILISATEUR)
CHERCHER UN MOT DE 5 LETTRES EN 3 ESSAIS,
L = LISTE DE MOTS ("CARTE" "CORDE" "TARTE" . . .)
(DEFINE (NTH N L) (IF (= N 0) (CAR L) (NTH (- N 1) (CDR L)))) (DEFINE MOT-CACHE (NTH (RANDOM (LENGTH L)) L))COMPARAISON DES MOTS :
(DEFINE (DEVOILE LETTRE-CACHEE LETTRE)
(IF (EQ? LETTRE-CACHEE LETTRE) LETTRE #\*))
(DEFINE (COMPARE X1 X2)
(LET ((L1 (STRING->LIST X1)) (L2 (STRING->LIST X2)))
(LIST->STRING (LIST (DEVOILE (NTH 0 L1) (NTH 0 L2))
(DEVOILE (NTH 1 L1) (NTH 1 L2))
(DEVOILE (NTH 2 L1) (NTH 2 L2))
(DEVOILE (NTH 3 L1) (NTH 3 L2))
(DEVOILE (NTH 4 L1) (NTH 4 L2))))))
ACTION EFFECTUÉE À CHAQUE SAISIE :
(DEFINE (SAISIE T TSUIVANT)
(LET* ((Z1 (SEND T GET-VALUE))
(RES (COMPARE MOT-CACHE Z1)))
(SEND M SET-VALUE RES)
(FIN MOT-CACHE Z1 T TSUIVANT)))
INTERFACE :
(DEFINE W (MAKE-OBJECT FRAME% "le mot mysterieux")) (DEFINE M (MAKE-OBJECT TEXT-FIELD% "mot caché" W VOID)) (DEFINE T1 (MAKE-OBJECT TEXT-FIELD% " 1er essai:" W VOID)) (DEFINE (ACTION1 OB EV) (SAISIE T1 T2)) (DEFINE B1 (MAKE-OBJECT BUTTON% "OK" W ACTION1))+ IDEM POUR LES 2 AUTRES ESSAIS :
T2, ACTION2, B2INITIALISATION DE L'INTERFACE :
T3, ACTION3, B3
(SEND W SHOW #T) (SEND M SET-VALUE "*****") (SEND T1 FOCUS)TEST DE FIN DE PARTIE :
(DEFINE (FIN MOT-CACHE Z1 T TSUIVANT)
(COND ((EQUAL? MOT-CACHE Z1)
(SEND M SET-VALUE
(STRING-APPEND MOT-CACHE " GAGNE!")))
((EQUAL? T T3)
(SEND M SET-VALUE
(STRING-APPEND MOT-CACHE " PERDU!")))
(ELSE (SEND TSUIVANT FOCUS))))
PAR DÉFAUT, LES OBJETS D'UNE FENÊTRE,
--> POUR UNE DISPOSITION DIFFÉRENTE,
==> EN LES COMBINANT, TOUTES LES DISPOSITIONS SONT POSSIBLES
|
(DEFINE H (MAKE-OBJECT HORIZONTAL-PANEL% O))
--> CRÉE UN PANNEAU HORIZONTAL DANS O
(DEFINE V (MAKE-OBJECT VERTICAL-PANEL% O))
--> CRÉE UN PANNEAU VERTICAL DANS O