Guide du développeur
d’ACTIONSCRIPT® 3.0
Dernière mise à jour le 27/4/2013
Informations juridiques
Informations juridiques
Vous trouverez des informations juridiques à l’adresse http://help.adobe.com/fr_FR/legalnotices/index.html.
iii
Dernière mise à jour le 27/4/2013
Sommaire
Chapitre 1 : Utilisation des dates et des heures
Gestion des dates calendaires et des heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Contrôle des intervalles temporels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Exemple de date et heure : horloge analogique simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Chapitre 2 : Utilisation des chaînes
Principes de base des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Création de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Propriété length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Utilisation de caractères dans des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Comparaison de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Récupération des représentations de chaîne d’autres objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Concaténation de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Recherche de sous-chaînes et de modèles dans des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Conversion de la casse dans des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Exemple de chaîne : ASCII Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Chapitre 3 : Utilisation de tableaux
Principes de base des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Tableaux indexés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Tableaux associatifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Tableaux multidimensionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Clonage de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Extension de la classe Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Exemple de tableau : PlayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Chapitre 4 : Gestion des erreurs
Principes de base de la gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Types d’erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Gestion des erreurs dans ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Utilisation des versions de débogage des moteurs d’exécution Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Gestion des erreurs synchrones dans une application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Création de classes d’erreur personnalisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Réponse à des événements et à l’état d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Comparaison des classes Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Exemple de gestion des erreurs : application CustomErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Chapitre 5 : Utilisation d’expressions régulières
Principes de base des expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Syntaxe d’expression régulière . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Méthodes d’utilisation d’expressions régulières avec des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Exemple d’expression régulière : analyseur Wiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 iv
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 6 : Utilisation de XML
Principes de base de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Approche E4X concernant le traitement XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Objets XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Objets XMLList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Initialisation de variables XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Assemblage et transformation d’objets XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Parcours de structures XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Utilisation des espaces de noms XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Conversion de type XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Lecture de documents XML externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Utilisation de XML dans un exemple ActionScript : chargement de données RSS depuis Internet . . . . . . . . . . . . . . . . . . . . . . . 118
Chapitre 7 : Utilisation de la fonctionnalité JSON native
Présentation de l’API JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Définition du comportement JSON personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Chapitre 8 : Gestion des événements
Principes de base de la gestion des événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Variation de la gestion d’événements dans ActionScript 3.0 par rapport aux versions antérieures . . . . . . . . . . . . . . . . . . . . . . 131
Flux d’événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Objets événement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Ecouteurs d’événement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Exemple de gestion des événements : Alarm Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Chapitre 9 : Utilisation de domaines d’application
Chapitre 10 : Programmation de l’affichage
Concepts fondamentaux de la programmation de l’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Classes d’affichage de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Avantages de l’utilisation de la liste d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Utilisation des objets d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Manipulation des objets d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Animation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Orientation de la scène . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Chargement dynamique du contenu d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Exemple d’objet d’affichage : SpriteArranger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Chapitre 11 : Utilisation de la géométrie
Principes de base de la géométrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Utilisation des objets Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Utilisation des objets Rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Utilisation des objets Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Exemple de géométrie : application d’une transformation de matrice à un objet d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Chapitre 12 : Utilisation de l’API de dessin
Principes de base de l’API de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Classe Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 v
Sommaire
Dernière mise à jour le 27/4/2013
Dessin de lignes et de courbes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Dessin de formes à l’aide des méthodes intégrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Création de lignes et de remplissages en dégradé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Utilisation de la classe Math avec les méthodes de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Animation avec l’API de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Exemple d’utilisation de l’API de dessin : générateur algorithmique d’effets visuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Utilisation avancée de l’API de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Chapitre 13 : Utilisation des images bitmap
Principes de base de l’utilisation des images bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Classes Bitmap et BitmapData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Manipulation des pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Copie de données bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Compression des données d’une image bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Création de textures avec les fonctions de bruit aléatoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Défilement du contenu d’images bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Utilisation du mipmapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Exemple d’objet Bitmap : lune en rotation animée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Décodage asynchrone des images bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Chapitre 14 : Filtrage des objets d’affichage
Principes de base du filtrage des objets d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Création et application de filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Filtres d’affichage disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Exemple de filtrage des objets d’affichage : Filter Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Chapitre 15 : Utilisation des shaders de Pixel Bender
Principes de base des shaders de Pixel Bender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Chargement ou intégration d’un shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Accès aux métadonnées du shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Spécification des valeurs des entrées et des paramètres d’un shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Utilisation d’un shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Chapitre 16 : Utilisation des clips
Principes de base des clips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Utilisation des objets MovieClip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Contrôle de la lecture d’un clip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Création d’objets MovieClip à l’aide d’ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Chargement d’un fichier SWF externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Exemple de clip : RuntimeAssetsExplorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Chapitre 17 : Utilisation des interpolations de mouvement
Principes de base des interpolations de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Copie de scripts d’interpolation de mouvement dans Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Incorporation de scripts d’interpolation de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Description de l’animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Ajout de filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Association d’une interpolation de mouvement à ses objets d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 vi
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 18 : Utilisation de la cinématique inverse
Principes de base de la cinématique inverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Aperçu de l’animation de squelettes IK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Obtention d’informations sur un squelette IK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Instanciation de l’objet IKMover et restriction du mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Mouvement d’un squelette IK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Utilisation de ressorts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Utilisation d’événements IK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Chapitre 19 : Travail en trois dimensions (3D)
Principes de base des objets d’affichage 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Présentation des objets d’affichage 3D dans les moteurs d’exécution de Flash Player et d’AIR . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Création et déplacement d’objets d’affichage 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Projection d’objets 3D sur un affichage 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Exemple : Projection de perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Transformations 3D complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Création d’effets 3D à l’aide de triangles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Chapitre 20 : Principes de base de l’utilisation du texte
Chapitre 21 : Utilisation de la classe TextField
Affichage du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Sélection et manipulation de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Capture du texte saisi par l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Restriction de la saisie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Mise en forme du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Fonctions avancées d’affichage de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Utilisation du texte statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Exemple TextField : mise en forme du texte dans le style « article de journal » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Chapitre 22 : Utilisation de Flash Text Engine
Création et affichage de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Gestion des événements dans FTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Mise en forme du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Utilisation des polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Contrôle du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Exemple d’utilisation de Flash Text Engine : mise en forme d’un article de journal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Chapitre 23 : Utilisation de Text Layout Framework
Présentation de Text Layout Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Utilisation de Text Layout Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Structuration du texte à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Formatage du texte à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Importation et exportation de texte à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Gestion des conteneurs de texte à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Activation de la sélection, de la modification et de l’annulation de texte à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Gestion des événements à l’aide de TLF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Positionnement des images dans le texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 vii
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 24 : Utilisation du son
Principes de base de l’utilisation du son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Présentation de l’architecture audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Chargement de fichiers audio externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Utilisation des sons intégrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Utilisation de fichiers audio de lecture en continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Utilisation de données audio générées de façon dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Lecture de sons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Sécurité lors du chargement et de la lecture des sons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Contrôle du volume du son et de la balance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Utilisation des métadonnées audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Accès aux données audio brutes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Capture de l’entrée de son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
Exemple d’objet Sound : Podcast Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Chapitre 25 : Utilisation de la vidéo
Principes de base de la vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Présentation des formats vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Présentation de la classe Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Chargement de fichiers vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Contrôle de la lecture de la vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Lecture de vidéos en mode plein écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Lecture de fichiers vidéo en flux continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Présentation des points de repère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Ecriture de méthodes de rappel pour les métadonnées et les points de repère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Utilisation des points de repère et des métadonnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Gestion de l’activité de l’objet NetStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Rubriques avancées relatives aux fichiers vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Exemple vidéo : Video Jukebox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Présentation à accélération matérielle par le biais de la classe StageVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Chapitre 26 : Utilisation de caméras
Présentation de la classe Camera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Affichage du contenu de la caméra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Conception d’une application gérant une caméra locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Etablissement d’une connexion avec la caméra de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Vérification de la présence de caméras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Détection de l’autorisation d’accéder à la caméra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Optimisation de la qualité des vidéos de la caméra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Gestion de l’état de la caméra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Chapitre 27 : Utilisation de la gestion des droits d’auteur numériques (DRM)
Présentation du flux de travail associé au contenu protégé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Membres et événements DRM de la classe NetStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Utilisation de la classe DRMStatusEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Utilisation de la classe DRMAuthenticateEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Utilisation de la classe DRMErrorEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 viii
Sommaire
Dernière mise à jour le 27/4/2013
Utilisation de la classe DRMManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Utilisation de la classe DRMContentData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Mise à jour de Flash Player en vue de prendre en charge Adobe Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Licences hors bande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Prise en charge de domaine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Lecture de contenu chiffré à l’aide de la prise en charge de domaine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Aperçu de la licence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Diffusion de contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Open Source Media Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Chapitre 28 : Ajout d’un contenu PDF dans AIR
Détection des capacités PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Chargement du contenu PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Programmation du contenu PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Limites connues pour du contenu PDF dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Chapitre 29 : Principes de base de l’interaction utilisateur
Capture des entrées utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Gestion de la cible d’action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Découverte des types de saisie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Chapitre 30 : Saisie au clavier
Capture de la saisie au clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Utilisation de la classe IME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Claviers virtuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Chapitre 31 : Entrées de souris
Capture des entrées de souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Exemple d’entrée de souris : WordSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Chapitre 32 : Saisie tactile, multipoint et par mouvement
Principes de base de la saisie tactile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Découverte de la prise en charge des actions tactiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
Gestion des événements tactiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Toucher-glisser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
Gestion des événements de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Résolution des problèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Chapitre 33 : Opération de copier-coller
Principes de base de l’opération de copier-coller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Lecture en provenance et écriture à destination du Presse-papiers du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Opération copier-coller HTML dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Formats de données Clipboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Chapitre 34 : Saisie via un accéléromètre
Vérification de la prise en charge de l’accéléromètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Détection des changements de l’accéléromètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 ix
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 35 : Opération glisser-déposer dans AIR
Principes de base des opérations glisser-déposer dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Prise en charge du mouvement de glissement vers l’extérieur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Prise en charge du mouvement de glissement vers l’intérieur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Opération glisser-déposer dans HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Glissement des données hors d’un élément HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Glissement de données dans un élément HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Exemple : Annulation du comportement de glissement vers l’intérieur HTML par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Gestion des dépôts de fichier dans un sandbox HTML hors application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Dépôt de fichiers promis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Chapitre 36 : Utilisation des menus
Principes de base des menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Création de menus natifs (AIR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
A propos des menus contextuels dans un contenu HTML (AIR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Affichage de menus natifs en incrustation (AIR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Gestion des événements de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Exemple de menu natif : menu de fenêtre et d’application (AIR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
Chapitre 37 : Icônes de la barre des tâches dans AIR
A propos des icônes de la barre des tâches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Icônes du Dock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Icônes de la barre d’état système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Icônes et boutons de la barre des tâches de la fenêtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
Chapitre 38 : Utilisation du système de fichiers
Utilisation de la classe FileReference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
Utilisation de l’interface de programmation du système de fichiers AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Chapitre 39 : Stockage des données locales
Objets partagés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Stockage local chiffré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Chapitre 40 : Utilisation des bases de données SQL locales dans AIR
A propos des bases de données SQL locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Création et modification d’une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Manipulation des données de bases de données SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Utilisation des opérations de base de données synchrones et asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
Utilisation du chiffrement avec les bases de données SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Stratégies d’utilisation des bases de données SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Chapitre 41 : Utilisation de tableaux d’octets
Lecture et écriture d’un objet ByteArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Exemple ByteArray : lecture d’un fichier .zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
Chapitre 42 : Principes de base de la mise en réseau et de la communication
Interfaces réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Changements de connectivité réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
Enregistrements DNS (Domain Name System) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 x
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 43 : Sockets
Sockets TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Sockets UDP (AIR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
Adresses IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Chapitre 44 : Communications HTTP
Chargement de données externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Requêtes de service Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Ouverture d’une URL dans une autre application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Chapitre 45 : Communications avec d’autres occurrences de Flash Player et d’AIR
A propos de la classe LocalConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Envoi de messages entre deux applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Connexion au contenu dans des domaines différents et aux applications AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
Chapitre 46 : Communication avec les processus natifs dans AIR
Présentation des communications avec les processus natifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Lancement et fermeture d’un processus natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870
Communications avec un processus natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Considérations liées à la sécurité qui affectent les communications avec le processus natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Chapitre 47 : Utilisation de l’API externe
Principes de base de l’utilisation de l’API externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
Avantages de l’API externe et conditions requises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877
Utilisation de la classe ExternalInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Exemple d’API externe : communications entre ActionScript et JavaScript dans un navigateur Web . . . . . . . . . . . . . . . . . . . . 882
Chapitre 48 : Validation des signatures XML dans AIR
Bases de la validation des signatures XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
A propos des signatures XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Implémentation de l’interface IURIDereferencer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895
Chapitre 49 : Environnement du système client
Principes de base de l’environnement du système client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Utilisation de la classe System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Utilisation de la classe Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905
Exemple d’utilisation de Capabilities : détection des capacités du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
Chapitre 50 : Appel et fermeture d’une application AIR
Appel d’une application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Capture des arguments de ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
Appel d’une application AIR lors de la connexion d’un utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Appel d’une application AIR à partir du navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
Fermeture d’une application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Chapitre 51 : Utilisation des informations sur le moteur d’exécution d’AIR et les systèmes d’exploitation
Gestion des associations de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 920
Lecture de la version du moteur d’exécution et du correctif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 xi
Sommaire
Dernière mise à jour le 27/4/2013
Détection des capacités d’AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
Suivi de la présence des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
Chapitre 52 : Utilisation des fenêtres natives AIR
Principes de base des fenêtres natives dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
Création de fenêtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931
Gestion des fenêtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Ecoute des événements d’une fenêtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
Affichage des fenêtres en mode plein écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Chapitre 53 : Ecrans dans AIR
Principes de base des écrans dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
Dénombrement des écrans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Chapitre 54 : Impression
Principes de base de l’impression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 958
Impression d’une page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959
Tâches des moteurs d’exécution de Flash et impression système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 960
Définition de la taille, de l’échelle et de l’orientation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Techniques d’impression avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965
Exemple d’impression : impression de plusieurs pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Exemple d’impression : mise à l’échelle, recadrage et ajustement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
Exemple d’impression : options d’impression et de mise en page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971
Chapitre 55 : Geolocation
Détection des changements de géolocalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974
Chapitre 56 : Internationalisation des applications
Principes de base de l’internationalisation des applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
Présentation du package flash.globalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979
Identification des paramètres régionaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Formatage des nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Formatage des valeurs en devise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985
Formatage des dates et heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987
Tri et comparaison des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989
Conversion de la casse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990
Exemple : Internationalisation d’une application de suivi des stocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Chapitre 57 : Localisation d’applications
Choix d’un jeu de paramètres régionaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996
Localisation de contenu Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Localisation du contenu Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Localisation d’applications AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Localisation des dates, heures et devises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Chapitre 58 : A propos de l’environnement HTML
Présentation de l’environnement HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
AIR et WebKit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 xii
Sommaire
Dernière mise à jour le 27/4/2013
Chapitre 59 : Programmation HTML et JavaScript dans AIR
A propos de la classe HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019
Contournement des erreurs JavaScript liées à la sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
Accès aux classes de l’API AIR à partir de JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
A propos des URL dans AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1027
Mise des objets ActionScript à disposition de JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028
Accès au DOM HTML et aux objets JavaScript à partir d’ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1030
Intégration d’un contenu SWF en HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Utilisation des bibliothèques ActionScript au sein d’une page HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034
Conversion des objets Date et RegExp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036
Manipulation d’une feuille de style HTML à partir d’ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036
Programmation croisée du contenu dans des sandbox de sécurité distincts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1038
Chapitre 60 : Programmation du conteneur HTML d’AIR à l’aide de scripts
Affichage des propriétés des objets HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043
Défilement du contenu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Accès à l’historique de HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Paramétrage de l’agent d’utilisateur employé lors du chargement du contenu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Paramétrage du codage des caractères à utiliser pour le contenu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Paramétrage des interfaces utilisateur de type navigateur pour un contenu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
Création de sous-classes de la classe HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1060
Chapitre 61 : Gestion des événements HTML dans AIR
Evénements HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1062
Gestion des événements DOM avec ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063
Réponse aux exceptions JavaScript non interceptées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063
Gestion des événements d’exécution avec JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Chapitre 62 : Affichage de contenu HTML dans une application mobile
Objets StageWebView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068
Contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Evénements de navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Cible d’action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1072
Capture d’image bitmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074
Chapitre 63 : Utilisation de programmes de travail à des fins de simultanéité
Présentation des programmes de travail et de la simultanéité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076
Création et gestion de programmes de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1077
Communication entre programmes de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1080
Chapitre 64 : Sécurité
Présentation de la sécurité sur la plate-forme Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1085
Sandbox de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087
Contrôles des autorisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1091
Restriction des API de réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1100
Sécurité du mode plein écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Sécurité du mode interactif plein écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 xiii
Sommaire
Dernière mise à jour le 27/4/2013
Chargement de contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104
Programmation croisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1107
Accès aux médias chargés comme s’il s’agissait de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1111
Chargement des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Chargement de contenu incorporé à partir de fichiers SWF importés dans un domaine de sécurité . . . . . . . . . . . . . . . . . . . . 1117
Utilisation de contenus existants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1117
Définition des autorisations LocalConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Contrôle de l’accès URL externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Objets partagés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Accès à la caméra, au microphone, au Presse-papiers, à la souris et au clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Sécurité AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Chapitre 65 : Utilisation des exemples de code ActionScript
Types d’exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1145
Exécution d’exemples ActionScript 3.0 dans Flash Professional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1147
Exécution d’exemples ActionScript 3.0 dans Flash Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Exécution d’exemples ActionScript 3.0 sur un périphérique mobile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
Chapitre 66 : Prise en charge de SQL dans les bases de données locales
Syntaxe SQL prise en charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1155
Prise en charge des types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Chapitre 67 : ID, arguments et messages d’erreur SQL détaillés
Chapitre 68 : AGAL (Adobe Graphics Assembly Language)
Pseudo-code binaire AGAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
1
Dernière mise à jour le 27/4/2013
Chapitre 1 : Utilisation des dates et des
heures
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Si la ponctualité ne fait pas tout, elle n’en est pas moins un facteur clé des applications logicielles. ActionScript 3.0
propose différentes méthodes de gestion des dates calendaires, des heures et des intervalles temporels. Deux classes
principales assurent l’essentiel de la fonctionnalité temporelle : la classe Date et la nouvelle classe Timer du package
flash.utils.
Les dates et les heures constituent un type d’informations courant utilisé dans les programmes ActionScript. Par
exemple, vous pouvez, entre autres, connaître la date du jour ou calculer combien de temps un utilisateur passe sur un
écran particulier. Dans ActionScript, vous pouvez utiliser la classe Date pour représenter un moment unique dans le
temps, y compris des informations de date et d’heure. Une occurrence de Date contient des valeurs pour les unités de
date et d’heure individuelles (année, mois, date, jour de la semaine, heure, minutes, secondes, millisecondes et fuseau
horaire, par exemple). Pour des utilisations plus avancées, ActionScript comprend également la classe Timer que vous
pouvez utiliser pour effectuer des actions après un certain délai ou à des intervalles répétés.
Voir aussi
Date
flash.utils.Timer
Gestion des dates calendaires et des heures
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans ActionScript 3.0, toutes les fonctions de gestion des dates calendaires et des heures se concentrent autour de la
classe de niveau supérieur Date. Cette classe contient des méthodes et des propriétés qui vous permettent de manier
les dates et les heures soit selon le modèle universel coordonné (UTC, Universal Time Coordinated), soit selon le
fuseau horaire considéré. L’UTC est une définition normalisée du temps qui correspond essentiellement à l’heure du
méridien de Greenwich (GMT, Greenwich Mean Time).
Création d’objets Date
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Date compte l’une des méthodes constructeur les plus polyvalentes de toutes les classes de base. Vous pouvez
l’invoquer de quatre manières différentes.
Primo, si aucun paramètre n’est fourni, le constructeur Date() renvoie un objet Date contenant la date et l’heure locale
actuelle de votre fuseau horaire. Exemple :
var now:Date = new Date();
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 2
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
Secundo, si un paramètre numérique unique est fourni, le constructeur Date() le considère comme le nombre de
millisecondes écoulées depuis le 1er janvier 1970 et renvoie l’objet Date correspondant. Notez que la valeur en
millisecondes que vous transmettez est considérée comme le nombre de millisecondes depuis le 1er janvier 1970 en
temps UTC. Toutefois, l’objet Date affiche des valeurs dans votre fuseau horaire local, sauf si vous utilisez des
méthodes UTC uniquement pour les extraire et les afficher. Si vous créez un nouvel objet Date à l’aide du paramètre
en millisecondes, veillez à tenir compte du décalage horaire entre votre fuseau local et le temps UTC. Les instructions
ci-après créent un objet Date défini à minuit le 1er janvier 1970 en temps UTC :
var millisecondsPerDay:int = 1000 * 60 * 60 * 24;
// gets a Date one day after the start date of 1/1/1970
var startTime:Date = new Date(millisecondsPerDay);
Tertio, vous pouvez transmettre plusieurs paramètres numériques au constructeur Date(). Celui-ci les traite
respectivement comme la date, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, et renvoie un
objet Date correspondant. Les paramètres indiqués sont considérés comme correspondant à l’heure locale plutôt qu’au
temps UTC. Les instructions suivantes établissent un objet Date défini à minuit le 1er janvier 2000, dans le fuseau
horaire local :
var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);
Quarto, vous pouvez transmettre un paramètre numérique unique au constructeur Date(). Celui-ci essaiera
d’analyser cette chaîne en composants de date et heure, et de renvoyer un objet Date correspondant. Si vous choisissez
cette approche, il est recommandé d’inclure le constructeur Date() dans un bloc try..catch afin d’intercepter toute
erreur d’analyse. Le constructeur Date() gère plusieurs formats de chaîne (dont la liste figure dans le manuel Guide
de référence ActionScript 3.0 pour la plate-forme Adobe Flash). L’instruction suivante initialise un nouvel objet Date
à l’aide d’une valeur chaîne :
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");
Si le constructeur Date() ne peut analyser le paramètre chaîne, il ne déclenche pas d’exception. Cependant, l’objet
Date résultant contiendra une valeur date incorrecte.
Obtention des valeurs d’unités temporelles
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez extraire les valeurs de plusieurs unités temporelles au sein de l’objet Date grâce à des propriétés ou des
méthodes de la classe Date. Chacune des propriétés suivantes fournit la valeur d’une unité temporelle de l’objet Date :
• La propriété fullYear
• La propriété month au format numérique : de 0 pour janvier à 11 pour décembre
• La propriété date, qui correspond au numéro calendaire du jour du mois, de 1 à 31
• La propriété day, qui correspond au jour de la semaine au format numérique, 0 représentant dimanche
• La propriété hours, de 0 à 23
• La propriété minutes
• La propriété seconds
• La propriété milliseconds
La classe Date offre en fait plusieurs manières d’obtenir ces valeurs. Vous pouvez par exemple obtenir la valeur
month de l’objet Date de quatre manières :
• La propriété month
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 3
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
• La méthode getMonth()
• La propriété monthUTC
• La méthode getMonthUTC()
Ces quatre solutions sont d’une efficacité équivalente, vous pouvez donc adopter celle qui convient le mieux à votre
application.
Les propriétés répertoriées ci-dessus représentent toutes des composants de la valeur date totale. Par exemple, la
propriété milliseconds ne sera jamais supérieure à 999, puisque si elle atteint 1000, la valeur seconds augmente de
1, la propriété milliseconds se remet à zéro.
Si vous voulez obtenir la valeur de l’objet Date en millisecondes depuis le 1er janvier 1970 (UTC), vous pouvez
utiliser la méthode getTime(). La méthode setTime(), quant à elle, vous permet de modifier la valeur d’un objet
Date existant en millisecondes depuis le 1er janvier 1970 (UTC).
Opérations arithmétiques sur la date et l’heure
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Date permet d’additionner et de soustraire des dates et heures. Les valeurs Date sont conservées en interne
sous forme de millisecondes. Il est donc nécessaire de convertir les autres valeurs en millisecondes avant de les ajouter
ou de les soustraire aux objets Date.
Si votre application doit effectuer de nombreuses opérations arithmétiques sur les dates et heures, il peut s’avérer utile
de créer des constantes qui conservent les valeurs d’unités temporelles courantes en millisecondes, comme illustré ciaprès
:
public static const millisecondsPerMinute:int = 1000 * 60;
public static const millisecondsPerHour:int = 1000 * 60 * 60;
public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;
Il devient alors simple d’effectuer des opérations arithmétiques à l’aide des unités temporelles standard. Le code ciaprès
décale la valeur date d’une heure par rapport à l’heure actuelle à l’aide des méthodes getTime() et setTime() :
var oneHourFromNow:Date = new Date();
oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);
Une autre manière de définir une valeur date consiste à créer un objet Date à l’aide d’un seul paramètre en
millisecondes. Par exemple, le code suivant ajoute 30 jours à une date pour en calculer une autre :
// sets the invoice date to today's date
var invoiceDate:Date = new Date();
// adds 30 days to get the due date
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));
La constante millisecondsPerDay est ensuite multipliée par 30 pour représenter la période de 30 jours et le résultat
est ajouté à la valeur invoiceDate afin de définir la valeur dueDate.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 4
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
Conversion entre plusieurs fuseaux horaires
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les opérations arithmétiques sur les dates et heures sont particulièrement pratiques lorsque vous devez convertir des
dates d’un fuseau horaire à un autre. Tel est le rôle de la méthode getTimezoneOffset(), qui renvoie la valeur (en
minutes) de décalage entre le fuseau horaire de l’objet Date et le temps UTC. La valeur renvoyée s’exprime en minutes
parce que tous les fuseaux horaires ne correspondent pas à une heure ; certains sont décalés d’une demi-heure par
rapport aux fuseaux voisins.
L’exemple suivant utilise le décalage de fuseau horaire pour convertir une date à partir de l’heure locale en temps UTC.
La conversion s’effectue tout d’abord par calcul de la valeur du fuseau horaire en millisecondes, puis par ajustement
de la valeur Date selon ce montant :
// creates a Date in local time
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");
// converts the Date to UTC by adding or subtracting the time zone offset
var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000;
nextDay.setTime(nextDay.getTime() + offsetMilliseconds);
Contrôle des intervalles temporels
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous développez des applications à l’aide d’Adobe Flash CS4 Professional, vous avez accès au scénario, qui
fournit une progression constante, image par image, au sein de votre application. Toutefois, dans un projet purement
ActionScript, vous devez compter sur d’autres mécanismes temporels.
Boucles ou minuteurs ?
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans certains langages de programmation, vous devez mettre au point des motifs temporels à l’aide d’instructions en
boucle telles que for ou do..while.
Les instructions en boucle s’exécutent en général aussi vite que la machine locale le permet, ce qui signifie que
l’application sera plus rapide sur certaines machines que sur d’autres. Si votre application doit bénéficier d’un
intervalle temporel cohérent, vous devez l’associer à un calendrier ou une horloge réels. Bien des applications, telles
que les jeux, les animations, les contrôleurs en temps réel, nécessitent des mécanismes de décompte temporel qui
soient cohérents d’une machine à l’autre.
La classe Timer d’ActionScript 3.0 offre une solution performante dans ce domaine. Grâce au modèle d’événements
ActionScript 3.0, la classe Timer distribue des événements Timer dès qu’un intervalle spécifié est atteint.
La classe Timer
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Pour la gestion des fonctions temporelles dans ActionScript 3.0, il est recommandé d’utiliser la classe Timer
(flash.utils.Timer), qui permet de distribuer des événements dès qu’un intervalle est atteint.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 5
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
Pour lancer un minuteur, vous devez d’abord créer une occurrence de la classe Timer et lui indiquer à quelle fréquence
elle doit générer un événement Timer et combien de fois elle doit le faire avant de s’arrêter.
Par exemple, le code suivant crée une occurrence de Timer qui distribue un événement toutes les secondes pendant 60
secondes :
var oneMinuteTimer:Timer = new Timer(1000, 60);
L’objet Timer distribue un objet TimerEvent chaque fois que l’intervalle donné est atteint. Le type d’événement de
l’objet TimerEvent est timer (défini par la constante TimerEvent.TIMER). Un objet TimerEvent contient les mêmes
propriétés que l’objet standard Event.
Si l’occurrence de Timer prévoit un nombre fixe d’intervalles, elle distribue également un événement timerComplete
(défini par la constante TimerEvent.TIMER_COMPLETE) lorsqu’elle atteint l’intervalle final.
Voici un court exemple d’application illustrant la classe Timer en action :
package
{
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class ShortTimer extends Sprite
{
public function ShortTimer()
{
// creates a new five-second Timer
var minuteTimer:Timer = new Timer(1000, 5);
// designates listeners for the interval and completion events
minuteTimer.addEventListener(TimerEvent.TIMER, onTick);
minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
// starts the timer ticking
minuteTimer.start();
}
public function onTick(event:TimerEvent):void
{
// displays the tick count so far
// The target of this event is the Timer instance itself.
trace("tick " + event.target.currentCount);
}
public function onTimerComplete(event:TimerEvent):void
{
trace("Time's Up!");
}
}
}
Lorsque la classe ShortTimer est créée, elle génère une occurrence de Timer qui marque chaque seconde pendant cinq
secondes. Elle ajoute alors deux écouteurs au minuteur : un qui écoute chaque décompte et un qui écoute l’événement
timerComplete.
Elle lance ensuite le décompte du minuteur et à partir de là, la méthode onTick() s’exécute toutes les secondes.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 6
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
La méthode onTick() affiche simplement le nombre actuel de tics. Après cinq secondes, la méthode
onTimerComplete() s’exécute et vous avertit que le temps est écoulé.
Si vous exécutez cet exemple, vous devriez voir les lignes suivantes s’afficher dans votre console ou fenêtre de suivi à
raison d’une ligne par seconde :
tick 1
tick 2
tick 3
tick 4
tick 5
Time's Up!
Fonctions temporelles du package flash.utils
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript 3.0 contient un certain nombre de fonctions temporelles similaires à celles qui étaient disponibles dans
ActionScript 2.0. Ces fonctions sont fournies au niveau du package dans le package flash.utils et elles fonctionnent de
la même manière que dans ActionScript 2.0.
Ces fonctions demeurent dans ActionScript 3.0 afin d’assurer la compatibilité avec les versions antérieures. Adobe ne
recommande pas leur utilisation dans les nouvelles applications ActionScript 3.0. Il est en général plus simple et plus
efficace d’utiliser la classe Timer.
Exemple de date et heure : horloge analogique simple
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Un exemple d’horloge analogique simple illustre ces deux concepts de date et heure :
• Obtention de la date et de l’heure actuelle et extraction des valeurs heures, minutes et secondes
• Utilisation d’une horloge pour fixer le rythme d’une application
Pour obtenir les fichiers d’application de cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers d’application SimpleClock se trouvent
dans le dossier Samples/SimpleClock. L’application se compose des fichiers suivants :
Fonction Description
clearInterval(id:uint):void Annule un appel de setInterval() spécifié.
clearTimeout(id:uint):void Annule un appel de setTimeout() spécifié.
getTimer():int Renvoie le nombre de millisecondes qui se sont écoulées depuis l’initialisation
d’Adobe® Flash® Player ou d’Adobe® AIR™.
setInterval(closure:Function,
delay:Number, ... arguments):uint
Exécute une fonction à fréquence définie (intervalle exprimé en millisecondes).
setTimeout(closure:Function,
delay:Number, ... arguments):uint
Exécute une fonction spécifiée après un délai spécifié (en millisecondes).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 7
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
Définition de la classe SimpleClock
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Si l’exemple d’horloge est simple, il est toujours judicieux de bien organiser les applications de manière à faciliter leur
extension future. Dans ce but, l’application SimpleClock utilise la classe SimpleClock pour gérer les tâches de
démarrage et de mesure temporelle. Elle se sert ensuite d’une autre classe, AnalogClockFace, pour l’affichage réel de
l’heure.
Voici le code qui définit et initialise la classe SimpleClock (vous remarquerez que dans la version Flash, SimpleClock
étend la classe Sprite à la place) :
public class SimpleClock extends UIComponent
{
/**
* The time display component.
*/
private var face:AnalogClockFace;
/**
* The Timer that acts like a heartbeat for the application.
*/
private var ticker:Timer;
Cette classe possède deux propriétés importantes :
• La propriété face, qui correspond à une occurrence de la classe AnalogClockFace
• La propriété ticker, qui est une occurrence de la classe Timer
La classe SimpleClock utilise un constructeur par défaut. La méthode initClock() se charge de la véritable
configuration, en créant le cadran et en lançant le décompte de l’occurrence de Timer.
Création du cadran
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les lignes suivantes du code SimpleClock créent le cadran utilisé pour afficher l’heure :
Fichier Description
SimpleClockApp.mxml
ou
SimpleClockApp.fla
Fichier d’application principal dans Flash (FLA) ou Flex
(MXML).
com/example/programmingas3/simpleclock/SimpleClock.as Fichier d’application principal.
com/example/programmingas3/simpleclock/AnalogClockFace.as Dessine un cadran d’horloge rond et les aiguilles des heures,
des minutes et des secondes en fonction de l’heure.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 8
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
/**
* Sets up a SimpleClock instance.
*/
public function initClock(faceSize:Number = 200)
{
// creates the clock face and adds it to the display list
face = new AnalogClockFace(Math.max(20, faceSize));
face.init();
addChild(face);
// draws the initial clock display
face.draw();
La taille de l’horloge peut être transmise à la méthode initClock(). Si aucune valeur faceSize n’est transmise, la
taille par défaut de 200 pixels est utilisée.
L’application initialise ensuite l’horloge et l’ajoute à la liste d’affichage à l’aide de la méthode addChild() héritée de la
classe DisplayObjectContainer. Elle appelle enfin la méthode AnalogClockFace.draw() pour afficher une fois le
cadran, qui indique l’heure actuelle.
Lancement du minuteur
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Une fois le cadran créé, la méthode initClock() définit le minuteur :
// creates a Timer that fires an event once per second
ticker = new Timer(1000);
// designates the onTick() method to handle Timer events
ticker.addEventListener(TimerEvent.TIMER, onTick);
// starts the clock ticking
ticker.start();
Cette méthode commence par instancier une occurrence de Timer qui va distribuer un événement par seconde (toutes
les 1 000 millisecondes). Comme le constructeur Timer() ne reçoit pas de second paramètre repeatCount, l’horloge
se reproduit indéfiniment.
La méthode SimpleClock.onTick() s’exécute une fois par seconde après réception de l’événement timer :
public function onTick(event:TimerEvent):void
{
// updates the clock display
face.draw();
}
La méthode AnalogClockFace.draw() dessine simplement le cadran de l’horloge et des aiguilles.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 9
Utilisation des dates et des heures
Dernière mise à jour le 27/4/2013
Affichage de l’heure actuelle
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La plupart du code de la classe AnalogClockFace implique la définition des éléments d’affichage du cadran. Lors de
son initialisation, AnalogClockFace dessine un contour circulaire, place des libellés numériques pour chaque heure,
puis crée trois objets Shape, un pour l’aiguille des heures, un pour celle des minutes et un pour l’aiguille des secondes
de l’horloge.
Lorsque l’application SimpleClock s’exécute, elle appelle la méthode AnalogClockFace.draw() toutes les secondes,
comme suit :
/**
* Called by the parent container when the display is being drawn.
*/
public override function draw():void
{
// stores the current date and time in an instance variable
currentTime = new Date();
showTime(currentTime);
}
Cette méthode enregistre l’heure actuelle dans une variable, pour que l’heure ne puisse changer pendant le dessin des
aiguilles de l’horloge. Elle appelle ensuite la méthode showTime() pour afficher les aiguilles, comme illustré ci-après :
/**
* Displays the given Date/Time in that good old analog clock style.
*/
public function showTime(time:Date):void
{
// gets the time values
var seconds:uint = time.getSeconds();
var minutes:uint = time.getMinutes();
var hours:uint = time.getHours();
// multiplies by 6 to get degrees
this.secondHand.rotation = 180 + (seconds * 6);
this.minuteHand.rotation = 180 + (minutes * 6);
// Multiply by 30 to get basic degrees, then
// add up to 29.5 degrees (59 * 0.5)
// to account for the minutes.
this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5);
}
Tout d’abord, cette méthode extrait les valeurs des heures, des minutes et des secondes pour l’heure actuelle. Elle utilise
ensuite ces valeurs pour calculer l’angle de chaque aiguille. Comme l’aiguille des secondes effectue une rotation
complète en 60 secondes, elle tourne de 6 degrés par seconde (360/60). L’aiguille des minutes pivote selon le même
angle chaque minute.
L’aiguille des heures se met à jour toutes les minutes également et doit donc progresser à chaque minute. Elle tourne
de 30 degrés toutes les heures (360/12), mais pivote également d’un demi-degré toutes les minutes (30 degrés divisés
par 60 minutes).
10
Dernière mise à jour le 27/4/2013
Chapitre 2 : Utilisation des chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe String contient des méthodes qui vous permettent de manipuler des chaînes de texte. Les chaînes s’utilisent
avec de nombreux objets. Les méthodes décrites ci-après permettent de manipuler les chaînes utilisées dans des objets
tels que TextField, StaticText, XML, ContextMenu et FileReference.
Les chaînes sont des séries de caractères. ActionScript 3.0 prend en charge les caractères ASCII et Unicode.
Voir aussi
String
RegExp
parseFloat()
parseInt()
Principes de base des chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Pour les programmeurs, une « chaîne » est un texte, une suite de lettres, chiffres ou autres caractères qui se suivent et
forment une unité représentée par une valeur. Par exemple, la ligne de code suivante crée une variable ayant le type de
données String (chaîne) et affecte une valeur de chaîne littérale à cette variable :
var albumName:String = "Three for the money";
Comme le montre cet exemple, ActionScript permet de délimiter une valeur chaîne en enfermant du texte entre des
guillemets droits doubles ou simples. Voici d’autres exemples de chaînes :
"Hello"
"555-7649"
"http://www.adobe.com/"
Lorsque vous manipulez un fragment de texte en ActionScript, vous utilisez une valeur chaîne. La classe String
d’ActionScript est le type de données qui permet de travailler avec du texte. Des occurrences de chaînes sont
fréquemment utilisées pour des propriétés, des paramètres de méthodes, etc., dans de nombreuses autres classes en
ActionScript.
Concepts importants et terminologie
La liste de référence suivante contient des termes importants relatifs aux chaînes :
ASCII Système de codage permettant de représenter du texte sous forme de caractères et symboles dans les
programmes informatiques. Le système ASCII gère les 26 lettres de l’alphabet latin, plus un nombre limité de
caractères supplémentaires.
Caractère Unité de base d’un texte (lettre ou symbole).
Concaténation Ajout bout à bout de plusieurs valeurs de chaîne pour en créer une nouvelle.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 11
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Chaîne vide Chaîne qui ne contient rien: ni texte, ni espace, ni autre caractère, représentée par "". Une chaîne vide
n’est pas la même chose qu’une variable ayant une valeur nulle (null) : celle-ci est une variable à laquelle aucune
occurrence de l’objet String n’est affectée, alors qu’une chaîne vide est une occurrence dont la valeur ne contient aucun
caractère.
String Valeur textuelle (séquence de caractères).
Littéral (ou « littéral de chaîne ») Valeur chaîne écrite explicitement en code, sous forme de valeur texte encadrée par
des guillemets droits simples ou doubles.
Sous-chaîne Définit une chaîne qui fait partie d’une autre chaîne.
Unicode Système standardisé de codage permettant de représenter du texte sous forme de caractères et symboles dans
les programmes informatiques. Le système Unicode permet d’utiliser la totalité des caractères de toutes les langues
écrites existantes.
Création de chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe String permet de représenter des données de chaîne (texte) en ActionScript 3.0. Les chaînes ActionScript
prennent en charge les caractères ASCII et Unicode. La meilleure façon de créer une chaîne est d’utiliser un littéral de
chaîne. Pour déclarer un littéral de chaîne, utilisez les guillemets droits doubles (") ou les guillemets droits simples (').
Par exemple, les deux chaînes suivantes sont équivalentes :
var str1:String = "hello";
var str2:String = 'hello';
Vous pouvez également déclarer une chaîne à l’aide de l’opérateur new, comme suit :
var str1:String = new String("hello");
var str2:String = new String(str1);
var str3:String = new String(); // str3 == ""
Les deux chaînes suivantes sont équivalentes :
var str1:String = "hello";
var str2:String = new String("hello");
Pour utiliser des guillemets droits simples (') dans un littéral de chaîne délimité par des guillemets droits simples ('),
utilisez le caractère d’échappement (\). De même, pour utiliser des guillemets droits doubles ('') dans un littéral de
chaîne délimité par des guillemets droits doubles (''), utilisez le caractère d’échappement (\). Les deux chaînes
suivantes sont équivalentes :
var str1:String = "That's \"A-OK\"";
var str2:String = 'That\'s "A-OK"';
Vous pouvez utiliser des guillemets simples ou des guillemets doubles en fonction de ceux qui existent dans un littéral
de chaîne, comme dans l’exemple suivant :
var str1:String = "ActionScript 3.0";
var str2:String = 'banana';
Rappelons qu’ActionScript fait la distinction entre les guillemets droits simples (') et les guillemets simples gauches
ou droits (' ou ' ). Il en est de même pour les guillemets doubles. Utilisez des guillemets droits pour délimiter des
littéraux de chaîne. Lorsque vous collez du texte dans ActionScript depuis une autre source, utilisez les caractères
corrects.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 12
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Comme indiqué dans le tableau suivant, vous pouvez utiliser le caractère d’échappement (\) pour définir d’autres
caractères dans des littéraux de chaîne :
Propriété length
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Chaque chaîne possède une propriété length correspondant au nombre de caractères qu’elle contient:
var str:String = "Adobe";
trace(str.length); // output: 5
Une chaîne vide et une chaîne null ont toutes deux une longueur de 0, comme l’indique l’exemple suivant :
var str1:String = new String();
trace(str1.length); // output: 0
str2:String = '';
trace(str2.length); // output: 0
Utilisation de caractères dans des chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Chaque caractère d’une chaîne possède une position d’index dans la chaîne (un entier). La position d’index du premier
caractère est 0. Par exemple, dans la chaîne suivante, le caractère y occupe la position 0 et le caractère w occupe la
position 5 :
"yellow"
Vous pouvez examiner des caractères individuels à différentes positions d’une chaîne à l’aide des méthodes charAt()
et charCodeAt(), comme dans l’exemple suivant :
Séquence
d’échappement
Caractère
\b Retour arrière
\f Changement de page
\n Nouvelle ligne
\r Retour chariot
\t Tabulation
\unnnn Caractère Unicode dont le code de caractère est spécifié par le nombre hexadécimal nnnn ; par
exemple, \u263a est le caractère smiley.
\\xnn Caractère ASCII dont le code est spécifié par le nombre hexadécimal nn.
\' Guillemet droit simple
\" Guillemet droit double
\\ Barre oblique inverse
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 13
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var str:String = "hello world!";
for (var i:int = 0; i < str.length; i++)
{
trace(str.charAt(i), "-", str.charCodeAt(i));
}
Lorsque vous exécutez ce code, vous obtenez le résultat suivant :
h - 104
e - 101
l - 108
l - 108
o - 111
- 32
w - 119
o - 111
r - 114
l - 108
d - 100
! - 33
Vous pouvez également utiliser des codes de caractère pour définir une chaîne à l’aide de la méthode
fromCharCode(), comme l’indique l’exemple suivant :
var myStr:String = String.fromCharCode(104,101,108,108,111,32,119,111,114,108,100,33);
// Sets myStr to "hello world!"
Comparaison de chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser les opérateurs suivants pour comparer des chaînes : <, <=, !=, ==, => et >. Vous pouvez utiliser ces
opérateurs avec des instructions conditionnelles (if et while, par exemple) comme l’indique l’exemple suivant :
var str1:String = "Apple";
var str2:String = "apple";
if (str1 < str2)
{
trace("A < a, B < b, C < c, ...");
}
Lorsque vous utilisez ces opérateurs avec des chaînes, ActionScript considère la valeur du code de chaque caractère
dans la chaîne, en comparant les caractères de gauche à droite, comme indiqué ci-dessous :
trace("A" < "B"); // true
trace("A" < "a"); // true
trace("Ab" < "az"); // true
trace("abc" < "abza"); // true
Utilisez les opérateurs == et != pour comparer des chaînes entre elles et pour comparer des chaînes avec d’autres types
d’objets, comme l’indique l’exemple suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 14
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var str1:String = "1";
var str1b:String = "1";
var str2:String = "2";
trace(str1 == str1b); // true
trace(str1 == str2); // false
var total:uint = 1;
trace(str1 == total); // true
Récupération des représentations de chaîne d’autres
objets
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez obtenir une représentation de chaîne de n’importe quel type d’objet. Tous les objets disposent en effet
d’une méthode toString() :
var n:Number = 99.47;
var str:String = n.toString();
// str == "99.47"
Lorsque vous utilisez l’opérateur de concaténation + avec une combinaison d’objet String et d’objets qui ne sont pas
des chaînes, vous n’avez pas besoin d’utiliser la méthode toString(). Pour plus d’informations sur la concaténation,
voir la section suivante.
La fonction globale String() renvoie la même valeur pour un objet donné que la valeur renvoyée par l’objet appelant
la méthode toString().
Concaténation de chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La concaténation de chaînes consiste à prendre deux chaînes et à les combiner en une seule chaîne de façon
séquentielle. Par exemple, vous pouvez utiliser l’opérateur + pour concaténer deux chaînes :
var str1:String = "green";
var str2:String = "ish";
var str3:String = str1 + str2; // str3 == "greenish"
Vous pouvez également utiliser l’opérateur += pour obtenir le même résultat, comme dans l’exemple suivant :
var str:String = "green";
str += "ish"; // str == "greenish"
En outre, la classe String comprend la méthode concat(), utilisable comme suit :
var str1:String = "Bonjour";
var str2:String = "from";
var str3:String = "Paris";
var str4:String = str1.concat(" ", str2, " ", str3);
// str4 == "Bonjour from Paris"
Si vous utilisez l’opérateur + (ou l’opérateur +=) avec un objet String et un objet qui n’est pas une chaîne, ActionScript
convertit automatiquement ce dernier en un objet String afin d’évaluer l’expression, comme indiqué dans l’exemple :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 15
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var str:String = "Area = ";
var area:Number = Math.PI * Math.pow(3, 2);
str = str + area; // str == "Area = 28.274333882308138"
Néanmoins, vous pouvez utiliser des parenthèses pour le regroupement afin de fournir un contexte à l’opérateur +,
comme indiqué dans l’exemple suivant :
trace("Total: $" + 4.55 + 1.45); // output: Total: $4.551.45
trace("Total: $" + (4.55 + 1.45)); // output: Total: $6
Recherche de sous-chaînes et de modèles dans des
chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les sous-chaînes sont des caractères consécutifs à l’intérieur d’une chaîne. La chaîne "abc", par exemple, contient les
sous-chaînes suivantes : "", "a", "ab", "abc", "b", "bc", "c". Vous pouvez utiliser des méthodes ActionScript pour
localiser les sous-chaînes d’une chaîne.
Les modèles sont définis en ActionScript par des chaînes ou par des expressions régulières. Par exemple, l’expression
régulière suivante définit un modèle spécifique, les lettres A, B, et C suivies d’un chiffre (les barres de fraction sont des
délimiteurs d’expression régulière) :
/ABC\d/
ActionScript comporte des méthodes servant à rechercher des modèles dans des chaînes et à remplacer les
correspondances trouvées par des sous-chaînes de substitution. Ces méthodes sont décrites dans les sections suivantes.
Les expressions régulières peuvent définir des modèles compliqués. Pour plus d’informations, voir « Utilisation
d’expressions régulières » à la page 78.
Recherche d’une sous-chaîne par la position d’un caractère
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les méthodes substr() et substring() sont similaires. Elles renvoient toutes les deux une sous-chaîne d’une chaîne.
Elles prennent deux paramètres. Dans les deux méthodes, le premier paramètre est la position du caractère initial dans
la chaîne concernée. Toutefois, dans la méthode substr(), le deuxième paramètre est la longueur de la sous-chaîne à
renvoyer, alors que dans la méthode substring(), le deuxième paramètre est la position du caractère final de la souschaîne
(qui ne figure pas dans la chaîne renvoyée). Cet exemple illustre la différence entre ces deux méthodes :
var str:String = "Hello from Paris, Texas!!!";
trace(str.substr(11,15)); // output: Paris, Texas!!!
trace(str.substring(11,15)); // output: Pari
La méthode slice() fonctionne de la même façon que la méthode substring(). Lorsque deux nombres entiers non
négatifs sont passés en paramètres, son fonctionnement est identique. Néanmoins, la méthode slice() peut recevoir
des entiers négatifs comme paramètres. Dans ce cas, la position des caractères est comptée à partir de la fin de la chaîne,
comme dans l’exemple suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 16
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var str:String = "Hello from Paris, Texas!!!";
trace(str.slice(11,15)); // output: Pari
trace(str.slice(-3,-1)); // output: !!
trace(str.slice(-3,26)); // output: !!!
trace(str.slice(-3,str.length)); // output: !!!
trace(str.slice(-8,-3)); // output: Texas
Vous pouvez associer des entiers positifs et négatifs comme paramètres de la méthode slice().
Recherche de la position des caractères d’une sous-chaîne correspondante
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser les méthodes indexOf() et lastIndexOf() pour localiser des sous-chaînes correspondantes au
sein d’une chaîne, comme dans l’exemple suivant :
var str:String = "The moon, the stars, the sea, the land";
trace(str.indexOf("the")); // output: 10
La méthode indexOf() est sensible à la casse.
Vous pouvez spécifier un deuxième paramètre pour indiquer la position de l’index dans la chaîne à partir de laquelle
commencer la recherche, comme suit :
var str:String = "The moon, the stars, the sea, the land"
trace(str.indexOf("the", 11)); // output: 21
La méthode lastIndexOf() trouve la dernière occurrence d’une sous-chaîne dans la chaîne :
var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the")); // output: 30
Si vous incluez un deuxième paramètre avec la méthode lastIndexOf(), la recherche est effectuée à l’envers à partir
de cette position d’index dans la chaîne (de droite à gauche) :
var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the", 29)); // output: 21
Création d’un tableau de sous-chaînes segmenté par un délimiteur
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser la méthode split() pour créer un tableau de sous-chaînes divisé en fonction d’un caractère
délimiteur. Par exemple, vous pouvez segmenter une chaîne séparée par des virgules ou des tabulations en plusieurs
chaînes.
L’exemple suivant indique comment diviser un tableau en sous-chaînes avec le caractère esperluette (&) comme
délimiteur :
var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]
Le deuxième paramètre de la méthode split() (qui est facultatif) définit la taille maximale du tableau renvoyé.
Vous pouvez également utiliser une expression régulière comme caractère délimiteur :
var str:String = "Give me\t5."
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 17
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Pour plus d’informations, voir « Utilisation d’expressions régulières » à la page 78 et le manuel Guide de référence
ActionScript 3.0 pour la plate-forme Adobe Flash.
Recherche de modèles dans des chaînes et remplacement de sous-chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe String comprend les méthodes suivantes pour utiliser des modèles dans des chaînes :
• Utilisez les méthodes match() et search() pour localiser des sous-chaînes qui correspondent à un modèle.
• Utilisez la méthode replace() pour rechercher des sous-chaînes qui correspondent à un modèle et les remplacer
par une sous-chaîne spécifiée.
Ces méthodes sont décrites dans les sections suivantes.
Vous pouvez utiliser des chaînes ou des expressions régulières pour définir des modèles utilisés dans ces méthodes.
Pour plus d’informations sur les expressions régulières, voir « Utilisation d’expressions régulières » à la page 78.
Recherche de sous-chaînes correspondantes
La méthode search() renvoie la position de l’index de la première sous-chaîne qui correspond à un modèle donné,
comme illustré dans cet exemple :
var str:String = "The more the merrier.";
// (This search is case-sensitive.)
trace(str.search("the")); // output: 9
Vous pouvez également utiliser des expressions régulières pour définir le modèle pour lequel établir une
correspondance, comme illustré dans cet exemple :
var pattern:RegExp = /the/i;
var str:String = "The more the merrier.";
trace(str.search(pattern)); // 0
Le résultat de la méthode trace() est 0, car le premier caractère dans la chaîne est la position de l’index 0. L’indicateur
i est défini dans l’expression régulière. Par conséquent, la recherche n’est pas sensible à la casse.
La méthode search() trouve une seule correspondance et renvoie sa position d’index de début, même si l’indicateur
g (global) est défini dans l’expression régulière.
L’exemple suivant présente une expression régulière plus compliquée qui correspond à une chaîne dans des guillemets
doubles :
var pattern:RegExp = /"[^"]*"/;
var str:String = "The \"more\" the merrier.";
trace(str.search(pattern)); // output: 4
str = "The \"more the merrier.";
trace(str.search(pattern)); // output: -1
// (Indicates no match, since there is no closing double quotation mark.)
La méthode match() fonctionne de façon similaire. Elle recherche une sous-chaîne correspondante. Néanmoins,
lorsque vous utilisez l’indicateur global dans un modèle d’expression régulière (comme dans l’exemple suivant),
match() renvoie un tableau de sous-chaînes correspondantes :
var str:String = "bob@example.com, omar@example.org";
var pattern:RegExp = /\w*@\w*\.[org|com]+/g;
var results:Array = str.match(pattern);
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 18
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Le tableau results est défini comme suit :
["bob@example.com","omar@example.org"]
Pour plus d’informations sur les expressions régulières, voir « Utilisation d’expressions régulières » à la page 78.
Remplacement de sous-chaînes mises en correspondance
Vous pouvez utiliser la méthode replace() pour rechercher un modèle spécifié dans une chaîne et remplacer les
correspondances par la chaîne de remplacement spécifiée, comme illustré dans l’exemple suivant :
var str:String = "She sells seashells by the seashore.";
var pattern:RegExp = /sh/gi;
trace(str.replace(pattern, "sch")); //sche sells seaschells by the seaschore.
Dans cet exemple, les chaînes mises en correspondance ne sont pas sensibles à la casse car l’indicateur i (ignoreCase)
est défini dans l’expression régulière, et plusieurs correspondances sont remplacées car l’indicateur g (global) est
défini. Pour plus d’informations, voir « Utilisation d’expressions régulières » à la page 78.
Vous pouvez inclure les codes de remplacement $ suivants dans la chaîne de remplacement. Le texte de remplacement
indiqué dans le tableau suivant est inséré à la place du code de remplacement $ :
L’exemple suivant illustre l’utilisation des codes de remplacement $2 et $1, qui représentent le premier et le deuxième
groupes capturés correspondants :
var str:String = "flip-flop";
var pattern:RegExp = /(\w+)-(\w+)/g;
trace(str.replace(pattern, "$2-$1")); // flop-flip
Vous pouvez également utiliser une fonction comme deuxième paramètre de la méthode replace(). Le texte
correspondant est remplacé par la valeur renvoyée de la fonction.
Code $ Texte de remplacement
$$ $
$& Sous-chaîne correspondante.
$` Partie de la chaîne qui précède la sous-chaîne correspondante. Ce code utilise les guillemets simples droits gauches
(`) et non les guillemets simples droits (') ni les guillemets simples anglais gauches (' ).
$' Partie de la chaîne qui suit la sous-chaîne correspondante. Ce code utilise les guillemets simples droits (' ).
$n nième groupe entre parenthèses correspondant capturé, où n est un chiffre compris entre 1 et 9 et $n n’est pas suivi
d’une décimale.
$nn nnième groupe entre parenthèses correspondant capturé, où nn est un nombre décimal à deux chiffres compris
entre 01 et 99. Si la nnième capture n’est pas définie, le texte de remplacement est une chaîne vide.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 19
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var str:String = "Now only $9.95!";
var price:RegExp = /\$([\d,]+.\d+)+/i;
trace(str.replace(price, usdToEuro));
function usdToEuro(matchedSubstring:String, capturedMatch1:String, index:int,
str:String):String
{
var usd:String = capturedMatch1;
usd = usd.replace(",", "");
var exchangeRate:Number = 0.853690;
var euro:Number = parseFloat(usd) * exchangeRate;
const euroSymbol:String = String.fromCharCode(8364);
return euro.toFixed(2) + " " + euroSymbol;
}
Lorsque vous utilisez une fonction comme deuxième paramètre de la méthode replace(), les arguments suivants sont
transmis à la fonction :
• La partie correspondante de la chaîne.
• Tout groupe entre parenthèses capturé correspondant. Le nombre d’arguments transmis de cette façon varie selon
le nombre de correspondances entre parenthèses. Pour déterminer le nombre de correspondances entre
parenthèses, vérifiez arguments.length - 3 dans le code de la fonction.
• La position d’index dans la chaîne où débute la correspondance.
• La chaîne complète.
Conversion de la casse dans des chaînes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Comme illustré dans l’exemple suivant, les méthodes toLowerCase() et toUpperCase() convertissent les caractères
alphabétiques de la chaîne en minuscule et en majuscule, respectivement :
var str:String = "Dr. Bob Roberts, #9."
trace(str.toLowerCase()); // dr. bob roberts, #9.
trace(str.toUpperCase()); // DR. BOB ROBERTS, #9.
Une fois que ces méthodes sont exécutées, la chaîne source reste inchangée. Pour transformer la chaîne source, utilisez
le code suivant :
str = str.toUpperCase();
Ces méthodes fonctionnent avec des caractères étendus, pas simplement a–z et A–Z :
var str:String = "José Barça";
trace(str.toUpperCase(), str.toLowerCase()); // JOSÉ BARÇA josé barça
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 20
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Exemple de chaîne : ASCII Art
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Cet exemple ASCII Art représente différentes façons d’utiliser la classe String en ActionScript 3.0, notamment :
• La méthode split() de la classe String est utilisée pour extraire des valeurs d’une chaîne séparée par des caractères
(informations d’image dans un fichier de texte séparé par des tabulations).
• Plusieurs techniques de manipulation de chaînes, y compris split(), la concaténation et l’extraction d’une partie
de la chaîne à l’aide de substring() et de substr(), sont utilisées pour mettre la première lettre de chaque mot
dans les titres d’image en majuscule.
• La méthode getCharAt() est utilisée pour obtenir un seul caractère à partir d’une chaîne (pour déterminer le
caractère ASCII correspondant à une valeur bitmap d’échelle de gris).
• La concaténation de chaîne est utilisée pour construire la représentation ASCII art d’une image, un caractère à la fois.
Le terme ASCII art fait référence à des représentations textuelles d’une image dans lesquelles une grille de polices de
caractères à espacement constant (caractères Courier New, par exemple) trace l’image. L’image suivante est un
exemple d’ASCII art produit par l’application :
La version ASCII art du graphique est illustrée à droite.
Pour obtenir les fichiers d’application de cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de l’application ASCIIArt se trouvent dans
le dossier Samples/AsciiArt. L’application se compose des fichiers suivants :
Fichier Description
AsciiArtApp.mxml
ou
AsciiArtApp.fla
Fichier d’application principal en FLA pour Flash ou en MXML
pour Flex
com/example/programmingas3/asciiArt/AsciiArtBuilder.as La classe qui fournit la fonctionnalité principale de
l’application, notamment l’extraction de métadonnées
d’image d’un fichier de texte, le chargement des images et la
gestion du processus de conversion d’image en texte.
com/example/programmingas3/asciiArt/BitmapToAsciiConverter.as Une classe qui fournit la méthode parseBitmapData()
pour convertir des données d’image dans une version String.
com/example/programmingas3/asciiArt/Image.as Une classe qui représente une image bitmap chargée.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 21
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
Extraction de valeurs séparées par des tabulations
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Cet exemple utilise le stockage séparé de données d’application par rapport à l’application ; de cette façon, si les
données changent (par exemple, si une autre image est ajoutée ou que le titre d’une image change), il est inutile de
recréer le fichier SWF. Dans ce cas, les métadonnées d’image, y compris le titre de l’image, l’URL du fichier d’image
réel et certaines valeurs utilisées pour manipuler l’image, sont stockés dans un fichier de texte (le fichier
txt/ImageData.txt dans le projet). Le contenu du fichier de texte est le suivant :
FILENAMETITLEWHITE_THRESHHOLDBLACK_THRESHHOLD
FruitBasket.jpgPear, apple, orange, and bananad810
Banana.jpgA picture of a bananaC820
Orange.jpgorangeFF20
Apple.jpgpicture of an apple6E10
Le fichier utilise un format séparé par des tabulations spécifique. La première ligne est une ligne d’en-tête. Les lignes
restantes contiennent les données suivantes pour chaque bitmap à charger :
• Le nom de fichier du bitmap.
• Le nom d’affichage du bitmap.
• Les valeurs de seuil du blanc et les valeurs de seuil du noir pour les bitmaps. Il s’agit de valeurs hexadécimales audessus
et en dessous desquelles un pixel doit être considéré comme totalement blanc ou totalement noir.
Dès que l’application démarre, la classe AsciiArtBuilder se charge et analyse le contenu du fichier de texte afin de créer
la « pile » d’images qu’elle chargera. Pour cela, elle utilise le code suivant de la méthode parseImageInfo() de la classe
AsciiArtBuilder :
com/example/programmingas3/asciiArt/ImageInfo.as Une classe représentant des métadonnées pour une image
ASCII art (titre, URL de fichier image, etc.).
image/ Un dossier contenant des images utilisées par l’application.
txt/ImageData.txt Un fichier de texte séparé par des tabulations et contenant
des informations sur les images à charger par l’application.
Fichier Description
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 22
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
var lines:Array = _imageInfoLoader.data.split("\n");
var numLines:uint = lines.length;
for (var i:uint = 1; i < numLines; i++)
{
var imageInfoRaw:String = lines[i];
...
if (imageInfoRaw.length > 0)
{
// Create a new image info record and add it to the array of image info.
var imageInfo:ImageInfo = new ImageInfo();
// Split the current line into values (separated by tab (\t)
// characters) and extract the individual properties:
var imageProperties:Array = imageInfoRaw.split("\t");
imageInfo.fileName = imageProperties[0];
imageInfo.title = normalizeTitle(imageProperties[1]);
imageInfo.whiteThreshold = parseInt(imageProperties[2], 16);
imageInfo.blackThreshold = parseInt(imageProperties[3], 16);
result.push(imageInfo);
}
}
Le contenu entier du fichier de texte se trouve dans une seule occurrence de String, la propriété
_imageInfoLoader.data. Vous pouvez utiliser la méthode split() avec le caractère de nouvelle ligne ("\n")
comme paramètre pour diviser l’occurrence de String en un tableau (lines) dont les éléments sont les lignes
individuelles du fichier de texte. Le code utilise ensuite une boucle pour travailler avec chacune des lignes (excepté la
première car elle contient uniquement des en-têtes). A l’intérieur de la boucle, la méthode split() est de nouveau
utilisée pour diviser le contenu de la ligne en un ensemble de valeurs (l’objet Array appelé imageProperties). Le
paramètre utilisé avec la méthode split() dans ce cas est le caractère de tabulation ("\t") car les valeurs dans chaque
ligne sont délimitées par des tabulations.
Utilisation de méthodes String pour normaliser des titres d’image
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans cette application, tous les titres d’image sont affichés à l’aide d’un format standard, avec la première lettre de
chaque mot en majuscule (excepté quelques mots qui ne sont généralement pas en majuscule dans des titres anglais).
Au lieu de considérer que le fichier de texte contient des titres formatés correctement, l’application formate les titres
lors de leur extraction du fichier de texte.
Dans la liste de code précédente, lors de l’extraction de valeurs de métadonnées d’image individuelles, la ligne de code
suivante est utilisée :
imageInfo.title = normalizeTitle(imageProperties[1]);
Dans ce code, le titre de l’image issu du fichier de texte est transmis au moyen de la méthode normalizeTitle() avant
d’être stocké dans l’objet ImageInfo :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 23
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
private function normalizeTitle(title:String):String
{
var words:Array = title.split(" ");
var len:uint = words.length;
for (var i:uint; i < len; i++)
{
words[i] = capitalizeFirstLetter(words[i]);
}
return words.join(" ");
}
Cette méthode utilise la méthode split() pour diviser le titre en mots individuels (séparés par le caractère
d’espacement), transmet chaque mot au moyen de la méthode capitalizeFirstLetter() puis utilise la méthode
join() de la classe Array pour combiner de nouveau les mots en une chaîne unique.
Comme son nom l’indique, la méthode capitalizeFirstLetter() met la première lettre de chaque mot en
majuscule :
/**
* Capitalizes the first letter of a single word, unless it's one of
* a set of words that are normally not capitalized in English.
*/
private function capitalizeFirstLetter(word:String):String
{
switch (word)
{
case "and":
case "the":
case "in":
case "an":
case "or":
case "at":
case "of":
case "a":
// Don't do anything to these words.
break;
default:
// For any other word, capitalize the first character.
var firstLetter:String = word.substr(0, 1);
firstLetter = firstLetter.toUpperCase();
var otherLetters:String = word.substring(1);
word = firstLetter + otherLetters;
}
return word;
}
En anglais, le premier caractère des mots suivants utilisés dans un titre n’est pas mis en majuscule : “and,” “the,” “in,”
“an,” “or,” “at,” “of,” ou “a.” (il s’agit d’une version simplifiée des règles). Pour exécuter cette logique, le code utilise
d’abord une instruction switch pour vérifier si le mot est l’un des mots ne devant pas être en majuscule. Si c’est le cas,
le code sort de l’instruction switch. Si le mot doit être en majuscule, la procédure comprend plusieurs étapes :
1 La première lettre du mot est extraite à l’aide de substr(0, 1), qui extraie une sous-chaîne commençant par le
caractère au niveau de l’index 0 (la première lettre de la chaîne, comme indiqué par le premier paramètre 0). La
sous-chaîne contiendra un caractère (indiqué par le deuxième paramètre 1).
2 Ce caractère est mis en majuscule à l’aide de la méthode toUpperCase().
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 24
Utilisation des chaînes
Dernière mise à jour le 27/4/2013
3 Les caractères restants du mot d’origine sont extraits à l’aide de substring(1), qui extraie une sous-chaîne
commençant à l’index 1 (la deuxième lettre) jusqu’à la fin de la chaîne (indiqué en omettant le deuxième paramètre
de la méthode substring()).
4 Le dernier mot est créé en combinant la première lettre mise en majuscule et les lettres restantes en utilisant la
concaténation de chaîne : firstLetter + otherLetters
Génération du texte ASCII art
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe BitmapToAsciiConverter permet de convertir une image bitmap en sa représentation de texte ASCII. Cette
procédure est effectuée par la méthode parseBitmapData(), partiellement représentée ici :
var result:String = "";
// Loop through the rows of pixels top to bottom:
for (var y:uint = 0; y < _data.height; y += verticalResolution)
{
// Within each row, loop through pixels left to right:
for (var x:uint = 0; x < _data.width; x += horizontalResolution)
{
...
// Convert the gray value in the 0-255 range to a value
// in the 0-64 range (since that's the number of "shades of
// gray" in the set of available characters):
index = Math.floor(grayVal / 4);
result += palette.charAt(index);
}
result += "\n";
}
return result;
Ce code définit d’abord une occurrence de String appelée result qui sera utilisée pour créer la version ASCII art de
l’image bitmap. Il effectue ensuite une boucle sur les pixels de l’image bitmap source. Il utilise plusieurs techniques de
manipulation des couleurs (non décrites ici) pour convertir le rouge, le vert et le bleu d’un pixel en une valeur d’échelle
de gris (un nombre entre 0 et 255). Le code divise ensuite cette valeur par 4 (comme indiqué) pour la convertir en une
valeur dans l’échelle 0-63, qui est stockée dans la variable index (l’échelle 0-63 est utilisée car la palette des caractères
ASCII disponibles utilisée par cette application contient 64 valeurs). La palette des caractères est définie en tant
qu’occurrence de String dans la classe BitmapToAsciiConverter :
// The characters are in order from darkest to lightest, so that their
// position (index) in the string corresponds to a relative color value
// (0 = black).
private static const palette:String =
"@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";
Etant donné que la variable index définit le caractère ASCII de la palette qui correspond au pixel actuel dans l’image
bitmap, ce caractère est récupéré de la palette String à l’aide de la méthode charAt(). Il est ensuite ajouté à
l’occurrence de String result au moyen de l’opérateur d’affectation de concaténation (+=). En outre, à la fin de chaque
ligne de pixels, un caractère de nouvelle ligne est concaténé à la fin de l’occurrence de String result afin que la ligne
à renvoyer crée une ligne de pixels de caractères.
25
Dernière mise à jour le 27/4/2013
Chapitre 3 : Utilisation de tableaux
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les tableaux vous permettent de stocker plusieurs valeurs dans une seule structure de données. Vous pouvez utiliser
des tableaux indexés simples qui stockent des valeurs à l’aide d’index d’entiers ordinaux fixes ou des tableaux
associatifs complexes qui stockent des valeurs à l’aide de clés arbitraires. Les tableaux peuvent également être
multidimensionnels et contenir des éléments étant eux-mêmes des tableaux. Pour finir, vous pouvez utiliser un vecteur
pour les tableaux dont les éléments sont tous des occurrences du même type de données.
Voir aussi
Array
Vecteur
Principes de base des tableaux
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous aurez souvent besoin en programmation d’utiliser un ensemble d’éléments plutôt qu’un seul objet; par exemple,
dans une application de lecteur de musique, vous pouvez avoir une liste de morceaux en attente de lecture. Vous ne
souhaitez pas créer une variable séparée pour chaque morceau de cette liste. Il serait préférable de rassembler tous les
objets Song et de les utiliser sous forme de groupe.
Un tableau est un élément de programmation qui agit comme conteneur pour un ensemble d’éléments (une liste de
morceaux, par exemple). La plupart du temps, tous les éléments d’un tableau sont des occurrences de la même classe,
mais ceci n’est pas obligatoire dans ActionScript. Les éléments individuels d’un tableau sont les éléments du tableau.
Un tableau peut être comparé à un tiroir classeur pour des variables. Les variables peuvent être ajoutées en tant
qu’éléments au tableau, comme vous placez un dossier dans le tiroir classeur. Vous pouvez utiliser le tableau comme
une variable unique, comme si vous transportiez le tiroir entier à un autre endroit. Vous pouvez utiliser les variables
en tant que groupe, comme si vous recherchiez des informations dans les dossiers en les parcourant l’un après l’autre.
Vous pouvez y accéder individuellement, comme si vous ouvriez le tiroir et sélectionniez un seul dossier.
Par exemple, imaginez que vous créez une application de lecteur de musique dans laquelle un utilisateur peut
sélectionner plusieurs morceaux et les ajouter à une liste de lecture. Dans votre code ActionScript, vous avez une
méthode appelée addSongsToPlaylist() qui accepte un seul tableau comme paramètre. Peu importe le nombre de
morceaux à ajouter à la liste (quelques-uns, un grand nombre, ou même un seul), vous devez appeler la méthode
addSongsToPlaylist() une seule fois, en lui transmettant le tableau qui contient les objets Song. Dans la méthode
addSongsToPlaylist(), vous pouvez utiliser une boucle pour parcourir les éléments (morceaux) du tableau un par
un et les ajouter à la liste de lecture.
Le type de tableau ActionScript le plus courant est le tableau indexé. Dans un tableau indexé, chaque élément est stocké
dans un emplacement numéroté appelé index. On accède à des éléments à l’aide du numéro, comme une adresse. Les
tableaux indexés répondent à la plupart des besoins en programmation. La classe Array est une classe courante utilisée
pour représenter un tableau indexé.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 26
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Un tableau indexé est souvent utilisé pour stocker plusieurs éléments du même type, des objets qui sont des
occurrences de la même classe. La classe Array ne dispose pas de moyens pour restreindre le type d’éléments qu’elle
contient. La classe Vector est un type de tableau indexé dans lequel tous les éléments d’un tableau unique sont du
même type. L’utilisation d’une occurrence de Vector à la place d’une occurrence de Array peut également déboucher
sur une amélioration des performances entre autres. la classe Vector est prise en charge à partir de Flash Player 10 et
Adobe AIR 1.5.
Une utilisation spéciale d’un tableau indexé est un tableau multidimensionnel. Un tableau multidimensionnel est un
tableau indexé dont les éléments sont des tableaux indexés, qui contiennent à leur tour d’autres éléments.
Le tableau associatif est un autre type de tableau. Il utilise une chaîne key au lieu d’un index numérique pour identifier
des éléments individuels. Enfin, ActionScript 3.0 comprend également une classe Dictionary qui représente un
dictionnaire. Un dictionnaire est un tableau qui vous permet d’utiliser tout type d’objet comme clé afin de distinguer
les éléments entre eux.
Concepts importants et terminologie
La liste de référence suivante contient des termes importants utilisés dans le cadre de la programmation de routines
qui gèrent des tableaux et des vecteurs :
Array Objet qui sert de conteneur pour regrouper plusieurs objets.
Opérateur ([]) d’accès au tableau Paire de crochets entourant un index ou une clé qui identifie de façon unique un
élément du tableau. Cette syntaxe est utilisée après le nom d’une variable de tableau pour spécifier un seul élément du
tableau plutôt qu’un tableau entier.
Tableau associatif Tableau qui utilise des clés de chaîne pour identifier des éléments individuels.
Type de base Type de données des objets qu’une occurrence de Vector est autorisée à stocker.
Dictionnaire Tableau dont les éléments sont constitués de paires d’objets appelées clé et valeur. La clé est utilisée à la
place d’un index numérique pour identifier un seul élément.
Elément Elément unique dans un tableau.
Index Adresse numérique utilisée pour identifier un élément unique dans un tableau indexé.
Tableau indexé Type de tableau standard qui stocke chaque élément dans une position numérotée et utilise le numéro
(index) pour identifier des éléments individuels.
Clé Chaîne ou objet utilisé pour identifier un seul élément dans un tableau associatif ou un dictionnaire.
Tableau multidimensionnel Tableau contenant des éléments qui sont des tableaux plutôt que des valeurs uniques.
T Convention standard utilisée dans la présente documentation pour représenter le type de base d’une occurrence de
Vector, quel qu’il soit. La convention T est utilisée pour représenter un nom de classe, comme cela est indiqué dans la
description du paramètre Type. (« T » correspond à « type », comme dans « type de données ».)
Paramètre Type Syntaxe utilisée avec le nom de classe Vector pour spécifier le type de base de Vector (le type de
données des objets qu’il stocke). La syntaxe consiste en un point (.), puis le nom du type de données entouré de
parenthèses en chevron (<>). L’ensemble ressemble à ceci : Vector. Dans la présente documentation, la classe
spécifiée dans le paramètre Type est représenté de façon générique par T.
Vecteur Type de tableau dont les éléments sont tous des occurrences du même type de données.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 27
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Tableaux indexés
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les tableaux indexés stockent une série d’une ou de plusieurs valeurs organisées de façon à ce que vous puissiez accéder
à chaque valeur à l’aide d’une valeur d’entier non signé. Le premier index correspond toujours au nombre 0. L’index
est ensuite incrémenté d’une unité pour chaque élément ajouté consécutivement au tableau. Dans ActionScript 3.0,
deux classes sont utilisées comme tableaux indexés : la classe Array et la classe Vector.
Les tableaux indexés utilisent un entier 32 bits non signé pour le numéro d’index. La taille maximale d’un tableau
indexé est 232 - 1 ou 4 294 967 295. Si vous tentez de créer un tableau plus grand que la taille maximale, une erreur
d’exécution se produit.
Pour accéder à un élément particulier d’un tableau indexé, vous pouvez utiliser l’opérateur ([]) d’accès au tableau pour
spécifier la position de l’index de l’élément visé. Par exemple, le code suivant représente le premier élément (l’élément
à l’index 0) dans un tableau indexé appelé songTitles :
songTitles[0]
La combinaison du nom de la variable du tableau suivi de l’index entre crochets fonctionne comme un identifiant
unique. En d’autres termes, elle peut être utilisée tout comme un nom de variable. Vous pouvez affecter une valeur à
un élément du tableau indexé en utilisant le nom et l’index du côté gauche d’une instruction d’affectation :
songTitles[1] = "Symphony No. 5 in D minor";
Dans la même veine, vous pouvez récupérer une valeur à un élément du tableau indexé en utilisant le nom et l’index
du côté droit d’une instruction d’affectation :
var nextSong:String = songTitles[2];
Vous pouvez aussi utiliser une variable entre crochets plutôt que de fournir une valeur explicite. Elle doit contenir une
valeur entière non-négative telle qu’un uint, un int positif ou une occurrence de Number d’entier positif. Cette
technique est utilisée couramment pour passer en boucle sur les éléments dans un tableau indexé et effectuer une
opération sur un ou tous les éléments. Le code ci-dessous décrit cette technique. Le code utilise une boucle pour
accéder à chaque valeur dans un objet Array appelé oddNumbers. Il utilise l’instruction trace() pour imprimer
chaque valeur sous la forme “oddNumber[index] = value” :
var oddNumbers:Array = [1, 3, 5, 7, 9, 11];
var len:uint = oddNumbers.length;
for (var i:uint = 0; i < len; i++)
{
trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString());
}
Classe Array
La classe Array est le premier type de tableau indexé. Une occurrence de Array peut comporter une valeur de n’importe
quel type de données. Le même objet Array peut comporter des objets qui sont de types de données différents. Par
exemple, une occurrence de Array unique peut avoir une valeur String en index 0, une occurrence de Number en index
1 et un objet XML en index 2.
Classe Vector
La classe Vector est un autre type de tableau indexé qui est disponible dans ActionScript 3.0. Une occurrence de Vector
est un tableau typé, ce qui signifie que tous les éléments d’une occurrence de Vector ont toujours le même type de
données.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 28
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Remarque : la classe Vector est prise en charge à partir de Flash Player 10 et Adobe AIR 1.5.
Lorsque vous déclarez une variable Vector ou que vous instanciez un objet Vector, vous spécifiez explicitement le type
de données des objets que le vecteur peut contenir. Le type de données spécifié est connu sous le nom de type de base
du vecteur. Lors de l’exécution et de la compilation (en mode strict), tout code qui fixe la valeur d’un élément Vector
ou récupère une valeur d’un élément Vector est contrôlé. Si le type de données de l’objet que l’on tente d’ajouter ou de
récupérer ne correspond pas au type de base du vecteur, une erreur se produit.
Outre la restriction concernant le type de données, la classe Vector possède d’autres restrictions qui la distinguent de
la classe Array :
• Un vecteur est un tableau dense. Un objet Array peut comporter des valeurs dans les index 0 et 7 même si elle n’en
a pas dans les positions 1 à 6. Cependant, un vecteur doit comporter une valeur (ou null) dans chaque index.
• Un vecteur peut facultativement avoir une longueur fixe. Ceci signifie que le nombre d’éléments du vecteur est
immuable.
• L’accès aux éléments d’un vecteur est défini par ses limites. Vous ne pouvez jamais lire une valeur d’un index
supérieur à celui de l’élément final (longueur - 1). Vous ne pouvez jamais définir une valeur avec un index
supérieur à l’index final actuel. En d’autres termes, vous pouvez définir une valeur uniquement à l’index existant
ou à une [longueur] d’index.
En raison de ses restrictions, un vecteur présente trois avantages principaux par rapport à une occurrence d’Array dont
les éléments sont tous des occurrences d’une classe unique :
• Performance : l’accès à l’élément de tableau et son itération sont beaucoup plus rapides lorsque vous utilisez une
occurrence de Vector que lorsque vous utilisez une occurrence d’Array.
• Sécurité des types : en mode strict, le compilateur peut identifier les erreurs de type de données. Parmi ces erreurs,
il y a l’affectation d’une valeur du type de données incorrect à un vecteur ou l’attente d’un type de données
incompatible lors de la lecture d’une valeur à partir du vecteur. A l’exécution, les types de données sont également
contrôlés lors de l’ajout de données à un objet Vector ou la lecture de données qui en provient. Notez cependant
que lorsque vous utilisez la méthode push() ou unshift() pour ajouter des valeurs à un vecteur, les types de
données des arguments ne sont pas vérifiés au moment de la compilation. Lorsque vous utilisez ces méthodes, les
valeurs sont toujours contrôlées à l’exécution.
• Fiabilité : le contrôle de gamme à l’exécution (ou contrôle de longueur fixe) assure une fiabilité nettement
supérieure à celle des objets Array.
A part les contraintes et les avantages supplémentaires, la classe Vector est très proche de la classe Array. Les propriétés
et les méthodes d’un objet Vector sont similaires, voire dans certains cas identiques, aux propriétés et aux méthodes
d’un objet Array. Au lieu d’utiliser un objet Array dont tous les éléments possèdent le même type de données, il est
généralement préférable de faire appel à une occurrence de l’objet Vector.
Création de tableaux
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser plusieurs techniques pour créer une occurrence de Array ou une occurrence de Vector.
Cependant, les techniques de création de chaque type de tableau sont quelque peu différentes.
Création d’une occurrence de Array
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous créez un objet Array par l’appel au constructeur Array( ou par l’utilisation d’une syntaxe de littéral de tableau.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 29
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Vous pouvez utiliser la fonction de constructeur Array() de trois façons différentes. Premièrement, si vous appelez le
constructeur sans arguments, vous obtenez un tableau vide. Vous pouvez utiliser la propriété length de la classe Array
pour vérifier que le tableau ne contient aucun élément. Par exemple, le code suivant appelle le constructeur Array()
sans arguments :
var names:Array = new Array();
trace(names.length); // output: 0
Deuxièmement, si vous utilisez un nombre comme unique paramètre pour le constructeur Array(), un tableau de
cette longueur est créé, avec chaque valeur d’élément définie sur undefined. L’argument doit être un entier non signé
compris entre les valeurs 0 et 4 294 967 295. Par exemple, le code suivant appelle le constructeur Array() avec un seul
argument numérique :
var names:Array = new Array(3);
trace(names.length); // output: 3
trace(names[0]); // output: undefined
trace(names[1]); // output: undefined
trace(names[2]); // output: undefined
Troisièmement, si vous appelez le constructeur et transmettez une liste d’éléments comme paramètres, un tableau est
créé avec des éléments correspondant à chacun des paramètres. Le code suivant transmet trois arguments au
constructeur Array() :
var names:Array = new Array("John", "Jane", "David");
trace(names.length); // output: 3
trace(names[0]); // output: John
trace(names[1]); // output: Jane
trace(names[2]); // output: David
Vous pouvez aussi créer des tableaux avec des littéraux de tableau. Un littéral de tableau peut être affecté directement
à une variable de tableau, comme illustré dans l’exemple suivant :
var names:Array = ["John", "Jane", "David"];
Création d’une occurrence de Vector
Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures
Vous créez une occurrence de Vector par l’appel du constructeur Vector.(). Vous pouvez aussi créer un vecteur
par l’appel à la fonction globale Vector.(). Cette fonction convertit un objet spécifié en une occurrence de Vector.
Dans Flash Professional CS5 et les versions ultérieures, Flash Builder 4 et les versions ultérieures et Flex 4 et les
versions ultérieures, vous pouvez également créer une occurrence de Vector à l’aide de la syntaxe de littéral
correspondante.
Toutes les fois que vous déclarez une variable Vector (ou de la même façon, un paramètre de la méthode Vector ou un
type de renvoi de la méthode Vector), vous spécifiez le type de base de la variable Vector. Vous spécifiez également le
type de base lorsque vous créez une occurrence de Vector par l’appel au constructeur Vector.(). Autrement dit,
toutes les fois que vous utilisez le terme Vector dans ActionScript, il est accompagné d’un type de base.
Vous spécifiez le type de base du vecteur à l’aide de la syntaxe de paramètres de type. Le paramètre de type suit
immédiatement le mot Vector dans le code. Il est formé d’un point (.), puis du nom de classe de base entouré de
parenthèses en chevron (<>), comme l’indique cet exemple :
var v:Vector.;
v = new Vector.();
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 30
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Dans la première ligne de cet exemple, la variable v est déclarée comme une occurrence de Vector.. En
d’autres termes, il représente un tableau indexé qui ne peut comporter que des occurrences de String. La deuxième
ligne appelle le constructeur Vector() pour créer une occurrence du même type Vector, c’est-à-dire un vecteur dont
les éléments sont tous des objets String. Il affecte cet objet à v.
Utilisation du constructeur Vector.()
Si vous utilisez le constructeur Vector.() sans arguments, il crée une occurrence de Vector vide. Vous pouvez
contrôler qu’un vecteur est vide en vérifiant sa propriété length. Par exemple, le code ci-dessus appelle le constructeur
Vector.() sans arguments :
var names:Vector. = new Vector.();
trace(names.length); // output: 0
Si vous savez d’avance de combien d’éléments un vecteur a besoin initialement, vous pouvez prédéfinir ce nombre dans
le vecteur. Pour créer un vecteur avec un certain nombre d’éléments, transmettez le nombre d’éléments comme
premier paramètre (le paramètre length). Comme les éléments du vecteur ne peuvent pas être vides, ils sont remplis
d’occurrences du type de base. Si ce type est un type de référence qui autorise les valeurs null, les éléments contiennent
tous null. Autrement, ils contiennent tous la valeur par défaut pour la classe. Par exemple, une variable uint ne peut
pas être null. Par conséquent, dans le code ci-dessous, le vecteur appelé ages est créé avec sept éléments, chacun
contenant la valeur 0.
var ages:Vector. = new Vector.(7);
trace(ages); // output: 0,0,0,0,0,0,0
Enfin, à l’aide du constructeur Vector.(), vous pouvez également créer un vecteur de longueur fixe en
transmettant true comme deuxième paramètre (le paramètre fixed). Dans ce cas, le vecteur est créé avec le nombre
spécifié d’éléments et celui-ci ne peut pas être modifié. Notez cependant que vous pouvez quand même changer les
valeurs des éléments d’un vecteur de longueur fixe.
Utilisation du constructeur de syntaxe de littéral Vector
Dans Flash Professional CS5 et les versions ultérieures, Flash Builder 4 et les versions ultérieures et Flex 4 et les
versions ultérieures, vous pouvez transmettre une liste de valeurs au constructeur Vector() pour stipuler les
valeurs initiales du vecteur :
// var v:Vector. = new [E0, ..., En-1 ,];
// For example:
var v:Vector. = new [0,1,2,];
Cette syntaxe possède les caractéristiques suivantes :
• La virgule de fin de ligne est facultative.
• La syntaxe ne gère pas la présence d’éléments vides dans le tableau. Une instruction telle que var v:Vector.
= new [0,,2,] renvoie une erreur de compilation.
• Il est impossible de stipuler la longueur par défaut de l’occurrence de Vector. La longueur correspond au nombre
d’éléments qui composent la liste d’initialisation.
• Il est impossible de spécifier si l’occurrence de Vector possède une longueur fixe. Utilisez à cet effet la propriété
fixed.
• Il risque de se produire des pertes de données ou des erreurs si les éléments transmis en tant que valeurs ne
correspondent pas au type indiqué. Exemple :
var v:Vector. = new [4.2]; // compiler error when running in strict mode
trace(v[0]); //returns 4 when not running in strict mode
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 31
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Utilisation du constructeur Vector. ()
Outre le constructeur Vector.() et le constructeur de syntaxe de littéral Vector, vous disposez également de la
fonction globale Vector. () pour créer un objet Vector. La fonction globale Vector.() est une fonction de
conversion. Lorsque vous appelez la fonction globale Vector.(), vous spécifiez le type de base du vecteur que la
méthode renvoie. Vous transmettez un tableau indexé unique (occurrence de Array ou Vector) comme argument. La
méthode renvoie alors un vecteur avec le type de base spécifié, contenant les valeurs dans l’argument du tableau source.
Le code ci-dessous montre la syntaxe nécessaire pour appeler la fonction globale Vector.().
var friends:Vector. = Vector.(["Bob", "Larry", "Sarah"]);
La fonction globale Vector.() exécute une conversion de type de base sur deux niveaux. D’abord, lorsqu’une
occurrence de Array est transmise à la fonction, une occurrence de Vector est renvoyée. Ensuite, que le tableau source
soit une occurrence de Array ou Vector, la fonction tente de convertir les éléments du tableau source en valeurs du
type de base. La conversion utilise des règles standard de conversion des types de données ActionScript. Par exemple,
le code suivant convertit les valeurs String du tableau source en nombres entiers dans le vecteur résultant. La partie
décimale de la première ("1.5") est tronquée et la troisième valeur non numérique ("Waffles") est convertie en 0
dans le résultat :
var numbers:Vector. = Vector.(["1.5", "17", "Waffles"]);
trace(numbers); // output: 1,17,0
S’il n’est pas possible de convertir un élément source quelconque, une erreur se produit.
Lorsque le code appelle la fonction globale Vector.(), si un élément du tableau source est une occurrence d’une
sous-classe du type de base spécifié, l’élément est ajouté au vecteur résultant (aucune erreur ne se produit). L’utilisation
de la fonction globale Vector.() est en fait le seul moyen de convertir un vecteur avec un type de base T en un
vecteur avec un type de base qui est une superclasse de T.
Insertion d’éléments de tableau
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’opérateur ([]) d’accès au tableau constitue le moyen le plus élémentaire d’ajouter un élément à un tableau indexé.
Pour définir la valeur d’un élément de tableau indexé, utilisez le nom d’objet Array ou Vector et le numéro d’index du
côté gauche d’une instruction d’affectation.
songTitles[5] = "Happy Birthday";
Si un élément ne se trouve pas déjà à cette position d’index du tableau ou du vecteur, l’index est créé et la valeur y est
stockée. Si une valeur existe à cet index, la nouvelle valeur remplace l’ancienne.
Un objet Array vous permet de créer un élément pour tout index. Cependant, avec un objet Vector, vous pouvez
affecter uniquement une valeur à un index existant ou à l’index disponible suivant. Celui-ci correspond à la propriété
length de l’objet Vector. Utilisez du code comme celui qui est présenté ci-dessous pour ajouter un nouvel élément à
un objet Vector de la façon la plus sûre :
myVector[myVector.length] = valueToAdd;
Trois méthodes des classes Array et Vector, push(), unshift() et splice(), vous permettent d’insérer des éléments
dans un tableau indexé. La méthode push() ajoute un ou plusieurs éléments à la fin d’un tableau. Ainsi, le dernier
élément inséré dans le tableau à l’aide de la méthode push() aura le numéro d’index le plus élevé. La méthode
unshift() insère un ou plusieurs éléments au début d’un tableau, qui est toujours au numéro d’index 0. La méthode
splice() insère des éléments au niveau d’un index spécifié dans le tableau.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 32
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
L’exemple suivant illustre les trois méthodes. Un tableau appelé planets est créé pour trier les noms des planètes par
ordre de proximité par rapport au soleil. La méthode push() est tout d’abord appelée pour ajouter l’élément initial,
Mars. Deuxièmement, la méthode unshift() est appelée pour insérer l’élément Mercury au début du tableau. Pour
finir, la méthode splice() est appelée pour insérer les éléments Venus et Earth après Mercury, mais avant Mars. Le
premier élément envoyé à splice(), l’entier 1, indique à l’insertion de débuter à l’index 1. Le deuxième argument
envoyé à splice(), l’entier 0, indique qu’aucun élément ne doit être supprimé. Pour finir, les troisième et quatrième
arguments envoyés à splice(), Venus et Earth, sont les éléments à insérer.
var planets:Array = new Array();
planets.push("Mars"); // array contents: Mars
planets.unshift("Mercury"); // array contents: Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");
trace(planets); // array contents: Mercury,Venus,Earth,Mars
Les méthodes push() et unshift() renvoient toutes les deux un entier non signé qui représente la longueur du
tableau modifié. La méthode splice() renvoie un tableau vide lorsqu’elle est utilisée pour insérer des éléments, ce qui
semble étrange mais compréhensible en raison de saversatilité. Vous pouvez utiliser la méthode splice() non
seulement pour insérer des éléments dans un tableau, mais également pour en supprimer. Lorsque vous l’utilisez pour
supprimer des éléments, la méthode splice() renvoie un tableau contenant les éléments supprimés.
Remarque : si une propriété fixed de l’objet Vector est définie sur true, le nombre total d’éléments du vecteur reste
immuable. Si vous tentez d’ajouter un nouvel élément à un vecteur de longueur fixe à l’aide des techniques décrites ici,
une erreur se produit.
Récupération des valeurs et suppression des éléments du tableau
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Utilisez l’opérateur ([]) d’accès au tableau pour récupérer la valeur d’un élément de la façon la plus simple. Pour
récupérer la valeur d’un élément de tableau indexé, utilisez le nom d’objet Array ou Vector et le numéro d’index du
côté droit d’une instruction d’affectation.
var myFavoriteSong:String = songTitles[3];
Il est possible d’essayer de récupérer une valeur à partir d’un tableau ou d’un vecteur à l’aide d’un index où aucun
élément n’existe. Dans ce cas, un objet Array renvoie la valeur non définie et un vecteur renvoie une exception
RangeError.
Trois méthodes des classes Array et Vector, pop(), shift() et splice(), vous permettent de supprimer des éléments.
La méthode pop() supprime un élément de la fin du tableau. En d’autres termes, elle supprime l’élément au niveau du
numéro d’index le plus élevé. La méthode shift() supprime un élément du début du tableau, ce qui signifie qu’elle
supprime toujours l’élément au numéro d’index 0. La méthode splice(), qui peut également être utilisée pour insérer
des éléments, supprime un nombre arbitraire d’éléments en commençant au numéro d’index indiqué par le premier
argument envoyé à la méthode.
L’exemple suivant utilise les trois méthodes pour supprimer des éléments d’une occurrence d’Array. Un tableau
nommé oceans est créé pour stocker les noms des océans. Certains noms dans le tableau sont des noms de lacs plutôt
que des noms d’océans. Ils doivent donc être supprimés.
Premièrement, la méthode splice() est utilisée pour supprimer les éléments Aral et Superior, et insérer les
éléments Atlantic et Indian. Le premier argument envoyé à splice(), l’entier 2, indique que l’opération doit
commencer par le troisième élément dans la liste, qui est à l’index 2. Le deuxième argument, 2, indique que deux
éléments doivent être supprimés. Les arguments restants, Atlantic et Indian, sont des valeurs à insérer à l’index 2.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 33
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Deuxièmement, la méthode pop() est utilisée pour supprimer le dernier élément dans le tableau, Huron. Et
troisièmement, la méthode shift() est utilisée pour supprimer le premier élément dans le tableau, Victoria.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superior
oceans.pop(); // removes Huron
oceans.shift(); // removes Victoria
trace(oceans);// output: Pacific,Arctic,Atlantic,Indian
Les méthodes pop() et shift() renvoient toutes les deux l’élément qui a été supprimé. Pour une occurrence de Array,
le type de données de la valeur renvoyée est Object car les tableaux peuvent contenir des valeurs de n’importe quel type
de données. Pour une occurrence de Vector, le type de données de la valeur renvoyée est le type de base du vecteur. La
méthode splice() renvoie un tableau ou un vecteur contenant les valeurs supprimées. Vous pouvez modifier
l’exemple du tableau oceans de façon à ce que l’appel à splice() affecte le tableau renvoyé à une nouvelle variable de
tableau, comme illustré dans l’exemple suivant :
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // output: Aral,Superior
Il se peut que vous rencontriez un code qui utilise l’opérateur delete sur un élément de l’objet Array. L’opérateur
delete définit la valeur d’un élément de tableau sur undefined, mais il ne supprime pas l’élément du tableau. Par
exemple, le code suivant utilise l’opérateur delete sur le troisième élément dans le tableau oceans, mais la longueur
du tableau demeure à 5 :
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
delete oceans[2];
trace(oceans);// output: Arctic,Pacific,,Indian,Atlantic
trace(oceans[2]); // output: undefined
trace(oceans.length); // output: 5
Vous pouvez tronquer un tableau ou un vecteur à l’aide d’une propriété length de tableau. Si vous définissez la
propriété length d’un tableau indexé sur une longueur qui est moindre que la longueur actuelle du tableau, celui-ci
est tronqué : tous les éléments stockés à des numéros d’index supérieurs à la nouvelle valeur length, diminuée de 1,
sont supprimés. Par exemple, si le tableau oceans était trié de telle façon que toutes les entrées valides se trouvaient au
début du tableau, vous pourriez utiliser la propriété length pour supprimer les entrées de fin de tableau, comme
l’indique le code ci-dessous :
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // output: Arctic,Pacific
Remarque : si une propriété fixed de l’objet Vector est définie sur true, le nombre total d’éléments du vecteur reste
immuable. Si vous essayez de supprimer un élément d’un vecteur de longueur fixe ou de tronquer celui-ci à l’aide des
techniques décrites ici, une erreur se produit.
Tri d’un tableau
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Trois méthodes, reverse(), sort() et sortOn(), vous permettent de modifier l’ordre d’un tableau indexé, soit en
triant, soit en inversant l’ordre. Toutes ces méthodes modifient le tableau existant. Le tableau ci-dessous résume ces
méthodes et leurs comportements pour les objets Array et Vector :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 34
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Méthode reverse()
La méthode reverse() ne prend aucun paramètre et ne renvoie aucune valeur mais vous permet de faire basculer
l’ordre de votre tableau de son état actuel à l’ordre inverse. L’exemple suivant inverse l’ordre des océans répertoriés
dans le tableau oceans :
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];
oceans.reverse();
trace(oceans); // output: Pacific,Indian,Atlantic,Arctic
Tri de base avec la méthode sort() (classe Array uniquement)
Pour une occurrence d’Array, la méthode sort() réorganise les éléments dans un tableau à l’aide de l’ordre de tri par
défaut. L’ordre de tri par défaut possède les caractéristiques suivantes :
• Le tri est sensible à la casse, ce qui signifie que les majuscules précédent les minuscules. Par exemple, la lettre D
précède la lettre b.
• Le tri est croissant, ce qui signifie que les codes de caractère bas (A, par exemple) précédent les codes de caractère
élevés (B, par exemple).
• Le tri place les valeurs identiques les unes à côté des autres mais sans ordre particulier.
• Le tri est basé sur des chaînes, ce qui signifie que les éléments sont convertis en chaînes avant d’être comparés (par
exemple, 10 précède 3 car la chaîne "1" a un code de caractère inférieur à celui de la chaîne "3").
Vous pouvez trier votre tableau en ignorant la casse ou par ordre décroissant. Vous pouvez également trier les nombres
de votre tableau par ordre numérique plutôt que par ordre alphabétique. La méthode sort() de la classe Array possède
un paramètre options qui vous permet de modifier chaque caractéristique de l’ordre de tri par défaut. Les options
sont définies par un ensemble de constantes statiques dans la classe Array, comme indiqué dans la liste suivante :
• Array.CASEINSENSITIVE : cette option permet d’ignorer la casse lors du tri. Par exemple, la lettre minuscule b
précède la lettre majuscule D.
• Array.DESCENDING : cette option inverse le tri croissant par défaut. Par exemple, la lettre B précède la lettre A.
• Array.UNIQUESORT : cette option permet d’arrêter le tri si deux valeurs identiques sont repérées.
• Array.NUMERIC : cette option permet d’effectuer un tri numérique, de façon à ce que 3 précède 10.
L’exemple suivant met en évidence certaines de ces options. Un tableau appelé poets est créé. Il est trié à l’aide de
plusieurs options.
Méthode Comportement d’Array Comportement de Vector
reverse() Modifie l’ordre des éléments de telle sorte que le dernier élément
devient le premier élément, le pénultième le deuxième, etc.
Identique au comportement d’Array
sort() Vous permet de trier les éléments du tableau de diverses façons
prédéfinies, comme l’ordre alphabétique ou numérique. Vous pouvez
également spécifier un algorithme de tri personnalisé.
Trie les éléments suivant l’algorithme de tri
personnalisé que vous spécifiez
sortOn() Vous permet de trier des objets qui ont une ou plusieurs propriétés en
commun en spécifiant la ou les propriétés à utiliser comme critères de
tri.
Non disponible dans la classe Vector
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 35
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
poets.sort(); // default sort
trace(poets); // output: Angelou,Blake,Dante,cummings
poets.sort(Array.CASEINSENSITIVE);
trace(poets); // output: Angelou,Blake,cummings,Dante
poets.sort(Array.DESCENDING);
trace(poets); // output: cummings,Dante,Blake,Angelou
poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two options
trace(poets); // output: Dante,cummings,Blake,Angelou
Tri personnalisé avec la méthode sort() (classes Array et Vector)
En plus du tri de base qui est disponible pour un objet Array, vous pouvez également établir une règle de tri
personnalisée. Cette technique est la seule forme de méthode sort() disponible pour la classe Vector. Pour définir un
tri personnalisé, vous rédigez une fonction de tri personnalisée et la transmettez comme argument à la méthode
sort().
Par exemple, si vous avez une liste de noms dans laquelle chaque élément de liste contient le nom entier d’une personne
mais que vous souhaitez trier la liste par nom de famille, vous devez utiliser une fonction de tri personnalisé pour
analyser chaque élément et utiliser le nom de famille dans la fonction de tri. Le code suivant indique comment
procéder avec une fonction personnalisée utilisée comme paramètre pour la méthode Array.sort() :
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");
function orderLastName(a, b):int
{
var lastName:RegExp = /\b\S+$/;
var name1 = a.match(lastName);
var name2 = b.match(lastName);
if (name1 < name2)
{
return -1;
}
else if (name1 > name2)
{
return 1;
}
else
{
return 0;
}
}
trace(names); // output: John Q. Smith,Jane Doe,Mike Jones
names.sort(orderLastName);
trace(names); // output: Jane Doe,Mike Jones,John Q. Smith
La fonction de tri personnalisé orderLastName() utilise une expression régulière pour extraire le nom de famille de
chaque élément à utiliser pour l’opération de comparaison. L’identifiant de fonction orderLastName est l’unique
paramètre utilisé lors de l’appel à la méthode sort() sur le tableau names. La fonction de tri accepte deux paramètres,
a et b, car elle fonctionne sur deux éléments de tableau à la fois. La valeur renvoyée de la fonction de tri indique la
manière dont les éléments doivent être triés :
• Une valeur renvoyée de -1 indique que le premier paramètre, a, précède le second paramètre, b.
• Une valeur renvoyée de 1 indique que le second paramètre, b, précède le premier, a.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 36
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
• Une valeur renvoyée de 0 indique que les éléments ont une précédence de tri équivalente.
Méthode sortOn() (classe Array uniquement)
La méthode sortOn() est conçue pour des objets Array avec des éléments contenant des objets. Ces objets doivent
avoir au moins une propriété en commun pouvant être utilisée comme clé de tri. L’utilisation de la méthode sortOn()
pour des tableaux d’autres types provoque des résultats inattendus.
Remarque : la classe Vector ne contient pas de méthode sortOn(). Cette méthode n’est disponible que pour les objets
Array.
L’exemple suivant modifie le tableau poets de façon à ce que chaque élément soit un objet plutôt qu’une chaîne.
Chaque objet contient à la fois le nom de famille du poète et sa date de naissance.
var poets:Array = new Array();
poets.push({name:"Angelou", born:"1928"});
poets.push({name:"Blake", born:"1757"});
poets.push({name:"cummings", born:"1894"});
poets.push({name:"Dante", born:"1265"});
poets.push({name:"Wang", born:"701"});
Vous pouvez utiliser la méthode sortOn() pour trier le tableau par la propriété born. La méthode sortOn() définit
deux paramètres, fieldName et options. L’argument fieldName doit être spécifié en tant que chaîne. Dans l’exemple
suivant, la méthode sortOn() est appelée avec deux arguments, "born" et Array.NUMERIC. L’argument
Array.NUMERIC est utilisé pour vérifier que le tri est effectué par ordre numérique plutôt que par ordre alphabétique.
Ceci est utile même lorsque tous les nombres ont le même nombre de chiffres car vous êtes certain que le tri se fera
comme prévu si un nombre comportant un nombre inférieur ou supérieur de chiffres est ensuite ajouté au tableau.
poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0; i < poets.length; ++i)
{
trace(poets[i].name, poets[i].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Tri sans modification du tableau d’origine (classe Array uniquement)
Généralement, les méthodes sort() et sortOn() modifient un tableau. Si vous souhaitez trier un tableau sans
modifier le tableau existant, transmettez la constante Array.RETURNINDEXEDARRAY avec le paramètre options. Cette
option indique aux méthodes de renvoyer un nouveau tableau qui reflète le tri et laisse le tableau d’origine inchangé.
Le tableau renvoyé par les méthodes est un tableau simple de numéros d’index qui reflète le nouvel ordre de tri et ne
contient aucun élément du tableau d’origine. Par exemple, pour trier le tableau poets par année de naissance sans le
modifier, incluez la constante Array.RETURNINDEXEDARRAY dans l’argument transmis pour le paramètre options.
L’exemple suivant stocke les informations d’index renvoyées dans un tableau nommé indices et utilise le tableau
indices avec le tableau poets inchangé pour trier les poètes dans l’ordre de leur année de naissance :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 37
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
var indices:Array;
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
for (var i:int = 0; i < indices.length; ++i)
{
var index:int = indices[i];
trace(poets[index].name, poets[index].born);
}
/* output:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/
Interrogation d’un tableau
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les quatre méthodes restantes des classes Array et Vector, concat(), join(), slice(), toString(), interrogent
toutes le tableau sans le modifier. Les méthodes concat() et slice() renvoient toutes les deux de nouveaux tableaux,
alors que les méthodes join() et toString() renvoient des chaînes. La méthode concat() prend un nouveau tableau
ou une liste d’éléments comme arguments et le/la combine avec le tableau existant pour créer un tableau. La méthode
slice() possède deux paramètres nommés startIndex et endIndex, et renvoie un nouveau tableau contenant une
copie des éléments découpés du tableau existant. La découpe commence avec l’élément à startIndex et se termine
avec l’élément juste avant endIndex. Il convient d’insister : l’élément à endIndex n’est pas compris dans la valeur
renvoyée.
L’exemple suivant utilise concat() et slice() pour créer des tableaux à l’aide d’éléments d’autres tableaux :
var array1:Array = ["alpha", "beta"];
var array2:Array = array1.concat("gamma", "delta");
trace(array2); // output: alpha,beta,gamma,delta
var array3:Array = array1.concat(array2);
trace(array3); // output: alpha,beta,alpha,beta,gamma,delta
var array4:Array = array3.slice(2,5);
trace(array4); // output: alpha,beta,gamma
Vous pouvez utiliser les méthodes join() et toString() pour interroger le tableau et renvoyer son contenu sous la
forme d’une chaîne. Si aucun paramètre n’est utilisé pour la méthode join(), les deux méthodes se comportent de
façon identique : elles renvoient une chaîne contenant une liste de tous les éléments du tableau, séparés par une virgule.
La méthode join(), contrairement à la méthode toString(), accepte un paramètre nommé delimiter, qui permet
de choisir le symbole à utiliser comme séparateur entre chaque élément de la chaîne renvoyée.
L’exemple suivant crée un tableau nommé rivers et appelle à la fois join() et toString() pour renvoyer les valeurs
dans le tableau sous la forme d’une chaîne. La méthode toString() est utilisée pour renvoyer des valeurs séparées par
une virgule (riverCSV), alors que la méthode join() est utilisée pour renvoyer des valeurs séparées par le caractère +.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];
var riverCSV:String = rivers.toString();
trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippi
var riverPSV:String = rivers.join("+");
trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 38
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Il existe un problème avec la méthode join() ; toutes les occurrences de tableau et de vecteur imbriquées sont toujours
renvoyées avec des valeurs séparées par des virgules, quel que soit le séparateur que vous spécifiez pour les éléments
de tableau principaux, comme illustré dans l’exemple suivant :
var nested:Array = ["b","c","d"];
var letters:Array = ["a",nested,"e"];
var joined:String = letters.join("+");
trace(joined); // output: a+b,c,d+e
Tableaux associatifs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Un tableau associatif, parfois appelé hachage ou mappage, utilise des clés plutôt qu’un index numérique pour organiser
des valeurs stockées. Chaque clé dans un tableau associatif est une chaîne unique qui est utilisée pour accéder à une
valeur stockée. Un tableau associatif est une occurrence de la classe Object, ce qui signifie que chaque clé correspond
à un nom de propriété. Les tableaux associatifs sont des collections non triées de paires de clés et de valeurs. Votre code
ne doit pas s’attendre à ce que les clés d’un tel tableau se présentent dans un ordre précis.
ActionScript 3.0 contient aussi un type avancé de tableau associatif appelé dictionnaire. Les dictionnaires, qui sont des
occurrences de la classe Dictionary dans le package flash.utils, utilisent des clés de tout type de données. En d’autres
termes, les clés de dictionnaire ne sont pas limitées à des valeurs de type String.
Tableaux associatifs avec clés de chaîne
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Deux méthodes permettent de créer des tableaux associatifs dans ActionScript 3.0. La première consiste à utiliser une
occurrence de Object. Celle-ci vous permet d’initialiser votre tableau avec un littéral d’objet. Une occurrence de la
classe Object, également appelée objet générique, fonctionne comme un tableau associatif. Chaque nom de propriété
de l’objet générique devient la clé qui permet d’accéder à une valeur stockée.
L’exemple suivant crée un tableau associatif appelé monitorInfo, à l’aide d’un littéral d’objet pour initialiser le tableau
avec deux paires de clés et de valeurs :
var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};
trace(monitorInfo["type"], monitorInfo["resolution"]);
// output: Flat Panel 1600 x 1200
Si vous n’avez pas besoin d’initialiser le tableau lors de la déclaration, vous pouvez utiliser le constructeur Object pour
créer le tableau, comme suit :
var monitorInfo:Object = new Object();
Une fois que le tableau est créé à l’aide d’un littéral d’objet ou du constructeur de la classe Object, vous pouvez lui
ajouter de nouvelles valeurs à l’aide de l’opérateur ([]) d’accès au tableau ou de l’opérateur point (.). L’exemple
suivant ajoute deux nouvelles valeurs à monitorArray :
monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spaces
monitorInfo.colors = "16.7 million";
trace(monitorInfo["aspect ratio"], monitorInfo.colors);
// output: 16:10 16.7 million
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 39
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
La clé appelée aspect ratio contient un caractère d’espace. Cela est possible dans le cas de l’opérateur ([]) d’accès
au tableau, mais avec l’opérateur point, une erreur se produit. L’utilisation d’espace dans le nom de vos clés n’est donc
pas conseillée.
La seconde méthode pour créer un tableau associatif consiste à utiliser le constructeur Array (ou le constructeur d’une
classe dynamique), puis à utiliser l’opérateur ([]) d’accès au tableau ou l’opérateur point (.) pour ajouter les paires de
clés et de valeurs au tableau. Si vous déclarez votre tableau associatif comme étant de type Array, vous ne pouvez pas
utiliser de littéral d’objet pour l’initialiser. Ce code crée un tableau associatif appelé monitorInfo à l’aide du
constructeur Array, et ajoute les clés appelées type et resolution, ainsi que leurs valeurs :
var monitorInfo:Array = new Array();
monitorInfo["type"] = "Flat Panel";
monitorInfo["resolution"] = "1600 x 1200";
trace(monitorInfo["type"], monitorInfo["resolution"]);
// output: Flat Panel 1600 x 1200
L’utilisation du constructeur Array pour créer un tableau associatif ne présente aucun avantage. Vous ne pouvez pas
utiliser la propriété Array.length ou une méthode de la classe Array avec des tableaux associatifs, même si vous
utilisez le constructeur Array ou le type de données Array. Il est préférable d’utiliser le constructeur Array pour créer
des tableaux indexés.
Tableaux associatifs avec clés d’objet (dictionnaires)
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser la classe Dictionary pour créer un tableau associatif qui utilise des objets pour les clés au lieu de
chaînes. Ces tableaux sont parfois appelés dictionnaires, hachages ou mappages. Par exemple, supposez que vous avez
une application qui détermine l’emplacement d’un objet Sprite selon son association avec un conteneur spécifique.
Vous pouvez utiliser un objet Dictionary pour mapper chaque objet Sprite à un conteneur.
Le code suivant crée trois occurrences de la classe Sprite qui servent de clés pour l’objet Dictionary. La valeur GroupA
ou GroupB est affectée à chaque clé. Les valeurs peuvent être de n’importe quel type de données, mais dans cet exemple,
GroupA et GroupB sont des occurrences de la classe Object. Vous pouvez ensuite accéder à la valeur associée à chaque
clé avec l’opérateur d’accès au tableau ([]), comme illustré dans le code suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 40
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
import flash.display.Sprite;
import flash.utils.Dictionary;
var groupMap:Dictionary = new Dictionary();
// objects to use as keys
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
// objects to use as values
var groupA:Object = new Object();
var groupB:Object = new Object();
// Create new key-value pairs in dictionary.
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupMap[spr1] == groupA)
{
trace("spr1 is in groupA");
}
if (groupMap[spr2] == groupB)
{
trace("spr2 is in groupB");
}
if (groupMap[spr3] == groupB)
{
trace("spr3 is in groupB");
}
Itération avec des clés d’objet
Vous pouvez parcourir en boucle le contenu d’un objet Dictionary à l’aide d’une boucle for..in ou d’une boucle for
each..in. Une boucle for..in vous permet d’effectuer une itération en fonction des clés, tandis qu’une boucle for
each..in vous permet d’effectuer une itération en fonction des valeurs associées à chaque clé.
Utilisez la boucle for..in pour accéder directement aux clés d’objet d’un objet Dictionary. Vous pouvez également
accéder aux valeurs de l’objet Dictionary avec l’opérateur d’accès au tableau ([]). Le code suivant utilise l’exemple
précédent du dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle
for..in :
for (var key:Object in groupMap)
{
trace(key, groupMap[key]);
}
/* output:
[object Sprite] [object Object]
[object Sprite] [object Object]
[object Sprite] [object Object]
*/
Utilisez la boucle for each..in pour accéder directement aux valeurs d’un objet Dictionary. Le code suivant utilise
également le dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle
for each..in :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 41
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
for each (var item:Object in groupMap)
{
trace(item);
}
/* output:
[object Object]
[object Object]
[object Object]
*/
Clés d’objet et gestion de la mémoire
Adobe® Flash® Player et Adobe® AIR™ utilisent un système de nettoyage permettant de récupérer la mémoire qui n’est
plus utilisée. Lorsque aucune référence ne pointe vers un objet, ce dernier peut être nettoyé et la mémoire récupérée
au prochain nettoyage. Par exemple, le code suivant crée un objet et lui affecte une référence à la variable myObject :
var myObject:Object = new Object();
Tant que des références à l’objet existent, le système de nettoyage ne récupère pas la mémoire que l’objet occupe. Si la
valeur de myObject est modifiée et qu’elle pointe vers un autre objet ou qu’elle est définie sur null, la mémoire
occupée par l’objet d’origine peut être nettoyée. Néanmoins, aucune autre référence à l’objet d’origine ne doit exister.
Si vous utilisez myObject comme clé dans un objet Dictionary, vous créez une autre référence à l’objet d’origine. Par
exemple, le code suivant crée deux références à un objet, la variable myObject et la clé dans l’objet myMap :
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary();
myMap[myObject] = "foo";
Pour que l’objet référencé par myObject puisse être nettoyé, vous devez supprimer toutes ses références. Dans ce cas,
vous devez modifier la valeur de myObject et supprimer la clé myObject de myMap, comme indiqué dans le code
suivant :
myObject = null;
delete myMap[myObject];
Vous pouvez également utiliser le paramètre useWeakReference du constructeur Dictionary pour que toutes les clés
de dictionnaire deviennent des références faibles. Le système de nettoyage ignore les références faibles. Par conséquent,
un objet n’ayant que des références faibles peut être nettoyé. Par exemple, dans le code suivant, vous n’avez pas besoin
de supprimer la clé myObject de myMap pour que l’objet puisse être nettoyé :
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] = "foo";
myObject = null; // Make object eligible for garbage collection.
Tableaux multidimensionnels
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les tableaux multidimensionnels contiennent d’autres tableaux comme éléments. Prenons par exemple une liste de
tâches stockée sous forme de tableau indexé de chaînes :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 42
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
var tasks:Array = ["wash dishes", "take out trash"];
Pour stocker une liste de tâches distincte pour chaque jour de la semaine, vous pouvez créer un tableau
multidimensionnel avec un élément pour chaque jour. Chaque élément contient à son tour un tableau indexé
(semblable au tableau tasks) qui stocke la liste des tâches. Vous pouvez utiliser n’importe quelle combinaison de
tableaux indexés ou associatifs dans des tableaux multidimensionnels. Les exemples des sections suivantes utilisent soit
deux tableaux indexés soit un tableau associatif de tableaux indexés. Vous pouvez essayer les autres combinaisons pour
vous exercer.
Deux tableaux indexés
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous utilisez deux tableaux indexés, vous pouvez visualiser le résultat sous forme de tableau ou de feuille de
calcul. Les éléments du premier tableau représentent les lignes alors que les éléments du second tableau représentent
les colonnes.
Par exemple, le tableau multidimensionnel suivant utilise deux tableaux indexés pour suivre des listes de tâches pour
chaque jour de la semaine. Le premier tableau, masterTaskList, est créé à l’aide du constructeur de classe Array.
Chaque élément du tableau représente un jour de la semaine, avec l’index 0 représentant lundi et l’index 6 dimanche.
Ces éléments peuvent être considérés comme les lignes du tableau. Vous pouvez créer la liste de tâches de chaque jour
en affectant un littéral de tableau à chacun des sept éléments que vous créez dans le tableau masterTaskList. Les
littéraux de tableau représentent les colonnes du tableau.
var masterTaskList:Array = new Array();
masterTaskList[0] = ["wash dishes", "take out trash"];
masterTaskList[1] = ["wash dishes", "pay bills"];
masterTaskList[2] = ["wash dishes", "dentist", "wash dog"];
masterTaskList[3] = ["wash dishes"];
masterTaskList[4] = ["wash dishes", "clean house"];
masterTaskList[5] = ["wash dishes", "wash car", "pay rent"];
masterTaskList[6] = ["mow lawn", "fix chair"];
Vous pouvez accéder à des éléments particuliers sur toute liste des tâches à l’aide de l’opérateur d’accès au tableau ([]).
Le premier groupe de crochets représente le jour de la semaine et le second la liste de tâches pour ce jour. Par exemple,
pour récupérer la seconde tâche de la liste du mercredi, utilisez d’abord l’index 2 pour mercredi puis utilisez l’index 1
pour la seconde tâche dans la liste.
trace(masterTaskList[2][1]); // output: dentist
Pour récupérer la première tâche de la liste du dimanche, utilisez l’index 6 pour dimanche et l’index 0 pour la première
tâche sur la liste.
trace(masterTaskList[6][0]); // output: mow lawn
Tableau associatif avec un tableau indexé
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Pour faciliter l’accès aux tableaux, vous pouvez utiliser un tableau associatif pour les jours de la semaine et un tableau
indexé pour les listes de tâche. Les tableaux associatifs vous permettent d’utiliser une syntaxe à point lorsque vous vous
référez à un jour particulier de la semaine, mais nécessitent un traitement d’exécution supplémentaire pour accéder à
chaque élément du tableau associatif. L’exemple suivant utilise un tableau associatif comme base d’une liste de tâches,
avec une paire de clés et de valeurs pour chaque jour de la semaine :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 43
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
var masterTaskList:Object = new Object();
masterTaskList["Monday"] = ["wash dishes", "take out trash"];
masterTaskList["Tuesday"] = ["wash dishes", "pay bills"];
masterTaskList["Wednesday"] = ["wash dishes", "dentist", "wash dog"];
masterTaskList["Thursday"] = ["wash dishes"];
masterTaskList["Friday"] = ["wash dishes", "clean house"];
masterTaskList["Saturday"] = ["wash dishes", "wash car", "pay rent"];
masterTaskList["Sunday"] = ["mow lawn", "fix chair"];
La syntaxe à point rend le code plus lisible car elle évite d’utiliser plusieurs groupes de crochets.
trace(masterTaskList.Wednesday[1]); // output: dentist
trace(masterTaskList.Sunday[0]);// output: mow lawn
Vous pouvez parcourir en boucle la liste des tâches en utilisant une boucle for..in, mais vous devez utiliser
l’opérateur d’accès au tableau ([]), en lieu et place de la syntaxe à point, pour accéder à la valeur associée à chaque clé.
Etant donné que masterTaskList est un tableau associatif, les éléments ne sont pas nécessairement récupérés dans
l’ordre que vous attendez, comme l’indique l’exemple suivant :
for (var day:String in masterTaskList)
{
trace(day + ": " + masterTaskList[day])
}
/* output:
Sunday: mow lawn,fix chair
Wednesday: wash dishes,dentist,wash dog
Friday: wash dishes,clean house
Thursday: wash dishes
Monday: wash dishes,take out trash
Saturday: wash dishes,wash car,pay rent
Tuesday: wash dishes,pay bills
*/
Clonage de tableaux
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Array ne possède aucune méthode intégrée pour effectuer des copies de tableaux. Vous pouvez créer une
copie simple d’un tableau en appelant la méthode concat() ou slice() sans arguments. Dans une copie simple, si le
tableau d’origine a des éléments qui sont des objets, seules les références aux objets sont copiées (et non les objets). La
copie pointe vers les mêmes objets que l’original. Tout changement effectué sur les objets apparaît dans les deux
tableaux.
Dans une copie en profondeur, les objets se trouvant dans le tableau d’origine sont copiés également de façon à ce que
le nouveau tableau ne pointe pas vers les mêmes objets que le tableau d’origine. La copie en profondeur exige plus
d’une ligne de code, ce qui nécessite généralement la création d’une fonction. Une telle fonction peut être créée comme
fonction d’utilitaire globale ou comme méthode d’une sous-classe Array.
L’exemple suivant définit une fonction appelée clone() qui effectue une copie en profondeur. L’algorithme est issu
d’une technique de programmation Java courante. La fonction crée une copie en profondeur en sérialisant le tableau
en une occurrence de la classe ByteArray puis en relisant le tableau dans un nouveau tableau. Cette fonction accepte
un objet de façon à ce qu’il puisse être utilisé à la fois avec des tableaux indexés et des tableaux associatifs, comme
indiqué dans le code suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 44
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
import flash.utils.ByteArray;
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
Extension de la classe Array
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Array est l’une des classes de base non finale, c’est-à-dire que vous pouvez créer votre sous-classe d’Array.
Cette section décrit comment créer une sous-classe d’Array et décrit les problèmes pouvant se poser pendant le
processus.
Comme mentionné précédemment, les tableaux dans ActionScript ne sont pas typés, mais vous pouvez créer une sousclasse
d’Array qui accepte des éléments d’un seul type de données. L’exemple fourni dans les sections suivantes définit
une sous-classe Array appelée TypedArray qui limite ses éléments à des valeurs du type de données indiqué dans le
premier paramètre. La classe TypedArray est présentée comme un exemple de la façon dont la classe Array est étendue
et risque de ne pas être adaptée à des fins de production pour différentes raisons. Premièrement, la vérification du type
a lieu lors de l’exécution plutôt que de la compilation. Deuxièmement, lorsqu’une méthode TypedArray rencontre une
incompatibilité, elle est ignorée et aucune exception n’est renvoyée, même si vous pouvez facilement modifier les
méthodes pour renvoyer des exceptions. Troisièmement, la classe ne peut pas empêcher l’utilisation de l’opérateur
d’accès au tableau pour insérer des valeurs de n’importe quel type dans le tableau. Quatrièmement, le style de codage
privilégie la simplicité par rapport à l’optimisation des performances.
Remarque : vous pouvez utiliser la technique décrite ici pour créer un tableau typé. Cependant, utiliser un objet Vector
constitue une meilleure démarche. Une occurrence de Vector est un véritable tableau typé. Elle dépasse la classe Array ou
toute sous-classe par ses performances et ses améliorations. Une illustration de la création d’une sous-classe Array
constitue l’objet de cette description.
Déclaration de la sous-classe
Utilisez le mot-clé extends pour indiquer qu’une classe est une sous-classe d’Array. Une sous-classe d’Array doit
utiliser l’attribut dynamic, comme la classe Array. Autrement, votre sous-classe ne fonctionne pas correctement.
Le code suivant représente la définition de la classe TypedArray, qui comporte une constante contenant le type de
données, une méthode de constructeur et les quatre méthodes permettant d’ajouter des éléments au tableau. Le code
pour chaque méthode est omis dans cet exemple, mais il est décrit de façon détaillée dans les sections qui suivent :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 45
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
public dynamic class TypedArray extends Array
{
private const dataType:Class;
public function TypedArray(...args) {}
AS3 override function concat(...args):Array {}
AS3 override function push(...args):uint {}
AS3 override function splice(...args) {}
AS3 override function unshift(...args):uint {}
}
Les quatre méthodes de remplacement utilisent l’espace de nom AS3 au lieu de l’attribut public car cet exemple
suppose que l’option -as3 du compilateur est définie sur true et l’option -es du compilateur sur false. Il s’agit des
paramètres par défaut pour Adobe Flash Builder et AdobeFlashProfessional.
Si vous êtes un développeur expérimenté et que vous préférez utiliser l’héritage de prototype, vous pouvez apporter
deux changements mineurs à la classe TypedArray afin qu’elle compile avec l’option -es du compilateur définie sur
true. Commencez par supprimer toutes les occurrences de l’attribut override et remplacez l’espace de nom AS3 par
l’attribut public. Remplacez ensuite Array.prototype pour les quatre occurrences de super.
Constructeur TypedArray
Le constructeur de sous-classe pose un défi intéressant car il doit accepter une liste d’arguments de longueur arbitraire.
Il s’agit de savoir comment transférer les arguments au superconstructeur pour créer le tableau. Si vous transmettez la
liste des arguments sous forme d’un tableau, le superconstructeur le considère comme un seul argument de type Array
et le tableau résultant a toujours une longueur d’1 élément. Le transfert de listes d’arguments se fait généralement au
moyen de la méthode Function.apply(), qui prend un tableau d’arguments comme second paramètre mais le
convertit en une liste d’arguments lors de l’exécution de la fonction. Malheureusement, vous ne pouvez pas utiliser la
méthode Function.apply() avec des constructeurs.
La seule solution est de recréer la logique du constructeur Array dans le constructeur TypedArray. Le code suivant
indique l’algorithme utilisé dans le constructeur de classe Array, que vous pouvez réutiliser dans votre constructeur de
sous-classe Array :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 46
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
public dynamic class Array
{
public function Array(...args)
{
var n:uint = args.length
if (n == 1 && (args[0] is Number))
{
var dlen:Number = args[0];
var ulen:uint = dlen;
if (ulen != dlen)
{
throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")");
}
length = ulen;
}
else
{
length = n;
for (var i:int=0; i < n; i++)
{
this[i] = args[i]
}
}
}
}
Le constructeur TypedArray partage une grande partie du code du constructeur Array, avec seulement quatre
changements apportés au code. Premièrement, la liste des paramètres comprend un nouveau paramètre obligatoire de
type Class qui permet d’indiquer le type de données du tableau. Deuxièmement, le type de données transmis au
constructeur est affecté à la variable dataType. Troisièmement, dans l’instruction else, la valeur de la propriété
length est affectée après la boucle for de façon à ce que length comprenne uniquement des arguments du type
correct. Quatrièmement, le corps de la boucle for utilise la version de remplacement de la méthode push() de façon
à ce que seuls des arguments du type de données correct soient ajoutés au tableau. L’exemple suivant présente la
fonction constructeur TypedArray :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 47
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
public dynamic class TypedArray extends Array
{
private var dataType:Class;
public function TypedArray(typeParam:Class, ...args)
{
dataType = typeParam;
var n:uint = args.length
if (n == 1 && (args[0] is Number))
{
var dlen:Number = args[0];
var ulen:uint = dlen
if (ulen != dlen)
{
throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")")
}
length = ulen;
}
else
{
for (var i:int=0; i < n; i++)
{
// type check done in push()
this.push(args[i])
}
length = this.length;
}
}
}
Méthodes de remplacement TypedArray
La classe TypedArray remplace les quatre méthodes de la classe Array qui permettent d’ajouter des éléments à un
tableau. Dans chaque cas, la méthode de remplacement ajoute une vérification du type qui empêche d’ajouter des
éléments qui ne sont pas du type de données correct. Chaque méthode appelle ensuite sa version de superclasse.
La méthode push() parcourt en boucle la liste des arguments avec une boucle for..in et effectue une vérification du
type sur chaque argument. Les arguments qui ne sont pas de type correct sont supprimés du tableau args avec la
méthode splice(). Une fois que la boucle for..in se termine, le tableau args contient des valeurs de type dataType
uniquement. La version de superclasse de push() est ensuite appelée avec le tableau args mis à jour, comme indiqué
dans le code suivant :
AS3 override function push(...args):uint
{
for (var i:* in args)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
return (super.push.apply(this, args));
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 48
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
La méthode concat() crée un TypedArray temporaire appelé passArgs pour stocker les arguments soumis à la
vérification de type. Ceci permet de réutiliser le code de vérification de type qui existe dans la méthode push(). Une
boucle for..in effectue une itération sur le tableau args et appelle push() sur chaque argument. Etant donné que
passArgs est typé sous la forme TypedArray, la version TypedArray de push() est exécutée. La méthode concat()
appelle ensuite sa version de superclasse, comme indiqué dans le code suivant :
AS3 override function concat(...args):Array
{
var passArgs:TypedArray = new TypedArray(dataType);
for (var i:* in args)
{
// type check done in push()
passArgs.push(args[i]);
}
return (super.concat.apply(this, passArgs));
}
La méthode splice() prend une liste d’arguments arbitraire, mais les deux premiers arguments se réfèrent toujours
à un numéro d’index et au nombre d’éléments à supprimer. C’est pourquoi la méthode de remplacement splice()
effectue la vérification de type uniquement pour les éléments du tableau args dans les positions d’index 2 ou
supérieures. Il est intéressant de noter que dans le code, il semble y avoir un appel récursif à splice() à l’intérieur de
la boucle for, mais en réalité, ce n’est pas le cas car args est de type Array et non de type TypedArray, ce qui signifie
que l’appel à args.splice() est un appel à la version de superclasse de la méthode. Une fois que la boucle for..in
se termine, le tableau args contient des valeurs du type correct uniquement dans les positions d’index 2 ou
supérieures, et splice() appelle sa version de superclasse, comme indiqué dans le code suivant :
AS3 override function splice(...args):*
{
if (args.length > 2)
{
for (var i:int=2; i< args.length; i++)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
}
return (super.splice.apply(this, args));
}
La méthode unshift(), qui ajoute des éléments au début d’un tableau, accepte une liste d’arguments arbitraire
également. La méthode de remplacement unshift() utilise un algorithme très semblable à celui utilisé par la méthode
push(), comme indiqué dans le code suivant :
AS3 override function unshift(...args):uint
{
for (var i:* in args)
{
if (!(args[i] is dataType))
{
args.splice(i,1);
}
}
return (super.unshift.apply(this, args));
}
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 49
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Exemple de tableau : PlayList
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’exemple PlayList présente les techniques d’utilisation des tableaux, dans le contexte d’une application de lecture
musicale qui gère une liste de chansons. Ces techniques sont les suivantes :
• Création d’un tableau indexé
• Ajout d’éléments à un tableau indexé
• Tri d’un tableau d’objets en fonction de différentes propriétés, à l’aide d’options de tri différentes
• Conversion d’un tableau en une chaîne séparée par des caractères
Pour obtenir les fichiers d’application de cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers d’application PlayList se trouvent dans le
dossier Samples/PlayList. L’application se compose des fichiers suivants :
Présentation de la classe PlayList
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe PlayList gère un ensemble d’objets Song. Elle a des méthodes publiques qui permettent d’ajouter une chanson
à la liste de lecture (la méthode addSong()) et de trier les chansons dans la liste (la méthode sortList()). En outre,
la classe comprend une propriété d’accesseur en lecture seule, songList, qui permet d’accéder au groupe de chansons
dans la liste de lecture. En interne, la classe PlayList conserve une trace de ses chansons à l’aide d’une variable Array
privée :
public class PlayList
{
private var _songs:Array;
private var _currentSort:SortProperty = null;
private var _needToSort:Boolean = false;
...
}
En plus de la variable Array _songs utilisée par la classe PlayList pour conserver une trace de sa liste de chansons, deux
autres variables privées vérifient si la liste doit être triée (_needToSort) et contrôlent la propriété sur laquelle est basé
le tri de la liste de chansons à un moment donné (_currentSort).
Fichier Description
PlayList.mxml
ou
PlayList.fla
Fichier d’application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/playlist/PlayList.as Classe représentant une liste de morceaux. Elle utilise un tableau
pour enregistrer la liste et gère le tri des éléments de la liste.
com/example/programmingas3/playlist/Song.as Objet de valeur représentant des informations sur une seule
chanson. Les éléments gérés par la classe PlayList sont des
occurrences Song.
com/example/programmingas3/playlist/SortProperty.as Pseudo-énumération dont les valeurs disponibles représentent
les propriétés de la classe Song en fonction desquelles une liste
d’objets Song peut être triée.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 50
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Comme avec tous les objets, lorsque vous avez déclaré une occurrence de Array, vous n’avez effectué que la moitié du
travail consistant à créer un tableau. Avant d’accéder à des méthodes ou à des propriétés d’une occurrence de Array,
cette dernière doit être instanciée dans le constructeur de la classe PlayList.
public function PlayList()
{
this._songs = new Array();
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
}
La première ligne du constructeur instancie la variable _songs pour qu’elle puisse être utilisée. En outre, la méthode
sortList() est appelée pour définir la propriété de tri initiale.
Ajout d’une chanson à la liste
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsqu’un utilisateur ajoute une nouvelle chanson dans l’application, le code dans le formulaire de saisie des données
appelle la méthode addSong() de la classe PlayList.
/**
* Adds a song to the playlist.
*/
public function addSong(song:Song):void
{
this._songs.push(song);
this._needToSort = true;
}
A l’intérieur de addSong(), la méthode push() du tableau _songs est appelée. Ceci permet d’ajouter l’objet Song
transmis à addSong() en tant que nouvel élément dans ce tableau. Avec la méthode push() , le nouvel élément est
ajouté à la fin du tableau, indépendamment du tri appliqué précédemment. Ceci signifie qu’une fois que la méthode
push() a été appelée, la liste des chansons risque de ne plus être triée correctement. Par conséquent, la variable
_needToSort est définie sur true. Théoriquement, la méthode sortList() pourrait être appelée immédiatement
afin d’éviter de vérifier si la liste est triée ou non à un moment donné. En pratique, cependant, la liste des chansons n’a
pas besoin d’être triée jusqu’au moment précédant immédiatement sa récupération. En retardant l’opération de tri,
l’application n’effectue pas de tri inutile si, par exemple, plusieurs chansons sont ajoutées à la liste avant sa
récupération.
Tri de la liste de chansons
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Etant donné que les occurrences Song gérées par la liste de lecture sont des objets complexes, les utilisateurs de
l’application peuvent trier la liste de lecture en fonction de différentes propriétés (titre de la chanson ou année de
publication, par exemple). Dans l’application PlayList, le tri de la liste des chansons s’effectue en trois étapes :
identification de la propriété sur laquelle est basé le tri de la liste, indication des options de tri à utiliser lors du tri en
fonction de cette propriété et exécution du tri.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 51
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Propriétés de tri
Un objet Song conserve la trace de plusieurs propriétés, notamment le titre de la chanson, l’artiste, l’année de
publication, le nom du fichier et un ensemble de genres sélectionné par l’utilisateur auquel la chanson appartient.
Seules les trois premières propriétés sont pratiques pour le tri. Dans un souci de commodité pour les développeurs,
l’exemple inclut la classe SortProperty, qui agit comme une énumération avec des valeurs représentant les propriétés
disponibles pour le tri.
public static const TITLE:SortProperty = new SortProperty("title");
public static const ARTIST:SortProperty = new SortProperty("artist");
public static const YEAR:SortProperty = new SortProperty("year");
La classe SortProperty contient trois classes, TITLE, ARTIST et YEAR. Chacune d’elles stocke une chaîne comportant le
nom de la propriété de la classe Song pouvant être utilisée pour le tri. Chaque fois qu’une propriété de tri est indiquée
dans le reste du code, le membre de l’énumération est utilisé. Par exemple, dans le constructeur PlayList, la liste est
triée initialement en appelant la méthode sortList(), comme suit :
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
Etant donné que la propriété de tri est spécifiée sous la forme SortProperty.TITLE, les chansons sont triées par titre.
Tri par propriété et définition d’options de tri
La classe PlayList trie la liste de chansons dans la méthode sortList(), comme suit :
/**
* Sorts the list of songs according to the specified property.
*/
public function sortList(sortProperty:SortProperty):void
{
...
var sortOptions:uint;
switch (sortProperty)
{
case SortProperty.TITLE:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.ARTIST:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.YEAR:
sortOptions = Array.NUMERIC;
break;
}
// Perform the actual sorting of the data.
this._songs.sortOn(sortProperty.propertyName, sortOptions);
// Save the current sort property.
this._currentSort = sortProperty;
// Record that the list is sorted.
this._needToSort = false;
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 52
Utilisation de tableaux
Dernière mise à jour le 27/4/2013
Lors du tri par titre ou par artiste, il est préférable d’effectuer un tri par ordre alphabétique. En revanche, lors du tri
par année, il est plus logique d’effectuer un tri numérique. L’instruction switch sert à définir l’option de tri appropriée,
stockée dans la variable sortOptions, en fonction de la valeur indiquée dans le paramètre sortProperty. Ici encore,
les membres de l’énumération nommés sont utilisés pour faire la différence entre les propriétés, plutôt que les valeurs
absolues.
Une fois que vous avez déterminé la propriété et les options de tri, le tableau _songs est trié en appelant sa méthode
sortOn(), en transmettant ces deux valeurs comme paramètres. La propriété de tri est enregistrée et la liste des
chansons est triée.
Combinaison d’éléments de tableau en une chaîne séparée par des caractères
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Cet exemple utilise non seulement un tableau pour conserver la liste des chansons dans la classe PlayList mais
également des tableaux dans la classe Song pour gérer la liste des genres auxquels une chanson appartient. Considérons
ce fragment de code issu de la définition de la classe Song :
private var _genres:String;
public function Song(title:String, artist:String, year:uint, filename:String, genres:Array)
{
...
// Genres are passed in as an array
// but stored as a semicolon-separated string.
this._genres = genres.join(";");
}
Lors de la création d’une occurrence de Song, le paramètre genres utilisé pour spécifier le genre (ou les genres) auquel
la chanson appartient est défini comme occurrence d’Array. Ainsi, vous pouvez regrouper plusieurs genres en une
seule variable qui peut être transmise au constructeur. Néanmoins, la classe Song conserve, en interne, les genres dans
la variable privée _genres sous la forme d’une occurrence de String séparée par des points-virgules. Le paramètre
Array est converti en une chaîne séparée par des points-virgules en appelant sa méthode join() avec la valeur de
chaîne littérale ";" comme séparateur spécifié.
De la même façon, les accesseurs genres permettent de définir ou de récupérer des genres sous la forme d’un tableau :
public function get genres():Array
{
// Genres are stored as a semicolon-separated String,
// so they need to be transformed into an Array to pass them back out.
return this._genres.split(";");
}
public function set genres(value:Array):void
{
// Genres are passed in as an array,
// but stored as a semicolon-separated string.
this._genres = value.join(";");
}
L’accesseur genresset se comporte exactement comme le constructeur ; il accepte un tableau et appelle la méthode
join() pour la convertir en une chaîne séparée par des points-virgules. L’accesseur get effectue l’opération inverse :
la méthode split() de la variable _genres est appelée. Elle divise la chaîne en un tableau de valeurs utilisant le
séparateur spécifié (la valeur de chaîne littérale ";" comme précédemment).
53
Dernière mise à jour le 27/4/2013
Chapitre 4 : Gestion des erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
« Gérer » une erreur signifie que vous intégrez des fonctions logiques à l’application pour réagir à une erreur ou la
corriger. Les erreurs sont générées lors de la compilation d’une application ou lors de l’exécution d’une application
compilée. Lorsque l’application gère les erreurs, il se produit une réaction à l’erreur. Il arrive en revanche qu’une erreur
soit ignorée (auquel cas le processus à l’origine de l’erreur échoue silencieusement). La gestion des erreurs, lorsqu’elle
est utilisée correctement, protège votre application et ses utilisateurs contre un comportement inattendu.
Cependant, la gestion des erreurs est une catégorie large qui englobe la réponse à de nombreux types d’erreurs générées
lors de la phase de compilation ou lors de l’exécution d’une application. Nous allons passer en revue la gestion des
erreurs d’exécution (renvoyées lors de l’exécution d’une application), les différents types d’erreurs générés et les
avantages du système de gestion des erreurs d’ActionScript 3.0.
Principes de base de la gestion des erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Une erreur d’exécution est une erreur qui se produit dans votre code ActionScript et qui empêche le contenu
ActionScript de s’exécuter comme prévu. Pour assurer l’exécution correcte du code ActionScript du point de vue de
l’utilisateur, écrivez le code dans l’application qui gère l’erreur (la corrige, la contourne ou informe au moins
l’utilisateur qu’elle a eu lieu). Ce processus est appelé gestion des erreurs.
La gestion des erreurs est une catégorie large qui englobe la réponse à de nombreux types d’erreurs générées lors de la
phase de compilation ou lors de l’exécution d’une application. Les erreurs qui se produisent lors de la compilation sont
souvent plus faciles à identifier. Corrigez-les pour terminer la création d’un fichier SWF.
Les erreurs d’exécution peuvent être difficiles à détecter car elles se produisent lorsque le code erroné est exécuté. Si
un segment de votre programme contient plusieurs branches de code, telle une instruction if..then..else, testez
toutes les conditions possibles, avec toutes les valeurs en entrée susceptibles d’être utilisées par un utilisateur réel, pour
confirmer que le code ne contient pas d’erreur.
Les erreurs d’exécution peuvent être divisées en deux catégories : les erreurs de programme sont des erreurs dans votre
code ActionScript (spécification du type de données incorrect pour un paramètre de méthode, par exemple) ; les
erreurs logiques sont des erreurs dans la logique (le contrôle des données et la manipulation des valeurs) de votre
programme (utilisation de la formule incorrecte pour calculer les taux d’intérêt dans une application bancaire, par
exemple). Encore une fois, ces deux types d’erreurs peuvent souvent être détectés et corrigés à l’avance en testant
attentivement votre application.
Il serait idéal d’identifier et de supprimer toutes les erreurs de votre application avant de la mettre à la disposition des
utilisateurs finaux. Cependant, toutes les erreurs ne peuvent pas être prévues ni évitées. Supposons, par exemple, que
l’application ActionScript charge des informations depuis un site Web particulier sur lequel vous n’avez aucun
contrôle. Si ce site Web n’est pas disponible, la partie de l’application qui dépend de ces données externes ne se
comporte pas correctement. L’aspect primordial de la gestion des erreurs consiste à anticiper ces cas de figure et à les
traiter judicieusement. Il est préférable que l’exécution de l’application ne soit pas interrompue ou, tout du moins,
qu’un message indique à l’utilisateur pourquoi elle ne fonctionne pas.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 54
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Les erreurs d’exécution sont représentées de deux façons dans ActionScript :
• Classes d’erreur : de nombreuses erreurs sont associées à une classe Error. Lorsqu’une erreur se produit, le moteur
d’exécution Flash (Flash Player ou Adobe AIR, par exemple) crée une occurrence de la classe Error spécifique
associée à cette erreur. Votre code peut utiliser les informations contenues dans cet objet erreur pour donner une
réponse appropriée à l’erreur.
• Evénements d’erreur : il arrive qu’une erreur se produise lorsque le moteur d’exécution Flash déclencherait
normalement un événement. Si tel est le cas, un événement d’erreur est alors déclenché. Chaque événement
d’erreur étant associé à une classe, le moteur d’exécution de Flash transmet une occurrence de cette classe aux
méthodes enregistrées auprès de l’événement d’erreur.
Pour déterminer si une méthode donnée peut déclencher une erreur ou un événement d’erreur, voir la rubrique
correspondante dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.
Concepts importants et terminologie
La liste de référence suivante contient des termes importants relatifs à la programmation de routines de gestion des
erreurs :
Asynchrone Commande de programme telle qu’un appel de méthode qui ne fournit pas un résultat immédiat, mais
qui produit un résultat (ou une erreur) sous la forme d’un événement.
Capture Lorsqu’une exception (une erreur d’exécution) se produit et que votre code la découvre, ce dernier la capture.
Lorsqu’une exception est capturée, le moteur d’exécution Flash cesse d’indiquer à un autre code ActionScript que
l’exception s’est produite.
Version de débogage Version spéciale du moteur d’exécution Flash, telle que la version de débogage de Flash Player
ou l’application de débogage du lanceur AIR (ADL), qui contient le code requis pour avertir les utilisateurs de la
présence d’erreurs d’exécution. Dans la version standard de Flash Player ou Adobe AIR (celle que possèdent la plupart
des utilisateurs), les erreurs qui ne sont pas gérées par votre code ActionScript sont ignorées. Dans les versions de
débogage (intégrées à Adobe Flash CS4 Professional et Adobe Flash Builder), un message d’avertissement apparaît
lorsqu’une erreur non gérée se produit.
Exception Erreur qui se produit lorsqu’une application est en cours d’exécution et que le moteur d’exécution Flash ne
peut pas la résoudre seul.
Renvoi Lorsque votre code capture une exception, le moteur d’exécution Flash cesse de signaler l’exception à d’autres
objets. S’il est important pour d’autres objets que l’exception leur soit signalée, le code doit renvoyer l’exception pour
recommencer le processus de notification.
Synchrone Commande de programme (un appel de méthode, par exemple) qui fournit un résultat immédiat (ou qui
renvoie immédiatement une erreur), ce qui signifie que la réponse peut être utilisée dans le même bloc de code.
Envoi Le fait de signaler au moteur d’exécution Flash (et par conséquent, à d’autres objets et au code ActionScript)
qu’une erreur s’est produite s’appelle envoyer une erreur.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 55
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Types d’erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous développez et exécutez des applications, vous rencontrez différents types d’erreurs et de termes. La liste
suivante présente les principaux termes et types d’erreurs :
• Erreurs de compilation : générées par le compilateur ActionScript lors de la compilation du code. Les erreurs de
compilation ont lieu lorsque des problèmes de syntaxe dans votre code empêchent de créer votre application.
• Erreurs d’exécution : générées lorsque vous exécutez votre application après l’avoir compilée. Les erreurs
d’exécution représentent des erreurs qui se produisent lors de la lecture d’un fichier SWF dans un moteur
d’exécution Flash tel qu’Adobe Flash Player ou Adobe AIR. Dans la plupart des cas, il est possible de gérer les
erreurs d’exécution au moment où elles se produisent, de les signaler à l’utilisateur et de prendre les mesures
requises pour poursuivre l’exécution de l’application. S’il s’agit d’une erreur grave (impossibilité de se connecter à
un site Web distant ou de charger des données), vous pouvez utiliser la gestion des erreurs pour mettre fin à
l’application en douceur.
• Erreurs synchrones : erreurs d’exécution générées lorsqu’une fonction est appelée. Par exemple, lorsque vous tentez
d’utiliser une méthode spécifique et que l’argument que vous lui transmettez n’est pas valide, le moteur d’exécution
de Flash renvoie une exception. La plupart des erreurs se produisent en mode synchrone (au moment de l’exécution
d’une instruction) et le flux de contrôle passe immédiatement à l’instruction catch la plus appropriée.
Par exemple, l’extrait de code suivant renvoie une erreur d’exécution, car la méthode browse() n’est pas appelée
avant que le programme ne tente de charger un fichier :
var fileRef:FileReference = new FileReference();
try
{
fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm"));
}
catch (error:IllegalOperationError)
{
trace(error);
// Error #2037: Functions called in incorrect sequence, or earlier
// call was unsuccessful.
}
Dans ce cas, une erreur d’exécution est renvoyée de façon synchrone car Flash Player a déterminé que la méthode
browse() n’a pas été appelée avant la tentative de chargement du fichier.
Pour obtenir des informations détaillées relatives à la gestion des erreurs synchrones, voir « Gestion des erreurs
synchrones dans une application » à la page 59.
• Les erreursasynchrones sont des erreurs du moteur d’exécution qui se produisent hors du flux normal du
programme. Elles génèrent des événements, interceptés par des écouteurs d’événement. Une opération asynchrone
est une opération dans laquelle une fonction lance une opération mais n’attend pas qu’elle se termine. Vous pouvez
créer un écouteur d’événements d’erreur pour attendre que l’application ou l’utilisateur tente une opération. Si cette
dernière échoue, vous interceptez l’erreur avec un écouteur d’événements et répondez à l’événement d’erreur.
Ensuite, l’écouteur d’événement appelle une fonction de gestionnaire d’événement pour répondre à l’événement
d’erreur avec pertinence. Par exemple, le gestionnaire d’événement peut lancer une boîte de dialogue qui invite
l’utilisateur à résoudre l’erreur.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 56
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Reprenez l’exemple d’erreur synchrone lors du chargement d’un fichier présenté précédemment. Si vous réussissez
à appeler la méthode browse() avant de lancer le chargement d’un fichier, Flash Player distribue plusieurs
événements. Par exemple, au démarrage d’un chargement, l’événement open est distribué. A la fin du chargement,
l’événement complete est distribué. Etant donné que la gestion d’événements est asynchrone (c’est-à-dire qu’elle
n’a pas lieu à des moments prédéfinis, connus et spécifiques), faites appel à la méthode addEventListener() pour
détecter ces événements spécifiques, comme l’indique le code suivant :
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.OPEN, openHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse();
function selectHandler(event:Event):void
{
trace("...select...");
var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm");
request.method = URLRequestMethod.POST;
event.target.upload(request);
}
function openHandler(event:Event):void
{
trace("...open...");
}
function completeHandler(event:Event):void
{
trace("...complete...");
}
Pour obtenir des informations détaillées sur la gestion des erreurs asynchrones, voir « Réponse à des événements
et à l’état d’erreur » à la page 65.
• Exceptions non interceptées : renvoyées sans logique correspondante (telle une instruction catch) pour y répondre.
Si votre application renvoie une erreur, et qu’aucune instruction catch ni gestionnaire d’événement approprié
n’est trouvé au niveau actuel ou supérieur pour gérer l’erreur, cette dernière est considérée comme une exception
non interceptée.
Lorsqu’il se produit une erreur non interceptée, le moteur d’exécution distribue un événement uncaughtError.
Cet événement porte également le nom de « gestionnaire d’erreur global ». Il est distribué par l’objet
UncaughtErrorEvents du fichier SWF et est proposé par la propriété LoaderInfo.uncaughtErrorEvents. Si
aucun écouteur n’est enregistré pour l’événement uncaughtError, le moteur d’exécution ignore les erreurs non
interceptées et tente de poursuivre son exécution, dès lors que l’erreur n’interrompt pas le fichier SWF.
Outre la distribution de l’événement uncaughtError, les versions de débogage du moteur d’exécution de Flash
répondent aux erreurs non interceptées en mettant fin au script actif. Elles affichent ensuite les erreurs non
interceptées dans le résultat de l’instruction trace ou écrivent le message d’erreur dans un fichier journal. Si l’objet
exception est une occurrence de la classe Error ou de l’une de ses sous-classes, les informations de trace de la pile
s’affichent également dans le résultat. Pour plus d’informations sur l’utilisation de la version de débogage des
moteurs d’exécution Flash, voir « Utilisation des versions de débogage des moteurs d’exécution Flash » à la page 58.
Remarque : lors du traitement d’un événement uncaughtError, si un événement d’erreur est renvoyé par un
gestionnaire uncaughtError, celui-ci est appelé plusieurs fois. Il se produit alors une boucle infinie d’exceptions. Il est
donc recommandé d’éviter ce type de scénario.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 57
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Gestion des erreurs dans ActionScript 3.0
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Etant donné que de nombreuses applications peuvent être exécutées sans créer de logique pour gérer les erreurs, les
développeurs sont tentés de retarder la création de la gestion des erreurs dans leurs applications. Néanmoins, sans
gestion des erreurs, une application risque de s’interrompre ou de poser des problèmes à l’utilisateur si elle ne
fonctionne pas comme prévu. ActionScript 2.0 possède une classe Error qui vous permet de créer une logique dans des
fonctions personnalisées afin de renvoyer une exception avec un message spécifique. Etant donné que la gestion des
erreurs est cruciale pour rendre une application conviviale, ActionScript 3.0 inclut une architecture étendue pour
intercepter les erreurs.
Remarque : bien que le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash passe en revue les
exceptions renvoyées par de nombreuses méthodes, il ne contient pas nécessairement toutes les exceptions associées à
chaque méthode. une méthode risque de renvoyer une exception due à une erreur de syntaxe ou d’autres problèmes qui
ne sont pas signalés explicitement dans la description de la méthode, même si cette dernière répertorie certaines exceptions
renvoyées.
Eléments de gestion des erreurs ActionScript 3.0
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript 3.0 comprend de nombreux outils permettant de gérer les erreurs, notamment :
• Classes Error : ActionScript 3.0 comprend un large éventail de classes Error destinées à multiplier le nombre de
situations susceptibles de produire des objets d’erreur. Chaque classe Error permet aux applications de gérer et de
répondre à des conditions d’erreur spécifiques, qu’elles soient liées à des erreurs système (comme une condition
MemoryError), à des erreurs de codage (comme une condition ArgumentError), à des erreurs de réseau et de
communication (comme une condition URIError), ou d’autres situations. Pour plus d’informations sur chaque
classe, voir « Comparaison des classes Error » à la page 68.
• Moins d’échecs silencieux : dans les versions précédentes de Flash Player, les erreurs étaient générées et signalées
uniquement si vous utilisiez explicitement l’instruction throw. Les méthodes et propriétés ActionScript natives
renvoient des erreurs d’exécution pour le moteur d’exécution de Flash Player 9 et des versions ultérieures de Flash.
Ces erreurs permettent de gérer les exceptions de manière plus efficace au moment où elles se produisent, puis de
réagir à chaque exception.
• Messages d’erreur clairs affichés lors du débogage : Lorsque vous utilisez la version de débogage d’un moteur
d’exécution de Flash, les situations ou le code à l’origine du problème génèrent des messages d’erreur détaillés qui
vous aident à identifier les raisons de l’échec d’un bloc de code particulier. Ces messages optimisent la résolution
des erreurs. Pour plus d’informations, voir « Utilisation des versions de débogage des moteurs d’exécution Flash »
à la page 58.
• Les erreurs précises permettent d’afficher des messages d’erreur clairs pour les utilisateurs. Dans les versions
précédentes de Flash Player, la méthode FileReference.upload() renvoyait la valeur booléenne false en cas
d’échec de l’appel upload(), indiquant l’une des cinq erreurs possibles. Si une erreur se produit lorsque vous
appelez la méthode upload() dans ActionScript 3.0, quatre erreurs spécifiques vous aident à afficher des messages
d’erreur plus précis à l’intention des utilisateurs finaux.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 58
Gestion des erreurs
Dernière mise à jour le 27/4/2013
• Gestion des erreurs affinée : des erreurs distinctes sont renvoyées pour de nombreuses situations courantes. Par
exemple, dans ActionScript 2.0, avant qu’un objet FileReference ne soit renseigné, la propriété name possède la
valeur null (par conséquent, avant d’utiliser ou d’afficher la propriété name, vérifiez qu’elle est définie sur une
valeur autre que null). Dans ActionScript 3.0, si vous tentez d’accéder à la propriété name avant qu’elle ne soit
renseignée, Flash Player ou AIR renvoie une erreur IllegalOperationError qui vous indique que la valeur n’a pas été
définie. Vous pouvez utiliser des blocs try..catch..finally pour gérer l’erreur. Pour plus d’informations, voir
« Utilisation des instructions try..catch..finally » à la page 59.
• Aucun problème sérieux de performance : l’utilisation de blocs try..catch..finally pour gérer des erreurs ne
nécessite pas ou peu de ressources supplémentaires par rapport aux versions précédentes d’ActionScript.
• Une classe ErrorEvent qui vous permet de créer des écouteurs pour des événements d’erreurs asynchrones
spécifiques : pour plus d’informations, voir « Réponse à des événements et à l’état d’erreur » à la page 65.
Stratégies de gestion des erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Tant que l’application ne rencontre pas de condition problématique, vous pouvez continuer à l’exécuter sans créer de
logique de gestion des erreurs dans le code. En revanche, si vous ne gérez pas d’erreurs de façon active et que votre
application rencontre un problème, vos utilisateurs ignoreront toujours la raison de son échec.
Vous pouvez aborder la gestion des erreurs de diverses façons dans votre application. La liste suivante résume les trois
principales options de gestion des erreurs :
• Utilisez les instructions try..catch..finally. Ces instructions interceptent les erreurs synchrones lorsqu’elles
se produisent. Vous pouvez imbriquer vos instructions dans une hiérarchie pour intercepter des exceptions à
différents niveaux d’exécution du code. Pour plus d’informations, voir « Utilisation des instructions
try..catch..finally » à la page 59.
• Créez des objets d’erreur personnalisés. Vous pouvez utiliser la classe Error pour créer des objets d’erreur
personnalisés afin de suivre des opérations spécifiques dans votre application qui ne sont pas couvertes par des
types d’erreur intégrés. Vous pouvez ensuite appliquer des instructions try..catch..finally aux objets d’erreur
personnalisés. Pour plus d’informations, voir « Création de classes d’erreur personnalisées » à la page 64.
• Ecrivez des gestionnaires et des écouteurs d’événement pour répondre à des événements d’erreur. Cette stratégie
permet de créer des gestionnaires d’erreurs globaux destinés à gérer des événements similaires sans dupliquer un
volume élevé de code dans les blocs try..catch..finally. Il est également plus probable que vous interceptiez
des erreurs asynchrones à l’aide de cette approche. Pour plus d’informations, voir « Réponse à des événements et à
l’état d’erreur » à la page 65.
Utilisation des versions de débogage des moteurs
d’exécution Flash
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Adobe propose aux développeurs des éditions spéciales des moteurs d’exécution Flash, destinées à les aider à exécuter
des opérations de débogage. Vous obtenez une copie de la version de débogage de Flash Player lorsque vous installez
Adobe Flash Professional ou Adobe Flash Builder. Vous disposez également d’un utilitaire de débogage des
applications Adobe AIR, appelé ADL, lorsque vous installez l’un de ces outils ou dans le cadre de l’installation du SDK
d’Adobe AIR.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 59
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Il existe une grande différence dans la façon dont les versions de débogage et les versions de Flash Player et Adobe AIR
mises sur le marché signalent les erreurs. Les versions de débogage indiquent le type d’erreur (Error, IOError ou
EOFError générique), le numéro de l’erreur et un message d’erreur sous une forme lisible par une personne. Les
versions mises sur le marché indiquent uniquement le type d’erreur et son numéro. Considérons par exemple le code
qui suit :
try
{
tf.text = myByteArray.readBoolean();
}
catch (error:EOFError)
{
tf.text = error.toString();
}
Si la méthode readBoolean() renvoie une erreur EOFError dans la version de débogage de Flash Player, le message
suivant s’affiche dans le champ de texte tf : « EOFError: Erreur #2030: Fin de fichier détectée ».
Dans une version commerciale de Flash Player ou d’Adobe AIR, le même code afficherait le texte suivant : « EOFError:
Erreur #2030 ».
Remarque : étant donné que les lecteurs de débogage diffusent l’événement « allComplete », évitez de créer des
événements personnalisés portant le nom « allComplete ». Vous risquez sinon de rencontrer un comportement
imprévisible lors du débogage.
Ce type de version ne comprend pas de chaîne de message d’erreur, afin de réduire au minimum la taille et les
ressources requises. Vous pouvez consulter le numéro d’erreur dans la documentation (annexes du manuel Guide de
référence ActionScript 3.0 pour la plate-forme Adobe Flash) pour l’associer à un message d’erreur. Vous pouvez
également reproduire l’erreur dans les versions de débogage de Flash Player et AIR pour visualiser le message entier.
Gestion des erreurs synchrones dans une application
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La gestion des erreurs la plus courante est la logique de gestion des erreurs synchrones, qui consiste à insérer des
instructions dans votre code pour intercepter les erreurs synchrones lors de l’exécution d’une application. Ce type de
gestion des erreurs permet à votre application de repérer des erreurs d’exécution et de les résoudre lorsque des
fonctions échouent. La logique d’interception d’une erreur synchrone fait appel aux instructions
try..catch..finally, qui tentent littéralement une opération, interceptent toute réponse à l’erreur émanant du
moteur d’exécution Flash, puis exécutent une autre opération pour gérer l’opération qui a échoué.
Utilisation des instructions try..catch..finally
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous manipulez des erreurs d’exécution synchrones, utilisez les instructions try..catch..finally pour
intercepter les erreurs. Lorsqu’une erreur d’exécution se produit, le moteur d’exécution Flash renvoie une exception,
ce qui signifie qu’il suspend l’exécution normale et crée un objet spécial de type Error. L’objet Error est ensuite renvoyé
au premier bloc catch disponible.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 60
Gestion des erreurs
Dernière mise à jour le 27/4/2013
L’instruction try regroupe les instructions pouvant créer des erreurs. Vous utilisez toujours l’instruction catch avec
une instruction try. Si une erreur est détectée dans l’une des instructions du bloc try, les instructions catch associées
à cette instruction try sont exécutées.
L’instruction finally regroupe les instructions exécutées, qu’une erreur se produise ou non dans le bloc try. S’il ne
se produit pas d’erreur, les instructions du bloc finally sont exécutées au terme de l’exécution des instructions du
bloc try. S’il se produit une erreur, l’instruction catch appropriée est exécutée en premier lieu, suivie des instructions
du bloc finally.
Le code suivant illustre la syntaxe d’utilisation des instructions try..catch..finally :
try
{
// some code that could throw an error
}
catch (err:Error)
{
// code to react to the error
}
finally
{
// Code that runs whether an error was thrown. This code can clean
// up after the error, or take steps to keep the application running.
}
Chaque instruction catch identifie un type d’exception spécifique qu’elle gère. L’instruction catch peut spécifier
uniquement des classes d’erreur qui sont des sous-classes de la classe Error. Chaque instruction catch est vérifiée dans
l’ordre. Seule la première instruction catch qui correspond au type d’erreur renvoyé est exécutée. En d’autres termes,
si vous vérifiez d’abord la classe Error de niveau supérieur, puis une sous-classe de la classe Error, seule la classe Error
de niveau supérieur est prise en compte. Le code suivant illustre ce point :
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:Error)
{
trace(" " + error.message);
}
catch (error:ArgumentError)
{
trace(" " + error.message);
}
Le code précédent affiche le résultat suivant :
I am an ArgumentError
Pour intercepter correctement l’erreur ArgumentError, assurez-vous que les types d’erreur les plus spécifiques sont
répertoriés en premier, suivis des types d’erreur plus génériques, comme l’indique le code suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 61
Gestion des erreurs
Dernière mise à jour le 27/4/2013
try
{
throw new ArgumentError("I am an ArgumentError");
}
catch (error:ArgumentError)
{
trace(" " + error.message);
}
catch (error:Error)
{
trace(" " + error.message);
}
Plusieurs méthodes et propriétés de l’API d’ActionScript renvoient des erreurs d’exécution si elles en rencontrent lors
de leur exécution. Par exemple, la méthode close() de la classe Sound renvoie une erreur IOError si la méthode ne
parvient pas à fermer le flux audio, comme indiqué dans le code suivant :
var mySound:Sound = new Sound();
try
{
mySound.close();
}
catch (error:IOError)
{
// Error #2029: This URLStream object does not have an open stream.
}
Au fur et à mesure que vous vous familiariserez avec le manuel Guide de référence ActionScript 3.0 pour la plate-forme
Adobe Flash, vous identifierez les méthodes qui renvoient des exceptions, comme indiqué dans la description de
chaque méthode.
Instruction throw
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les moteurs d’exécution Flash renvoient des exceptions s’ils rencontrent des erreurs lors de l’exécution de votre
application. En outre, vous pouvez renvoyer des exceptions de façon explicite à l’aide de l’instruction throw. Si tel est
le cas, Adobe vous conseille de renvoyer des occurrences de la classe Error ou de ses sous-classes. Le code suivant
illustre une instruction throw qui renvoie une occurrence de la classe Error, MyErr, et appelle une fonction,
myFunction() en réponse au renvoi de l’erreur :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 62
Gestion des erreurs
Dernière mise à jour le 27/4/2013
var MyError:Error = new Error("Encountered an error with the numUsers value", 99);
var numUsers:uint = 0;
try
{
if (numUsers == 0)
{
trace("numUsers equals 0");
}
}
catch (error:uint)
{
throw MyError; // Catch unsigned integer errors.
}
catch (error:int)
{
throw MyError; // Catch integer errors.
}
catch (error:Number)
{
throw MyError; // Catch number errors.
}
catch (error:*)
{
throw MyError; // Catch any other error.
}
finally
{
myFunction(); // Perform any necessary cleanup here.
}
Les instructions catch sont classées de façon à ce que les types de données les plus spécifiques apparaissent en premier.
Si l’instruction catch associée au type de données Number est répertoriée en premier, ni l’instruction catch associée
au type de données uint, ni l’instruction catch associée au type de données int n’est exécutée.
Remarque : dans le langage de programmation Java, chaque fonction qui peut renvoyer une exception doit le déclarer en
répertoriant les classes d’exception qu’elle peut renvoyer dans une clause throws associée à la déclaration de la fonction.
ActionScript ne requiert pas que vous déclariez les exceptions renvoyées par une fonction.
Affichage d’un message d’erreur simple
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’un des avantages majeurs du nouveau modèle d’événement d’erreur et d’exception consiste à permettre d’informer
les utilisateurs du moment où une action échoue et de la raison de cet échec. Votre rôle consiste à écrire le code pour
afficher le message et à offrir des options en réponse.
Le code suivant illustre une instruction try..catch simple permettant d’afficher l’erreur dans un champ de texte :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 63
Gestion des erreurs
Dernière mise à jour le 27/4/2013
package
{
import flash.display.Sprite;
import flash.text.TextField;
public class SimpleError extends Sprite
{
public var employee:XML =
12341-234;
public function SimpleError()
{
try
{
if (employee.costCenter.length() != 1)
{
throw new Error("Error, employee must have exactly one cost center assigned.");
}
}
catch (error:Error)
{
var errorMessage:TextField = new TextField();
errorMessage.autoSize = TextFieldAutoSize.LEFT;
errorMessage.textColor = 0xFF0000;
errorMessage.text = error.message;
addChild(errorMessage);
}
}
}
}
En utilisant un plus grand nombre de classes d’erreur et d’erreurs de compilateur intégrées, ActionScript 3.0 fournit
de plus amples informations sur les raisons de l’échec d’une action que les versions précédentes. Ces informations
permettent de créer des applications plus stables qui gèrent mieux les erreurs.
Renvoi des erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous créez une application, vous êtes parfois amené à renvoyer une erreur si vous ne parvenez pas à la gérer
correctement. Par exemple, le code suivant illustre un bloc try..catch imbriqué, qui renvoie une erreur
ApplicationError personnalisée si le bloc catch imbriqué n’est pas capable de gérer l’erreur :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 64
Gestion des erreurs
Dernière mise à jour le 27/4/2013
try
{
try
{
trace("<< try >>");
throw new ApplicationError("some error which will be rethrown");
}
catch (error:ApplicationError)
{
trace("<< catch >> " + error);
trace("<< throw >>");
throw error;
}
catch (error:Error)
{
trace("<< Error >> " + error);
}
}
catch (error:ApplicationError)
{
trace("<< catch >> " + error);
}
Le résultat issu du fragment de code précédent serait le suivant :
<< try >>
<< catch >> ApplicationError: some error which will be rethrown
<< throw >>
<< catch >> ApplicationError: some error which will be rethrown
Le bloc try imbriqué renvoie une erreur ApplicationError personnalisée qui est interceptée par le bloc catch suivant.
Ce bloc catch imbriqué peut tenter de gérer l’erreur et, si la tentative échoue, renvoyer l’objet ApplicationError au
bloc try..catch.
Création de classes d’erreur personnalisées
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez étendre l’une des classes Error standard pour créer vos classes d’erreur spécialisées dans ActionScript.
Vous pouvez créer vos classes d’erreur pour les motifs suivants :
• Identifier des erreurs ou des groupes d’erreurs spécifiques uniques pour votre application.
Outre les erreurs interceptées par un moteur d’exécution de Flash, vous pouvez par exemple gérer différemment les
erreurs renvoyées par votre propre code. Vous pouvez créer une sous-classe de la classe Error pour suivre le
nouveau type de données d’erreur dans les blocs try..catch.
• Fournir des fonctionnalités d’affichage d’erreurs exceptionnelles pour les erreurs générées par votre application.
Par exemple, vous pouvez créer une méthode toString() qui formate vos messages d’erreur d’une certaine façon.
Vous pouvez également définir une méthode lookupErrorString() qui prend un code d’erreur et récupère le
message adéquat en fonction du langage que l’utilisateur préfère.
Une classe d’erreur spécialisée doit étendre la classe Error d’ActionScript de base. Voici un exemple de classe AppError
spécialisée qui étend la classe Error :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 65
Gestion des erreurs
Dernière mise à jour le 27/4/2013
public class AppError extends Error
{
public function AppError(message:String, errorID:int)
{
super(message, errorID);
}
}
L’exemple suivant illustre l’utilisation d’une classe AppError dans votre projet :
try
{
throw new AppError("Encountered Custom AppError", 29);
}
catch (error:AppError)
{
trace(error.errorID + ": " + error.message)
}
Remarque : si vous souhaitez remplacer la méthode Error.toString() dans votre sous-classe, fournissez-lui un
paramètre ...(rest). La spécification du langage ECMAScript sur laquelle est basé ActionScript 3.0 définit ainsi la
méthode Error.toString() et ActionScript 3.0 respecte cette définition à des fins de rétrocompatibilité. Par
conséquent, lorsque vous remplacez la méthode Error.toString(), veillez à ce que les paramètres se correspondent
exactement. Vous ne pouvez pas transmettre de paramètres à la méthode toString() lors de l’exécution, car ils sont
ignorés.
Réponse à des événements et à l’état d’erreur
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’une des améliorations majeures apportées à la gestion des erreurs dans ActionScript 3.0 est la prise en charge de la
gestion des événements d’erreur pour répondre à des erreurs asynchrones lors de l’exécution d’une application. (Pour
obtenir une définition des erreurs asynchrones, voir « Types d’erreurs » à la page 55).
Vous pouvez créer des écouteurs d’événement et des gestionnaires d’événements pour répondre aux événements
d’erreurs. De nombreuses classes distribuent des événements d’erreurs de la même façon que d’autres événements. Par
exemple, une occurrence de la classe XMLSocket distribue normalement trois types d’événements :Event.CLOSE,
Event.CONNECT et DataEvent.DATA. Néanmoins, lorsqu’un problème se produit, la classe XMLSocket peut distribuer
IOErrorEvent.IOError ou SecurityErrorEvent.SECURITY_ERROR. Pour plus d’informations sur les écouteurs et
les gestionnaires d’événement, voir « Gestion des événements » à la page 129.
Les événements d’erreurs peuvent être classés en deux catégories :
• Evénements d’erreurs qui étendent la classe ErrorEvent
La classe flash.events.ErrorEvent contient les propriétés et les méthodes permettant de gérer les erreurs d’exécution
liées à des opérations de réseau et de communication dans une application en cours d’exécution. Les classes
AsyncErrorEvent, IOErrorEvent et SecurityErrorEvent étendent la classe ErrorEvent. Si vous utilisez la version de
débogage d’un moteur d’exécution de Flash, une boîte de dialogue vous informe, lors de l’exécution, de la présence
d’événements d’erreurs sans fonctions d’écouteur rencontrés par le lecteur.
• Evénements d’erreurs basés sur le statut
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 66
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Les événements d’erreur basés sur le statut sont liés aux propriétés netStatus et status des classes de
communication et de réseau. Si un moteur d’exécution Flash rencontre un problème lors de la lecture ou de
l’écriture des données, la valeur des propriétés netStatus.info.level ou status.level (selon l’objet de classe
que vous utilisez) est définie sur la valeur "error". Vous répondez à cette erreur en vérifiant que la propriété level
contient la valeur "error" dans votre fonction de gestionnaire d’événement.
Utilisation d’événements d’erreurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe ErrorEvent et ses sous-classes contiennent des types d’erreurs destinés à gérer les erreurs distribuées par les
moteurs d’exécution Flash lorsqu’ils tentent de lire ou d’écrire des données.
L’exemple suivant utilise à la fois une instruction try..catch et des gestionnaires d’événement d’erreur pour afficher
toute erreur détectée lors de la tentative de lecture d’un fichier local. Vous pouvez ajouter un code de gestion plus
élaboré pour proposer des options à l’utilisateur ou gérer l’erreur automatiquement aux endroits indiqués par le
commentaire « your error-handling code here » :
package
{
import flash.display.Sprite;
import flash.errors.IOError;
import flash.events.IOErrorEvent;
import flash.events.TextEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class LinkEventExample extends Sprite
{
private var myMP3:Sound;
public function LinkEventExample()
{
myMP3 = new Sound();
var list:TextField = new TextField();
list.autoSize = TextFieldAutoSize.LEFT;
list.multiline = true;
list.htmlText = "Track 1 ";
list.htmlText += "Track 2 ";
addEventListener(TextEvent.LINK, linkHandler);
addChild(list);
}
private function playMP3(mp3:String):void
{
try
{
myMP3.load(new URLRequest(mp3));
myMP3.play();
}
catch (err:Error)
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 67
Gestion des erreurs
Dernière mise à jour le 27/4/2013
{
trace(err.message);
// your error-handling code here
}
myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
}
private function linkHandler(linkEvent:TextEvent):void
{
playMP3(linkEvent.text);
// your error-handling code here
}
private function errorHandler(errorEvent:IOErrorEvent):void
{
trace(errorEvent.text);
// your error-handling code here
}
}
}
Utilisation d’événements de changement de statut
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les moteurs d’exécution Flash changent dynamiquement la valeur des propriétés netStatus.info.level ou
status.level pour les classes qui prennent en charge la propriété level pendant qu’une application s’exécute. Les
classes qui ont la propriété netStatus.info.level sont NetConnection, NetStream et SharedObject. Les classes qui
ont la propriété status.level sont HTTPStatusEvent, Camera, Microphone et LocalConnection. Vous pouvez écrire
une fonction de gestionnaire pour répondre au changement de valeur level et suivre les erreurs de communication.
L’exemple suivant utilise une fonction netStatusHandler() pour tester la valeur de la propriété level. Si la
propriété level indique qu’une erreur a été rencontrée, le code suit le message « Video stream failed ».
package
{
import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
public class VideoExample extends Sprite
{
private var videoUrl:String = "Video.flv";
private var connection:NetConnection;
private var stream:NetStream;
public function VideoExample()
{
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
connection.connect(null);
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 68
Gestion des erreurs
Dernière mise à jour le 27/4/2013
private function netStatusHandler(event:NetStatusEvent):void
{
if (event.info.level == "error")
{
trace("Video stream failed")
}
else
{
connectStream();
}
}
private function securityErrorHandler(event:SecurityErrorEvent):void
{
trace("securityErrorHandler: " + event);
}
private function connectStream():void
{
var stream:NetStream = new NetStream(connection);
var video:Video = new Video();
video.attachNetStream(stream);
stream.play(videoUrl);
addChild(video);
}
}
}
Comparaison des classes Error
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript fournit de nombreuses classes Error prédéfinies. Vous pouvez toutefois faire appel aux mêmes classes
Error dans votre propre code. Il existe deux types principaux de classes Error dans ActionScript 3.0 : les classes Error
de base d’ActionScript et les classes Error du package flash.error. Le package flash.error contient des classes
supplémentaires permettant le débogage et le développement d’applications ActionScript 3.0.
Classes Error de base
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Parmi les classes Error de base figurent les classes Error, ArgumentError, EvalError, RangeError, ReferenceError,
SecurityError, SyntaxError, TypeError, URIError et VerifyError. Chacune de ces classes se trouve dans l’espace de
noms de niveau supérieur.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 69
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Nom de classe Description Remarques
Error La classe Error permet de renvoyer des exceptions et
correspond à la classe de base des autres classes
d’exception définies dans ECMAScript : EvalError,
RangeError, ReferenceError, SyntaxError, TypeError et
URIError.
La classe Error sert de classe de base à toutes les erreurs
d’exécution et est recommandée pour toutes les classes
d’erreur personnalisées.
ArgumentError La classe ArgumentError représente une erreur qui se
produit lorsque les valeurs de paramètre fournies lors
d’un appel de fonction ne correspondent pas aux
paramètres définis pour celle-ci.
Voici des exemples d’erreurs d’argument :
• Trop ou trop peu d’arguments sont fournis à une méthode.
• Un argument devait être membre d’une énumération, et cela
n’a pas été le cas.
EvalError Une exception EvalError est renvoyée si des
paramètres sont transmis au constructeur de la classe
Function ou si le code utilisateur appelle la fonction
eval().
Dans ActionScript 3.0, la prise en charge de la fonction eval()
a été supprimée et toute tentative d’utilisation de la fonction
entraîne le renvoi d’une erreur.
Les versions précédentes de Flash Player utilisaient la fonction
eval() pour accéder à des variables, des propriétés, des objets
ou des clips par nom.
RangeError Une exception RangeError est renvoyée si une valeur
numérique excède la plage acceptable.
Par exemple, une exception RangeError est renvoyée par la
classe Timer si un retard est négatif ou infini. Elle peut
également être renvoyée si vous tentez d’ajouter un objet
d’affichage à une profondeur non valide.
ReferenceError Une exception ReferenceError est renvoyée lorsque
vous tentez d’utiliser une référence à une propriété
non définie pour un objet scellé (non dynamique).
Les versions du compilateur ActionScript antérieures
à ActionScript 3.0 ne renvoyaient pas d’erreur lorsque
vous tentiez d’accéder à une propriété non
définie. ActionScript 3.0 renvoie toutefois
l’exception ReferenceError dans ce cas de figure.
Les exceptions pour des variables non définies pointent vers
des bogues éventuels afin d’améliorer la qualité du logiciel.
Cependant, si vous n’avez pas l’habitude d’initialiser les
variables, ce nouveau comportement d’ActionScript requiert
de vous quelques changements lorsque vous écrivez du code.
SecurityError L’exception SecurityError est renvoyée lorsqu’une
violation de sécurité se produit et que l’accès est
refusé.
Voici des exemples d’erreurs de sécurité :
• Un accès à une propriété ou un appel de méthode non
autorisé est effectué en franchissant les limites du sandbox
de sécurité.
• Il s’est produit une tentative d’accès à une URL non autorisée
par le sandbox de sécurité.
• Il s’est produit une tentative de connexion socket sur un port,
mais le fichier de régulation socket approprié n’était pas
présent.
• Il s’est produit une tentative d’accès à la caméra ou au
microphone de l’utilisateur et celui-ci a refusé l’accès au
périphérique.
SyntaxError Une exception SyntaxError est renvoyée lorsqu’il se
produit une erreur d’analyse dans votre code
ActionScript.
Une exception SyntaxError peut être renvoyée dans les cas
suivants :
• ActionScript renvoie des exceptions SyntaxError lorsque la
classe RegExp analyse une expression régulière non valide.
• ActionScript renvoie des exceptions SyntaxError lorsque la
classe XMLDocument analyse un code XML non valide.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 70
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Classes Error du package flash.error
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Le package flash.error contient des classes Error considérées comme parties intégrantes de l’API des moteurs
d’exécution de Flash. A l’encontre des classes Error décrites, le package flash.error communique les événements
d’erreurs propres aux moteurs d’exécution de Flash (tel Flash Player ou Adobe AIR).
TypeError L’exception TypeError est renvoyée lorsque le type
réel d’un opérande ne correspond pas au type prévu.
Une exception TypeError peut être renvoyée dans les cas
suivants :
• Un paramètre réel de fonction ou de méthode ne peut pas
être forcé à correspondre au type de paramètre formel.
• Une valeur est affectée à une variable et ne peut pas être
forcée à correspondre au type de la variable.
• Le côté droit de l’opérateur is ou instanceof n’est pas un
type valide.
• L’utilisation du mot clé super n’est pas valide.
• Une recherche de propriété donne lieu à plusieurs liaisons,
soit un résultat ambigu.
• Une méthode est appelée pour un objet incompatible. Par
exemple, une exception TypeError est renvoyée si une
méthode de la classe RegExp est « greffée » sur un objet
générique, puis appelée.
URIError L’exception URIError est renvoyée lorsque l’une des
fonctions de gestion URI globales est utilisée d’une
manière qui n’est pas compatible avec sa définition.
Une exception URIError peut être renvoyée dans les cas
suivants :
Un URI non valide est défini par une fonction API de Flash Player
qui s’attend à un URI valide, comme Socket.connect().
VerifyError Une erreur VerifyError est renvoyée lorsqu’un fichier
SWF incorrect ou altéré est détecté.
Lorsqu’un fichier SWF charge un autre fichier SWF, le fichier
SWF parent peut intercepter une exception VerifyError générée
par le fichier SWF chargé.
Nom de classe Description Remarques
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 71
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Nom de classe Description Remarques
EOFError Une exception EOFError est émise lors d’une
tentative de lecture au-delà de la fin des données
disponibles.
Par exemple, une exception EOFError est émise
chaque fois qu’une méthode de lecture de l’interface
IDataInput est appelée et que les données sont
insuffisantes pour répondre à la requête de lecture.
IllegalOperationError Une exception IllegalOperationError est renvoyée
lorsqu’une méthode n’est pas implémentée ou si
l’implémentation ne couvre pas l’utilisation
actuelle.
Voici quelques exemples d’exceptions d’erreurs liées à
des opérations non valides :
• Une classe de base, telle que
DisplayObjectContainer, propose plus de
fonctionnalités qu’une scène ne peut prendre en
charge. Par exemple, si vous tentez d’obtenir ou de
définir un masque sur la scène (à l’aide de
stage.mask), le moteur d’exécution de Flash
renvoie une exception IllegalOperationError
accompagnée du message « La classe Stage
n’implémente ni cette propriété, ni cette méthode ».
• Une sous-classe hérite d’une méthode dont elle n’a
pas besoin et qu’elle ne souhaite pas prendre en
charge.
• Certaines méthodes d’accessibilité sont appelées
lorsque Flash Player est compilé sans les fonctions
d’accessibilité.
• Les fonctions réservées à la création sont appelées à
partir d’une version d’exécution de Flash Player.
• Vous tentez de définir le nom d’un objet placé sur le
scénario.
IOError Une exception IOError est renvoyée lorsqu’un type
d’exception E/S se produit.
Vous obtenez cette erreur, par exemple, lorsque vous
tentez une opération de lecture-écriture sur un socket
qui n’est pas connecté ou qui est déconnecté.
MemoryError Une exception MemoryError est renvoyée lors de
l’échec d’une requête d’allocation de mémoire.
Par défaut, ActionScript Virtual Machine 2 n’impose
pas de limite à la quantité de mémoire allouée par un
programme ActionScript. Sur un système de bureau,
les échecs d’allocation de mémoire sont rares. Une
erreur est renvoyée lorsque le système ne parvient pas
à allouer la mémoire requise pour une opération. Par
conséquent, sur un système de bureau, cette
exception est peu fréquente, à moins qu’une requête
d’allocation ne soit extrêmement importante (par
exemple, une requête de 3 milliards d’octets est
impossible, car un programme Microsoft® Windows®
de 32 bits peut accéder à 2 Go d’espace d’adressage
uniquement).
ScriptTimeoutError Une exception ScriptTimeoutError est renvoyée
lorsqu’un intervalle de délai d’expiration du script
de 15 secondes est atteint. En interceptant une
exception ScriptTimeoutError, vous pouvez gérer
le délai d’expiration du script plus en douceur. Si
aucun gestionnaire d’exception n’est défini, le
gestionnaire de l’exception non interceptée
affiche une boîte de dialogue contenant un
message d’erreur.
Pour éviter qu’un développeur n’intercepte
l’exception et reste dans une boucle sans fin, seule la
première exception ScriptTimeoutError renvoyée au
cours d’un script donné peut être interceptée. Le code
ne peut pas intercepter une exception
ScriptTimeoutError ultérieure. Elle passe donc
immédiatement au gestionnaire de l’exception non
interceptée.
StackOverflowError L’exception StackOverflowError est renvoyée
lorsque la pile disponible pour le script a été
épuisée.
Une exception StackOverflowError peut indiquer
qu’un problème de récursivité à l’infini s’est produit.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 72
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Exemple de gestion des erreurs : application
CustomErrors
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’application CustomErrors décrit les techniques d’utilisation des erreurs personnalisées lors de la création d’une
application. Ces techniques sont les suivantes :
• Validation d’un paquet XML
• Ecriture d’une erreur personnalisée
• Renvoi d’erreurs personnalisées
• Notification des utilisateurs lors du renvoi d’une erreur
Pour obtenir les fichiers d’application de cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers d’application CustomErrors se trouvent
dans le dossier Samples/CustomError. L’application se compose des fichiers suivants :
Présentation de l’application CustomErrors
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Au chargement de l’application, la méthode initApp() est appelée dans les applications Flex ou le code du scénario
(autre qu’une fonction) est exécuté dans les applications Flash Professional. Ce code définit un exemple de paquet
XML que la classe Validator vérifiera. Le code suivant est exécuté :
employeeXML =
JohnDoe1234567890;
}
Le paquet XML est ensuite affiché dans une occurrence du composant TextArea sur la scène. Cette étape permet de
modifier le paquet XML avant de tenter de le revalider.
Fichier Description
CustomErrors.mxml
ou
CustomErrors.fla
Fichier d’application principal en FLA pour Flash ou en MXML pour Flex
com/example/programmingas3/errors/ApplicationError.as Une classe servant de classe Error de base pour les classes FatalError et
WarningError.
com/example/programmingas3/errors/FatalError.as Une classe qui définit une erreur FatalError renvoyée par l’application.
Cette classe étend la classe ApplicationError personnalisée.
com/example/programmingas3/errors/Validator.as Une classe qui définit une seule méthode qui valide un paquet XML
employee fourni par l’utilisateur.
com/example/programmingas3/errors/WarningError.as Une classe qui définit une erreur WarningError renvoyée par
l’application. Cette classe étend la classe ApplicationError personnalisée.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 73
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Lorsque l’utilisateur clique sur le bouton de validation, la méthode validateData() est appelée. Cette méthode valide
le paquet XML employee à l’aide de la méthode validateEmployeeXML() de la classe Validator. Le code suivant
présente la méthode validateData() :
function validateData():void
{
try
{
var tempXML:XML = XML(xmlText.text);
Validator.validateEmployeeXML(tempXML);
status.text = "The XML was successfully validated.";
}
catch (error:FatalError)
{
showFatalError(error);
}
catch (error:WarningError)
{
showWarningError(error);
}
catch (error:Error)
{
showGenericError(error);
}
}
Un objet XML temporaire est d’abord créé à l’aide du contenu de l’occurrence du composant TextArea xmlText. La
méthode validateEmployeeXML() de la classe Validator personnalisée
(com.example.programmingas3/errors/Validator.as) est ensuite appelée et transmet l’objet XML temporaire comme
paramètre. Si le paquet XML est valide, l’occurrence du composant Label status affiche un message de réussite et
l’application se ferme. Si la méthode validateEmployeeXML() renvoie une erreur personnalisée (c’est-à-dire qu’une
erreur FatalError, WarningError ou une erreur générique se produit), l’instruction catch appropriée s’exécute et
appelle les méthodes showFatalError(), showWarningError() ou showGenericError(). Chacune de ces
méthodes affiche un message approprié dans une zone de texte appelée statusText pour avertir l’utilisateur de l’erreur
spécifique qui s’est produite. Chaque méthode met également à jour l’occurrence du composant Label status avec un
message spécifique.
Si une erreur grave se produit pendant une tentative de validation du paquet XML employee, le message d’erreur
s’affiche dans la zone de texte statusText et l’occurrence du composant TextArea xmlText et l’occurrence du
composant Button validateBtn sont désactivées, comme l’indique le code suivant :
function showFatalError(error:FatalError):void
{
var message:String = error.message + "\n\n";
var title:String = error.getTitle();
statusText.text = message + " " + title + "\n\nThis application has ended.";
this.xmlText.enabled = false;
this.validateBtn.enabled = false;
hideButtons();
}
S’il se produit une erreur d’avertissement au lieu d’une erreur grave, le message d’erreur est affiché dans l’occurrence
de TextArea statusText, mais les occurrences de composant TextField xmlText et Button ne sont pas désactivées. La
méthode showWarningError() affiche le message d’erreur personnalisé dans la zone de texte statusText. Le
message invite également l’utilisateur à indiquer s’il souhaite poursuivre la validation de l’objet XML ou annuler le
script. Le fragment de code suivant présente la méthode showWarningError() :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 74
Gestion des erreurs
Dernière mise à jour le 27/4/2013
function showWarningError(error:WarningError):void
{
var message:String = error.message + "\n\n" + "Do you want to exit this application?";
showButtons();
var title:String = error.getTitle();
statusText.text = message;
}
Lorsque l’utilisateur clique sur le bouton Oui ou Non, la méthode closeHandler() est appelée. Le fragment de code
suivant présente la méthode closeHandler() :
function closeHandler(event:CloseEvent):void
{
switch (event.detail)
{
case yesButton:
showFatalError(new FatalError(9999));
break;
case noButton:
statusText.text = "";
hideButtons();
break;
}
}
Si l’utilisateur souhaite annuler le script en cliquant sur Oui, une exception FatalError est renvoyée, provoquant l’arrêt
de l’application.
Création d’une validation personnalisée
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Validator personnalisée contient une seule méthode, validateEmployeeXML(). La méthode
validateEmployeeXML() gère un seul argument, employee, qui correspond au paquet XML à valider. La méthode
validateEmployeeXML() est la suivante :
public static function validateEmployeeXML(employee:XML):void
{
// checks for the integrity of items in the XML
if (employee.costCenter.length() < 1)
{
throw new FatalError(9000);
}
if (employee.costCenter.length() > 1)
{
throw new WarningError(9001);
}
if (employee.ssn.length() != 1)
{
throw new FatalError(9002);
}
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 75
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Un employé doit appartenir à un (et un seul) centre de coût pour être validé. S’il n’appartient à aucun centre de coût,
la méthode renvoie une erreur FatalError, qui se propage jusqu’à la méthode validateData() dans le fichier
d’application principale. Si l’employé appartient à plusieurs centres de coût, une erreur WarningError est renvoyée. La
dernière vérification de la validation XML contrôle que l’utilisateur possède un seul numéro de sécurité sociale défini
(le noeud ssn dans le paquet XML). S’il n’y a pas exactement un noeud ssn, une erreur FatalError est renvoyée.
Vous pouvez ajouter des vérifications supplémentaires à la méthode validateEmployeeXML() afin de vérifier, par
exemple, que le noeud ssn contient un numéro valide, ou que l’employé possède au moins un numéro de téléphone et
une adresse électronique, et que ces deux valeurs sont valides. Vous pouvez également modifier le XML de façon à ce
que chaque employé ait un ID unique et spécifie l’ID de son responsable.
Définition de la classe ApplicationError
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe ApplicationError sert de classe de base aux classes FatalError et WarningError. Elle étend la classe Error et
définit ses propres propriétés et méthodes personnalisées, y compris un ID d’erreur, la gravité et un objet XML
contenant les codes d’erreur personnalisés et les messages. Cette classe définit également deux constantes statiques
utilisées pour définir la gravité de chaque type d’erreur.
La méthode du constructeur de la classe ApplicationError est la suivante :
public function ApplicationError()
{
messages =
;
}
Chaque noeud d’erreur dans l’objet XML contient un code numérique unique et un message d’erreur. Vous pouvez
consulter facilement les messages d’erreur par code d’erreur à l’aide d’E4X, comme indiqué dans la méthode
getMessageText() suivante :
public function getMessageText(id:int):String
{
var message:XMLList = messages.error.(@code == id);
return message[0].text();
}
La méthode getMessageText() prend un seul argument entier, id, et renvoie une chaîne. L’argument id correspond
au code de l’erreur à rechercher. Par exemple, lorsque vous transmettez un id de 9001, l’erreur indiquant que les
employés doivent être affectés à un seul centre de coût est renvoyée. Si plusieurs erreurs ont le même code,
ActionScript renvoie le message d’erreur uniquement pour le premier résultat trouvé (message[0] dans l’objet
XMLList renvoyé).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 76
Gestion des erreurs
Dernière mise à jour le 27/4/2013
La méthode suivante de cette classe, getTitle(), ne prend aucun paramètre et renvoie une valeur de chaîne qui
contient l’ID de cette erreur spécifique. Cette valeur permet d’identifier aisément l’erreur exacte qui s’est produite lors
de la validation du paquet XML. Le fragment de code suivant présente la méthode getTitle() :
public function getTitle():String
{
return "Error #" + id;
}
La dernière méthode finale de la classe ApplicationError est toString(). Cette méthode remplace la fonction définie
dans la classe Error pour que vous puissiez personnaliser la présentation du message d’erreur. La méthode renvoie une
chaîne qui identifie le numéro d’erreur spécifique et le message qui s’est affiché.
public override function toString():String
{
return "[APPLICATION ERROR #" + id + "] " + message;
}
Définition de la classe FatalError
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe FatalError étend la classe ApplicationError personnalisée et définit trois méthodes : le constructeur
FatalError, getTitle() et toString(). La première méthode, le constructeur FatalError, prend un seul argument
entier, errorID, et définit la gravité de l’erreur à l’aide des valeurs de constante statiques définies dans la classe
ApplicationError. Elle obtient le message de l’erreur spécifique en appelant la méthode getMessageText() dans la
classe ApplicationError. Le constructeur FatalError se présente comme suit :
public function FatalError(errorID:int)
{
id = errorID;
severity = ApplicationError.FATAL;
message = getMessageText(errorID);
}
La méthode suivante de la classe FatalError, getTitle(), remplace la méthode getTitle() définie précédemment
dans la classe ApplicationError et ajoute le texte “-- FATAL” dans le titre pour informer l’utilisateur qu’une erreur
grave s’est produite. La méthode getTitle() se présente comme suit :
public override function getTitle():String
{
return "Error #" + id + " -- FATAL";
}
La méthode finale dans cette classe, toString(), remplace la méthode toString() définie dans la classe
ApplicationError. La méthode toString() est la suivante :
public override function toString():String
{
return "[FATAL ERROR #" + id + "] " + message;
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 77
Gestion des erreurs
Dernière mise à jour le 27/4/2013
Définition de la classe WarningError
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe WarningError étend la classe ApplicationError et est presque identique à la classe FatalError, à l’exception
de quelques changements de chaîne mineurs. Elle définit la gravité de l’erreur sur ApplicationError.WARNING au lieu
de ApplicationError.FATAL, comme indiqué dans le code suivant :
public function WarningError(errorID:int)
{
id = errorID;
severity = ApplicationError.WARNING;
message = super.getMessageText(errorID);
}
78
Dernière mise à jour le 27/4/2013
Chapitre 5 : Utilisation d’expressions
régulières
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Une expression régulière décrit un modèle servant à rechercher et à manipuler du texte de correspondance dans des
chaînes. Les expressions régulières ressemblent à des chaînes, mais elles comprennent des codes spéciaux pour décrire
des modèles et des répétitions. Par exemple, l’expression régulière suivante correspond à une chaîne qui commence
par le caractère A suivi d’un ou de plusieurs chiffres séquentiels :
/A\d+/
Les rubriques suivantes sont consacrées à la syntaxe de base de construction d’expressions régulières. Néanmoins, les
expressions régulières peuvent être très complexes et comporter de nombreuses nuances. Vous pouvez vous
documenter sur les expressions régulières sur le Web et dans les librairies. Différents environnements de
programmation implémentent des expressions régulières de différentes façons. ActionScript 3.0 implémente des
expressions régulières comme défini dans la version 3 de la spécification du langage ECMAScript (ECMA-262).
Voir aussi
RegExp
Principes de base des expressions régulières
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Une expression régulière décrit un modèle de caractères. Les expressions régulières servent généralement à vérifier
qu’une valeur de texte est conforme à un modèle particulier (par exemple, vérifier qu’un numéro de téléphone saisi par
l’utilisateur comporte le nombre de chiffres correct) ou à remplacer des portions d’une valeur de texte qui
correspondent à un modèle donné.
Les expressions régulières peuvent être simples. Par exemple, supposons que vous souhaitiez confirmer qu’une chaîne
particulière correspond à ABC ou que vous souhaitiez remplacer chaque occurrence d’ABC dans une chaîne par un
autre texte. Dans ce cas, vous pouvez utiliser l’expression régulière suivante qui définit le modèle comportant les lettres
A, B et C, dans l’ordre :
/ABC/
Le littéral de l’expression régulière est délimité avec la barre oblique (/).
Les modèles d’expression régulière peuvent également être complexes et parfois sembler obscures, comme l’expression
suivante pour établir une correspondance avec une adresse électronique valide :
/([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 79
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Vous utiliserez le plus souvent des expressions régulières pour rechercher des modèles dans des chaînes et pour
remplacer des caractères. Dans ces cas, vous créerez un objet d’expression régulière et l’utiliserez comme paramètre
pour une ou plusieurs méthodes de classe String. Les méthodes suivantes de la classe String prennent des expressions
régulières comme paramètres : match(), replace(), search() et split(). Pour plus d’informations sur ces
méthodes, voir « Recherche de modèles dans des chaînes et remplacement de sous-chaînes » à la page 17.
La classe RegExp comprend les méthodes suivantes : test() et exec(). Pour plus d’informations, voir « Méthodes
d’utilisation d’expressions régulières avec des chaînes » à la page 93.
Concepts importants et terminologie
La liste de référence suivante contient des termes importants relatifs à la fonctionnalité étudiée.
Caractère d’échappement Caractère indiquant que le caractère qui suit doit être considéré comme un caractère de
remplacement plutôt que comme un caractère littéral. Dans une syntaxe d’expression régulière, la barre oblique
inverse (\) est le caractère d’échappement. Par conséquent, une barre oblique inverse suivie d’un autre caractère est un
code spécial plutôt que le caractère à proprement parler.
Indicateur Caractère qui spécifie une option associée au mode d’utilisation du modèle d’expression régulière (respect
de la casse, par exemple).
Caractère de remplacement Caractère qui a une signification spéciale dans un modèle d’expression régulière et qui ne
représente pas littéralement ce caractère dans le modèle.
Quantificateur Caractères indiquant le nombre de répétitions d’une partie du modèle. Par exemple, un quantificateur
peut être utilisé pour indiquer qu’un code postal américain doit contenir cinq ou neuf chiffres.
Expression régulière Instruction de programme définissant un modèle de caractères qui permet de confirmer si
d’autres chaînes correspondent à ce modèle ou de remplacer des sections d’une chaîne.
Syntaxe d’expression régulière
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Cette section décrit tous les éléments de la syntaxe d’expression régulière d’ActionScript. Comme vous pourrez le
constater, les expressions régulières peuvent être très complexes et comporter de nombreuses nuances. Vous pouvez
vous documenter sur les expressions régulières sur le Web et dans les librairies. Différents environnements de
programmation implémentent des expressions régulières de différentes façons. ActionScript 3.0 implémente des
expressions régulières comme défini dans la version 3 de la spécification du langage ECMAScript (ECMA-262).
Généralement, vous utilisez des expressions régulières qui correspondent à des modèles plus compliqués qu’une
simple chaîne de caractères. Par exemple, l’expression régulière suivante définit le modèle comportant les lettres A, B
et C, dans l’ordre, suivies par un chiffre :
/ABC\d/
Le code \d représente un chiffre. La barre oblique inverse (\) est appelée caractère d’échappement. Lorsqu’elle est
combinée au caractère qui la suit (dans ce cas, la lettre d), elle a une signification spéciale dans l’expression régulière.
L’expression régulière suivante définit le modèle des lettres ABC suivies par des chiffres (remarquez l’astérisque) :
/ABC\d*/
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 80
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
L’astérisque (*) est un caractère de remplacement. Un caractère de remplacement est un caractère ayant une
signification spéciale dans les expressions régulières. L’astérisque est un type de caractère de remplacement spécifique
appelé quantificateur, utilisé pour quantifier le nombre de répétitions d’un caractère ou groupe de caractères. Pour
plus de détails, voir « Quantificateurs » à la page 85.
Outre son modèle, une expression régulière peut contenir des indicateurs qui spécifient comment l’expression
régulière doit être mise en correspondance. Par exemple, l’expression régulière suivante utilise l’indicateur i qui
indique qu’elle ignore le respect de la casse dans les chaînes de correspondance :
/ABC\d*/i
Pour plus d’informations, voir « Indicateurs et propriétés » à la page 89.
Vous pouvez utiliser des expressions régulières à l’aide des méthodes suivantes de la classe String : match(),
replace() et search(). Pour plus d’informations sur ces méthodes, voir « Recherche de modèles dans des chaînes et
remplacement de sous-chaînes » à la page 17.
Création d’une occurrence d’expression régulière
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Il existe deux façons de créer une occurrence d’expression régulière. L’une des méthodes consiste à utiliser des barres
obliques (/) pour délimiter l’expression régulière, et l’autre consiste à utiliser le constructeur new. Par exemple, les
expressions régulières suivantes sont équivalentes :
var pattern1:RegExp = /bob/i;
var pattern2:RegExp = new RegExp("bob", "i");
Des barres obliques délimitent un littéral d’expression régulière de la même façon que des guillemets délimitent un
littéral de chaîne. La partie de l’expression régulière contenue entre les barres obliques définit le modèle. L’expression
régulière peut également inclure des indicateurs après la barre de délimitation finale. Ces indicateurs sont considérés
comme faisant partie de l’expression régulière, mais ils sont séparés de son modèle.
Lorsque vous utilisez le constructeur new, vous utilisez deux chaînes pour définir l’expression régulière. La première
chaîne définit le modèle, et la seconde les indicateurs, comme dans l’exemple suivant :
var pattern2:RegExp = new RegExp("bob", "i");
Lorsque vous incluez une barre oblique dans une expression régulière qui est définie à l’aide de délimiteurs de barre
oblique, vous devez faire précéder la barre oblique du caractère d’échappement (\). Par exemple, l’expression régulière
suivante correspond au modèle 1/2 :
var pattern:RegExp = /1\/2/;
Pour inclure des guillemets dans une expression régulière définie avec le constructeur new, vous devez ajouter un
caractère d’échappement (\) avant les guillemets (comme lorsque vous définissez un littéral String). Par exemple, les
expressions régulières suivantes correspondent au modèle eat at "joe's" :
var pattern1:RegExp = new RegExp("eat at \"joe's\"", "");
var pattern2:RegExp = new RegExp('eat at "joe\'s"', "");
N’utilisez pas le caractère d’échappement avec des guillemets dans des expressions régulières définies à l’aide des
délimiteurs de barre oblique. De même, n’utilisez pas le caractère d’échappement avec des barres obliques dans des
expressions régulières définies avec le constructeur new. Les expressions régulières suivantes sont équivalentes. Elles
définissent le modèle 1/2 "joe's" :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 81
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
var pattern1:RegExp = /1\/2 "joe's"/;
var pattern2:RegExp = new RegExp("1/2 \"joe's\"", "");
var pattern3:RegExp = new RegExp('1/2 "joe\'s"', '');
De même, dans une expression régulière définie à l’aide du constructeur new, tapez deux fois le caractère barre oblique
inverse pour utiliser une métaséquence débutant par le caractère barre oblique inverse(\), telle que \d (qui correspond
à n’importe quel chiffre).
var pattern:RegExp = new RegExp("\\d+", ""); // matches one or more digits
Vous devez taper deux fois le caractère barre oblique inverse, car le premier paramètre de la méthode constructeur
RegExp() est une chaîne. Dans un littéral de chaîne, ce caractère doit être entré deux fois pour être interprété comme
une barre oblique inverse unique.
La section qui suit décrit la syntaxe servant à définir des modèles d’expression régulière.
Pour plus d’informations, voir « Indicateurs et propriétés » à la page 89.
Caractères, caractères de remplacement et métaséquences
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’expression régulière la plus simple est celle qui correspond à une séquence de caractères, comme dans l’exemple
suivant :
var pattern:RegExp = /hello/;
Néanmoins, les caractères suivants, appelés caractères de remplacement, ont des significations spéciales dans des
expressions régulières :
^ $ \ . * + ? ( ) [ ] { } |
Par exemple, l’expression régulière suivante correspond à la lettre A suivie par zéro ou plusieurs occurrences de la lettre
B (le caractère de remplacement astérisque indique cette répétition), suivie par la lettre C :
/AB*C/
Pour inclure un caractère de remplacement sans sa signification spéciale dans un modèle d’expression régulière, vous
devez utiliser le caractère d’échappement (\). Par exemple, l’expression régulière suivante correspond à la lettre A
suivie par la lettre B, suivie par un astérisque, suivie par la lettre C :
var pattern:RegExp = /AB\*C/;
Une métaséquence, comme un caractère de remplacement, a une signification spéciale dans une expression régulière.
Une métaséquence est constituée de plusieurs caractères. Les sections suivantes fournissent des détails sur l’utilisation
des caractères de remplacement et des métaséquences.
A propos des caractères de remplacement
Le tableau suivant répertorie les caractères de remplacement que vous pouvez utiliser dans des expressions régulières :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 82
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Caractère de remplacement Description
^ (caret) Etablit une correspondance au début d’une chaîne. Lorsque l’indicateur m (multiline) est défini, le caret
correspond au début d’une ligne également (voir « Indicateurs et propriétés » à la page 89). Lorsqu’il est
utilisé au début d’une classe de caractère, le caret indique la négation et non le début d’une chaîne. Pour
plus d’informations, voir « Classes de caractère » à la page 83.
$(signe dollar) Etablit une correspondance à la fin d’une chaîne. Lorsque l’indicateur m (multiline) est défini, $
correspond à la position avant une nouvelle ligne (\n) également. Pour plus d’informations, voir
« Indicateurs et propriétés » à la page 89.
\ (caractère d’échappement) Echappe la signification spéciale du caractère de remplacement des caractères spéciaux.
Vous pouvez également utiliser le caractère d’échappement si vous souhaitez utiliser une barre oblique
dans un littéral d’expression régulière, comme dans /1\/2/ (pour correspondre au caractère 1, suivi par la
barre oblique, suivi par le caractère 2).
. (point) Correspond à un seul caractère.
Un point correspond à un caractère de nouvelle ligne (\n) uniquement si l’indicateur s (dotall) est défini.
Pour plus d’informations, voir « Indicateurs et propriétés » à la page 89.
* (étoile) Correspond à l’élément précédent répété zéro ou plusieurs fois.
Pour plus de détails, voir « Quantificateurs » à la page 85.
+ (plus) Correspond à l’élément précédent répété une ou plusieurs fois.
Pour plus de détails, voir « Quantificateurs » à la page 85.
? (point d’interrogation) Correspond à l’élément précédent répété zéro ou une fois.
Pour plus de détails, voir « Quantificateurs » à la page 85.
( et ) Définit des groupes dans l’expression régulière. Utilisez des groupes pour :
• confiner le domaine du permutateur | : /(a|b|c)d/
• définir le domaine d’un quantificateur :/(walla.){1,2}/
• dans des backreferences. Par exemple, le \1 dans l’expression régulière suivante correspond à toute
correspondance au premier groupe entre parenthèses du modèle :
• /(\w*) est répété : \1/
Pour plus d’informations, voir « Groupes » à la page 87.
[ et ] Spécifie une classe de caractère qui définit des correspondances possibles pour un seul caractère :
/[aeiou]/ correspond à l’un des caractères spécifiés.
Dans les classes de caractère, utilisez le trait d’union (-) pour désigner une plage de caractères :
/[A-Z0-9]/ correspond aux lettres majuscules A à Z ou aux chiffres 0 à 9.
Dans les classes de caractère, insérez un caractère d’échappement pour échapper les caractères ] et
les caractères -:
/[+\-]\d+/ correspond à + ou à - avant un ou plusieurs chiffres.
Dans les classes de caractère, d’autres caractères (qui sont normalement des caractères de remplacement)
sont considérés comme des caractères normaux (et non comme des caractères de remplacement), sans
qu’une barre oblique inverse soit nécessaire :
/[$]/£ correspond à $ou à £.
Pour plus d’informations, voir « Classes de caractère » à la page 83.
| (opérateur de transfert de
données)
Utilisé pour la permutation, pour correspondre à la partie de gauche ou à celle de droite :
/abc|xyz/ correspond à abc ou à xyz.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 83
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
A propos des métaséquences
Les métaséquences sont des séquences de caractères ayant une signification spéciale dans un modèle d’expression
régulière. Le tableau suivant décrit ces métaséquences :
Classes de caractère
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous utilisez des classes de caractère pour spécifier une liste de caractères devant correspondre à une position dans
l’expression régulière. Vous définissez des classes de caractère avec des crochets ( [ et ] ). Par exemple, l’expression
régulière suivante définit une classe de caractère qui remplace bag, beg, big, bog ou bug :
/b[aeiou]g/
Métaséquence Description
{n}
{n,}
et
{n,n}
Indique un quantificateur numérique ou une plage de quantificateurs pour l’élément précédent :
/A{27}/ correspond au caractère A répété 27 fois.
/A{3}/ correspond au caractère A répété 3 fois ou plus.
/A{3,5}/ correspond au caractère A répété 3 à 5 fois.
Pour plus de détails, voir « Quantificateurs » à la page 85.
\b Etablit une correspondance à la position entre un caractère mot et un caractère non-mot. Si le premier ou le
dernier caractère dans la chaîne est un caractère mot, correspond également au début ou à la fin de la
chaîne.
\B Etablit une correspondance à la position entre deux caractères mot. Correspond également à la position
entre deux caractères non-mot.
\d Correspond à une décimale.
\D Correspond à tout caractère autre qu’un chiffre.
\f Correspond à un caractère de changement de page.
\n Correspond au caractère de nouvelle ligne.
\r Correspond au caractère de retour de chariot.
\s Correspond à tout caractère d’espace blanc (un espace, une tabulation, une nouvelle ligne ou un caractère
de retour de chariot).
\S Correspond à tout caractère autre qu’un caractère d’espace blanc.
\t Correspond au caractère de tabulation.
\unnnn Correspond au caractère Unicode avec le code de caractère spécifié par le nombre hexadécimal nnnn. Par
exemple, \u263a est le caractère smiley.
\v Correspond à un caractère d’avancement vertical.
\w Correspond à un caractère mot (AZ–, az–, 0-9 ou _). \w ne correspond pas aux caractères qui ne sont pas
anglais tels que é, ñ, ou ç.
\W Correspond à tout caractère autre qu’un caractère mot.
\\xnn Correspond au caractère avec la valeur ASCII spécifiée, comme défini par le nombre hexadécimal nn.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 84
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Séquences d’échappement dans des classes de caractère
La plupart des caractères de remplacement et des métaséquences ayant normalement des significations spéciales dans
une expression régulière n’ont pas ces mêmes significations dans une classe de caractère. Par exemple, dans une
expression régulière, l’astérisque est utilisé pour la répétition, mais ce n’est pas le cas lorsqu’il apparaît dans une classe
de caractère. La classe de caractère suivante correspond à l’astérisque de façon littérale, avec tout autre caractère
répertorié :
/[abc*123]/
Cependant, les trois caractères répertoriés dans le tableau suivant fonctionnent comme des caractères de
remplacement, avec une signification spéciale, dans des classes de caractère :
Pour que ces caractères soient reconnus comme caractères littéraux (dans la signification du caractère de
remplacement spéciale), vous devez faire précéder le caractère du caractère d’échappement. Par exemple, l’expression
régulière suivante inclut une classe de caractère qui correspond à l’un des quatre symboles ($, \, ] ou -) :
/[$\\\]\-]/
Outre les caractères de remplacement qui conservent leurs significations spéciales, les métaséquences suivantes
fonctionnent comme des métaséquences dans des classes de caractère :
D’autres caractères de remplacement et métaséquences d’expression régulière sont considérés comme des caractères
normaux dans une classe de caractère.
Plages de caractères dans des classes de caractère
Utilisez le trait d’union pour spécifier une plage de caractères telle que A-Z, a-z, ou 0-9. Ces caractères doivent
constituer une plage valide dans le jeu de caractères. Par exemple, la classe de caractère suivante correspond à un
caractère compris dans la plage a-z ou un chiffre :
/[a-z0-9]/
Vous pouvez également utiliser le code de caractère ASCII \\xnn pour spécifier une plage par valeur ASCII. Par
exemple, la classe de caractère suivante correspond à un caractère d’un jeu de caractères ASCII étendus (é et ê, par
exemple) :
\\x
Caractère de remplacement Signification dans des classes de caractère
] Définit la fin de la classe de caractère.
- Définit une plage de caractères (voir la section suivante, " Plages de caractères dans des classes de caractère
”).
\ Définit des métaséquences et annule la signification spéciale des caractères de remplacement.
Métaséquence Signification dans des classes de caractère
\n Correspond à un caractère de nouvelle ligne.
\r Correspond à un caractère de retour de chariot.
\t Correspond à un caractère de tabulation.
\unnnn Correspond au caractère avec la valeur de point de code Unicode spécifiée (comme défini par le nombre
hexadécimal nnnn).
\\xnn Correspond au caractère avec la valeur ASCII spécifiée (comme défini par le nombre hexadécimal nn).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 85
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Classes de caractère niées
Lorsque vous utilisez un caret (^) au début d’une classe de caractère, il la nie (tout caractère non répertorié est
considéré comme une correspondance). La classe de caractère suivante correspond à tout caractère sauf une lettre
minuscule (az–) ou un chiffre :
/[^a-z0-9]/
Vous devez taper le caret (^) au début d’une classe de caractère pour indiquer la négation. Autrement, vous ajoutez
simplement le caret aux caractères dans la classe de caractère. Par exemple, la classe de caractère suivante correspond
à un symbole (le caret, notamment) :
/[!.,#+*%$&^]/
Quantificateurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous utilisez des quantificateurs pour spécifier des répétitions de caractères ou de séquences dans des modèles, comme
suit :
Vous pouvez appliquer un quantificateur à un seul caractère, à une classe de caractère ou à un groupe :
• /a+/ correspond au caractère a répété une ou plusieurs fois.
• /\d+/ correspond à un ou plusieurs chiffres.
• /[abc]+/ correspond à une répétition d’un ou de plusieurs caractères, a, b, ou c.
• /(very, )*/ correspond au mot very suivi par une virgule et un espace répété zéro ou plusieurs fois.
Vous pouvez utiliser des quantificateurs dans des groupes de parenthèses auxquels sont appliqués des quantificateurs.
Par exemple, le quantificateur suivant correspond à des chaînes du type word et word-word-word :
/\w+(-\w+)*/
Par défaut, les expressions régulières effectuent un greedy matching. Tout sous-modèle dans l’expression régulière (.*,
par exemple) tente de mettre en correspondance autant de caractères que possible dans la chaîne avant de passer à la
partie suivante de l’expression régulière. Par exemple, considérez l’expression régulière et la chaîne suivantes :
var pattern:RegExp = /
.*<\/p>/;
str:String = "
Paragraph 1
Paragraph 2
";
L’expression régulière correspond à la chaîne entière :
Paragraph 1
Paragraph 2
Caractère de remplacement
de quantificateur
Description
* (étoile) Correspond à l’élément précédent répété zéro ou plusieurs fois.
+ (plus) Correspond à l’élément précédent répété une ou plusieurs fois.
? (point d’interrogation) Correspond à l’élément précédent répété zéro ou une fois.
{n}
{n,}
et
{n,n}
Indique un quantificateur numérique ou une plage de quantificateurs pour l’élément précédent :
/A{27}/ correspond au caractère A répété 27 fois.
/A{3}/ correspond au caractère A répété 3 fois ou plus.
/A{3,5}/ correspond au caractère A répété 3 à 5 fois.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 86
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Supposez, néanmoins, que vous souhaitez établir une correspondance avec un seul groupe
...
. Vous pouvez
procéder comme suit :
Paragraph 1
Ajoutez un point d’interrogation (?) après les quantificateurs pour qu’ils deviennent des quantificateurs paresseux. Par
exemple, l’expression régulière suivante, qui utilise le quantificateur paresseux *? , correspond à
suivi du nombre
minimum de caractères possible (paresseux), suivi de
:
/
.*?<\/p>/
Lisez attentivement les points suivants concernant les quantificateurs :
• Les quantificateurs {0} et {0,0} n’excluent pas un élément d’une correspondance.
• Ne combinez pas plusieurs quantificateurs, comme dans /abc+*/.
• Le caractère point (.) ne divise pas les lignes en deux à moins de définir l’indicateur s (dotall), même s’il est suivi
d’un quantificateur *. Considérons par exemple le code qui suit :
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*<\/p>/;
trace(str.match(re)); // null;
re = /
.*<\/p>/s;
trace(str.match(re));
// output:
Test
// Multiline
Pour plus d’informations, voir « Indicateurs et propriétés » à la page 89.
Permutation
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Utilisez le caractère | (barre) dans une expression régulière pour que son moteur tienne compte des autres possibilités
pour une correspondance. Par exemple, l’expression régulière suivante correspond à l’un des mots cat, dog, pig, rat :
var pattern:RegExp = /cat|dog|pig|rat/;
Vous pouvez utiliser des parenthèses pour définir des groupes et limiter le domaine du permutateur |. L’expression
régulière suivante correspond à cat suivi de nap ou nip :
var pattern:RegExp = /cat(nap|nip)/;
Pour plus d’informations, voir « Groupes » à la page 87.
Les deux expressions régulières suivantes (l’une utilisant le permutateur |, l’autre une classe de caractère (définie avec
[ et ] )) sont équivalentes :
/1|3|5|7|9/
/[13579]/
Pour plus d’informations, voir « Classes de caractère » à la page 83.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 87
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Groupes
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez spécifier un groupe dans une expression régulière en utilisant des parenthèses, comme suit :
/class-(\d*)/
Un groupe est une sous-section d’un modèle. Vous pouvez utiliser des groupes pour effectuer les opérations suivantes :
• Appliquer un quantificateur à plusieurs caractères
• Délimiter des sous-modèles à appliquer avec la permutation (à l’aide du caractère |)
• Capturer des correspondances de sous-chaîne (par exemple, en utilisant \1 dans une expression régulière pour
établir une correspondance avec un groupe mis en correspondance précédemment, ou en utilisant $1 de la même
façon dans la méthode replace() de la classe String)
Les sections suivantes fournissent des détails sur ces utilisations de groupes.
Utilisation de groupes avec des quantificateurs
Si vous n’utilisez pas de groupe, un quantificateur s’applique au caractère ou à la classe de caractère qui le précède,
comme indiqué ci-dessous :
var pattern:RegExp = /ab*/ ;
// matches the character a followed by
// zero or more occurrences of the character b
pattern = /a\d+/;
// matches the character a followed by
// one or more digits
pattern = /a[123]{1,3}/;
// matches the character a followed by
// one to three occurrences of either 1, 2, or 3
Néanmoins, vous pouvez utiliser un groupe pour appliquer un quantificateur à plusieurs caractères ou classes de
caractère :
var pattern:RegExp = /(ab)*/;
// matches zero or more occurrences of the character a
// followed by the character b, such as ababab
pattern = /(a\d)+/;
// matches one or more occurrences of the character a followed by
// a digit, such as a1a5a8a3
pattern = /(spam ){1,3}/;
// matches 1 to 3 occurrences of the word spam followed by a space
Pour plus d’informations sur les quantificateurs, voir « Quantificateurs » à la page 85.
Utilisation de groupes avec le permutateur (|)
Vous pouvez utiliser des groupes pour définir le groupe de caractères auquel vous souhaitez appliquer un permutateur
(|), comme suit :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 88
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
var pattern:RegExp = /cat|dog/;
// matches cat or dog
pattern = /ca(t|d)og/;
// matches catog or cadog
Utilisation de groupes pour capturer des correspondances de sous-chaîne
Lorsque vous définissez un groupe entre parenthèses standard dans un modèle, vous pouvez ensuite vous y référer
dans l’expression régulière. Il s’agit d’une backreference. Ces types de groupes sont appelés groupes capturés. Par
exemple, dans l’expression régulière suivante, la séquence \1 correspond à toute sous-chaîne mise en correspondance
avec le groupe entre parenthèses capturé :
var pattern:RegExp = /(\d+)-by-\1/;
// matches the following: 48-by-48
Vous pouvez spécifier jusqu’à 99 backreferences dans une expression régulière en tapant \1,\2,...,\99.
De même, dans la méthode replace() de la classe String, vous pouvez utiliser $1–$99 pour insérer des
correspondances de chaîne de groupe capturé dans la chaîne de remplacement :
var pattern:RegExp = /Hi, (\w+)\./;
var str:String = "Hi, Bob.";
trace(str.replace(pattern, "$1, hello."));
// output: Bob, hello.
Si vous utilisez des groupes capturés, la méthode exec() de la classe RegExp et la méthode match() de la classe String
renvoient des sous-chaînes qui correspondent aux groupes capturés :
var pattern:RegExp = /(\w+)@(\w+).(\w+)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example,com
Utilisation de groupes non capturés et de groupes d’anticipation
Un groupe non capturé est utilisé pour le regroupement uniquement ; il n’est pas collecté et il ne correspond pas à des
backreferences numérotées. Utilisez (?: et ) pour définir des groupes non capturés, comme suit :
var pattern = /(?:com|org|net);
Par exemple, notez la différence entre mettre (com|org) dans un groupe capturé et dans un groupe non capturé (la
méthode exec() répertorie les groupes capturés après la correspondance complète) :
var pattern:RegExp = /(\w+)@(\w+).(com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example,com
//noncapturing:
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/;
var str:String = "bob@example.com";
trace(pattern.exec(str));
// bob@example.com,bob,example
Un type spécial de groupe non capturé est le groupe d’animation dont il existe deux types : le groupe d’animation positif
et le groupe d’animation négatif.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 89
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Utilisez (?= et ) pour définir un groupe d’anticipation positif, qui spécifie que le sous-modèle dans le groupe doit
établir une correspondance à la position. Néanmoins, la portion de la chaîne qui correspond au groupe d’anticipation
positif peut correspondre aux modèles restants dans l’expression régulière. Par exemple, étant donné que (?=e) est
un groupe d’anticipation positif dans le code suivant, le caractère e auquel il correspond peut être mis en
correspondance par une partie suivante de l’expression régulière (dans ce cas, le groupe capturé, \w*) :
var pattern:RegExp = /sh(?=e)(\w*)/i;
var str:String = "Shelly sells seashells by the seashore";
trace(pattern.exec(str));
// Shelly,elly
Utilisez (?= et ) pour définir un groupe d’anticipation négatif, qui indique que le sous-modèle dans le groupe ne doit
pas établir une correspondance à la position. Exemple :
var pattern:RegExp = /sh(?!e)(\w*)/i;
var str:String = "She sells seashells by the seashore";
trace(pattern.exec(str));
// shore,ore
Utilisation de groupes nommés
Un groupe nommé est un type de groupe dans une expression régulière ayant un identificateur nommé. Utilisez
(?P et ) pour définir le groupe nommé. Par exemple, l’expression régulière suivante inclut un groupe nommé
avec l’identificateur nommé digits :
var pattern = /[a-z]+(?P\d+)[a-z]+/;
Lorsque vous utilisez la méthode exec(), un groupe nommé de correspondance est ajouté comme propriété du
tableau result :
var myPattern:RegExp = /([a-z]+)(?P\d+)[a-z]+/;
var str:String = "a123bcd";
var result:Array = myPattern.exec(str);
trace(result.digits); // 123
Voici un autre exemple, qui utilise deux groupes nommés, avec les identificateurs name et dom :
var emailPattern:RegExp =
/(?P(\w|[_.\-])+)@(?P((\w|-)+))+\.\w{2,4}+/;
var address:String = "bob@example.com";
var result:Array = emailPattern.exec(address);
trace(result.name); // bob
trace(result.dom); // example
Remarque : les groupes nommés ne font pas partie de la spécification du langage ECMAScript. Ils représentent une
fonction ajoutée dans ActionScript 3.0.
Indicateurs et propriétés
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Le tableau suivant répertorie les cinq indicateurs que vous pouvez définir pour des expressions régulières. Vous pouvez
accéder à chaque indicateur en tant que propriété de l’objet d’expression régulière.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 90
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Ces propriétés sont en lecture seule. Vous pouvez définir les indicateurs (g, i, m, s, x) lorsque vous définissez une
variable d’expression régulière, comme suit :
var re:RegExp = /abc/gimsx;
Cependant, vous ne pouvez pas définir directement les propriétés nommées. Par exemple, le code suivant génère une
erreur :
var re:RegExp = /abc/;
re.global = true; // This generates an error.
Par défaut, à moins de les spécifier dans la déclaration d’expression régulière, les indicateurs ne sont pas définis, et les
propriétés correspondantes sont également définies sur false.
De plus, il existe deux autres propriétés d’une expression régulière :
• La propriété lastIndex spécifie la position d’index dans la chaîne à utiliser pour l’appel suivant à la méthode
exec() ou test() d’une expression régulière.
• La propriété source spécifie la chaîne qui définit la portion de modèle de l’expression régulière.
L’indicateur g (global)
Lorsque l’indicateur g (global) n’est pas inclus, une expression régulière n’a pas plus d’une correspondance. Par
exemple, avec l’indicateur g exclu de l’expression régulière, la méthode String.match() renvoie une sous-chaîne de
correspondance uniquement :
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/;
trace(str.match(pattern)) // output: she
Lorsque l’indicateur g est défini, la méthode Sting.match() renvoie plusieurs correspondances, comme suit :
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/g;
// The same pattern, but this time the g flag IS set.
trace(str.match(pattern)); // output: she,shells,shore
L’indicateur i (ignoreCase)
Par défaut, les correspondances d’expression régulière sont sensibles à la casse. Lorsque vous définissez l’indicateur i
(ignoreCase), le respect de la casse est ignoré. Par exemple, la lettre minuscule s dans l’expression régulière ne
correspond pas à la lettre majuscule S, le premier caractère de la chaîne :
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/)); // output: 13 -- Not the first character
Indicateur Propriété Description
g global A plusieurs correspondances.
i ignoreCase Correspondance sensible à la casse. S’applique aux caractères A—Z et a—z mais pas à des caractères
étendus tels que É et é.
m multiline Lorsque cet indicateur est défini, $ et ^ peuvent correspondre au début d’une ligne et à la fin d’une ligne,
respectivement.
s dotall Lorsque cet indicateur est défini, . (point) peut correspondre au caractère de nouvelle ligne (\n).
x extended Autorise les expressions régulières étendues. Vous pouvez tapez des espaces dans l’expression
régulière. Ils sont ignorés dans le cadre du modèle. Ceci vous permet de taper un code d’expression
régulière de façon plus lisible.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 91
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
Lorsque l’indicateur i est défini, cependant, l’expression régulière correspond à la lettre majuscule S :
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/i)); // output: 0
L’indicateur i ignore le respect de la casse uniquement pour les caractères A–Z et a–z, mais par pour les caractères
étendus tels que É et é .
L’indicateur m (multiline)
Si l’indicateur m (multiline) n’est pas défini, le ^ correspond au début de la chaîne et le $ à sa fin. Si l’indicateur m est
défini, ces caractères correspondent au début d’une ligne et à la fin d’une ligne, respectivement. Considérez la chaîne
suivante, qui inclut un caractère de nouvelle ligne :
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.
Même si l’indicateur g (global) est défini dans l’expression régulière, la méthode match() correspond à une seule
sous-chaîne, car il n’existe qu’une seule correspondance pour le ^ (le début de la chaîne). Le résultat est le suivant :
Test
Voici le même code avec l’indicateur m défini :
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.
Cette fois, le résultat inclut les mots au début des deux lignes :
Test,Multiline
Seul le caractère \n signale la fin d’une ligne. Ce n’est pas le cas des caractères suivants :
• Retour de chariot (\r)
• Séparateur de ligne Unicode (\u2028)
• Séparateur de paragraphe Unicode (\u2028)
L’indicateur s (dotall)
Si l’indicateur s (dotall ou “dot all”) n’est pas défini, un point (.) dans un modèle d’expression régulière ne
correspond pas à un caractère de nouvelle ligne (\n). Par conséquent, il n’existe aucune correspondance pour
l’exemple suivant :
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*?<\/p>/;
trace(str.match(re));
Néanmoins, si l’indicateur s est défini, le point correspond au caractère de nouvelle ligne :
var str:String = "
Test\n";
str += "Multiline
";
var re:RegExp = /
.*?<\/p>/s;
trace(str.match(re));
Dans ce cas, la correspondance est la sous-chaîne entière dans les balises
, y compris le caractère de nouvelle ligne :
Test
Multiline
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 92
Utilisation d’expressions régulières
Dernière mise à jour le 27/4/2013
L’indicateur x (extended)
Les expressions régulières peuvent être difficiles à lire, notamment lorsqu’elles comprennent de nombreux
métasymboles et métaséquences. Exemple :
/
|(\s*[^>]*>)).*?<\/p>/gi
Lorsque vous utilisez l’indicateur x (extended) dans une expression régulière, les espaces vides que vous tapez dans le
modèle sont ignorés. Par exemple, l’expression régulière suivante est identique à l’exemple précédent :
/
)
Comme indiqué dans l’exemple suivant, vous pouvez également utiliser des accolades ( { et } ) pour transmettre des
données par référence (à partir d’autres variables) lorsque vous construisez des objets XML :
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("");
for (var i:int = 0; i < 3; i++)
{
var newnode:XML = new XML();
newnode =
{names[i][0]}{names[i][1]};
x = x.appendChild(newnode)
}
Vous pouvez affecter des propriétés et des attributs à un objet XML à l’aide de l’opérateur =, comme dans l’exemple
suivant :
var x:XML =
Smith
x.firstname = "Jean";
x.@id = "239";
Ceci définit l’objet XML x de la façon suivante :
SmithJean
Vous pouvez utiliser les opérateurs + et += pour concaténer des objets XMLList :
var x1:XML = test1
var x2:XML = test2
var xList:XMLList = x1 + x2;
xList += test3
Ceci définit l’objet XMLList xList de la façon suivante :
test1test2test3
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 110
Utilisation de XML
Dernière mise à jour le 27/4/2013
Parcours de structures XML
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’une des fonctions puissantes d’XML est sa capacité à fournir des données imbriquées, complexes, via une chaîne
linéaire de caractères de texte. Lorsque vous chargez des données dans un objet XML, ActionScript les analyse et charge
sa structure hiérarchique en mémoire (ou envoie une erreur d’exécution si les données XML ne sont pas formées
correctement).
Les opérateurs et les méthodes des objets XML et XMLList permettent de parcourir aisément la structure des données XML.
Utilisez l’opérateur point (.) et l’opérateur d’accesseur descendant (..) pour accéder aux propriétés enfant d’un objet
XML. Considérez l’objet XML suivant :
var myXML:XML =
Baking Extravagant Pastries with KumquatsContinoChuck238Emu Care and BreedingCaseJustin115
L’objet myXML.book est un objet XMLList contenant des propriétés enfant de l’objet myXML appelées book. Ces deux
objets XML correspondent aux deux propriétés book de l’objet myXML.
L’objet myXML..lastName est un objet XMLList contenant des propriétés descendantes appelées lastName. Ces deux
objets XML correspondent aux deux propriétés lastName de l’objet myXML.
L’objet myXML.book.editor.lastName est un objet XMLList contenant tout enfant appelé lastName des enfants
appelés editor des enfants appelés book de l’objet myXML : en l’occurrence, un objet XMLList contenant un seul objet
XML (la propriété lastName dont la valeur correspond à « Case »).
Accès aux noeuds enfant et parent
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La méthode parent() renvoie le parent d’un objet XML.
Vous pouvez utiliser les valeurs d’index ordinales d’une liste enfant pour accéder à des objets enfant spécifiques. Par
exemple, considérez un objet XML myXML ayant deux propriétés enfant appelées book. Chaque propriété enfant
appelée book possède un numéro d’index qui lui est associé :
myXML.book[0]
myXML.book[1]
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 111
Utilisation de XML
Dernière mise à jour le 27/4/2013
Pour accéder à un petit-enfant spécifique, vous pouvez indiquer des numéros d’index pour les noms de l’enfant et du
petit-enfant :
myXML.book[0].title[0]
Cependant, s’il n’existe qu’un seul enfant de x.book[0] nommé title, vous pouvez omettre la référence d’index,
comme suit :
myXML.book[0].title
De même, s’il n’existe qu’un seul enfant book de l’objet x et que cet objet enfant possède un seul objet title, vous pouvez
omettre les deux références d’index, de la façon suivante :
myXML.book.title
Vous pouvez utiliser la méthode child() pour accéder à des enfants dont le nom est basé sur une variable ou une
expression, comme indiqué dans l’exemple suivant :
var myXML:XML =
Dictionary;
var childName:String = "book";
trace(myXML.child(childName).title) // output: Dictionary
Accès à des attributs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Utilisez le symbole @ (l’opérateur identifiant d’attribut) pour accéder aux attributs dans un objet XML ou XMLList,
comme indiqué dans le code suivant :
var employee:XML =
WuErin;
trace(employee.@id); // 6401
Vous pouvez utiliser le symbole de caractère générique * avec le symbole @ pour accéder à tous les attributs d’un objet
XML ou XMLList, comme dans le code suivant :
var employee:XML =
WuErin;
trace(employee.@*.toXMLString());
// 6401
// 233
Vous pouvez utiliser la méthode attribute() ou attributes() pour accéder à un attribut spécifique ou à tous les
attributs d’un objet XML ou XMLList, comme dans le code suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 112
Utilisation de XML
Dernière mise à jour le 27/4/2013
var employee:XML =
WuErin;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString());
// 6401
// 233
trace(employee.attributes().toXMLString());
// 6401
// 233
Vous pouvez également utiliser la syntaxe suivante pour accéder à des attributs, comme indiqué dans l’exemple
suivant :
employee.attribute("id")
employee["@id"]
employee.@["id"]
Ils sont tous équivalents à employee.@id. Cependant, la syntaxe employee.@id est préférable.
Filtrage par attribut ou valeur d’élément
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez utiliser les opérateurs parenthèses— ( et ) —pour filtrer des éléments avec un nom d’élément spécifique
ou une valeur d’attribut. Considérez l’objet XML suivant :
var x:XML =
ZmedSueData analystMcGeeChuckJr. data analyst
Les expressions suivantes sont toutes valides :
• x.employee.(lastName == "McGee")—Il s’agit du deuxième noeud employee.
• x.employee.(lastName == "McGee").firstName—Il s’agit de la propriété firstName du deuxième noeud
employee.
• x.employee.(lastName == "McGee").@id—Il s’agit de la valeur de l’attribut id du deuxième noeud employee.
• x.employee.(@id == 347)—Le premier noeud employee.
• x.employee.(@id == 347).lastName—Il s’agit de la propriété lastName du premier noeud employee.
• x.employee.(@id > 300)—Il s’agit d’un XMLList avec deux propriétés employee.
• x.employee.(position.toString().search("analyst") > -1)—Il s’agit d’un XMLList avec deux propriétés
position.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 113
Utilisation de XML
Dernière mise à jour le 27/4/2013
Si vous tentez d’appliquer un filtre à des attributs ou des éléments qui n’existent pas, une exception est renvoyée. Par
exemple, la dernière ligne du code suivant génère une erreur car il n’existe aucun attribut id dans le deuxième élément p :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(@id == '123'));
De même, la dernière ligne du code suivant génère une erreur car il n’existe aucune propriété b du deuxième élément p :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(b == 'Bob'));
Pour éviter ces erreurs, vous pouvez identifier les propriétés ayant les éléments ou les attributs correspondants, à l’aide
des méthodes attribute() et elements(), comme dans le code suivant :
var doc:XML =
Hello, Bob.
Hello.
;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));
Vous pouvez également utiliser la méthode hasOwnProperty(), comme dans le code suivant :
var doc:XML =
Les premières lignes de la méthode effacent l’espace de noms xml par défaut :
default xml namespace = new Namespace();
La directive default xml namespace a un domaine de niveau bloc de fonction. Cela signifie que le domaine de cette
déclaration est la méthode buildItemHTML().
Les lignes qui suivent assemblent l’objet XMLList en fonction des arguments de chaîne transmis à la fonction :
var body:XMLList = new XMLList();
body += new XML("" + itemTitle + "");
var p:XML = new XML("
" + itemDescription + "
");
var link:XML = ;
link.@href = itemLink; //
link.font.@color = "#008000";
//
// 0x008000 = green
link.font = "More...";
p.appendChild( );
p.appendChild(link);
body += p;
Cet objet XMLList représente des données de chaîne adaptées à un champ de texte HTML d’ActionScript.
La méthode xmlLoaded() utilise la valeur de renvoi de la méthode buildItemHTML() et la convertit en une chaîne :
XML.prettyPrinting = false;
rssOutput = outXML.toXMLString();
Extraction du titre du flux RSS et envoi d’un événement personnalisé
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La méthode xmlLoaded() définit une variable de chaîne rssTitle en fonction des informations contenues dans les
données XML RSS source :
rssTitle = rssXML.channel.title.toString();
Pour finir, la méthode xmlLoaded() génère un événement qui notifie l’application que les données sont analysées et
disponibles :
dataWritten = new Event("dataWritten", true);
121
Dernière mise à jour le 27/4/2013
Chapitre 7 : Utilisation de la fonctionnalité
JSON native
ActionScript 3.0 fournit une API native permettant de coder et de décoder des objets ActionScript à l’aide du format
JavaScript Object Notation (JSON). La classe JSON et les fonctions membres associées suivent la spécification ECMA-
262 5e édition avec de légères variations.
Le membre de la communauté Todd Anderson fournit une comparaison entre l’API JSON native et la classe
JSON as3corelib tierce. Voir Working with Native JSON in Flash Player 11 (disponible en anglais uniquement).
Voir aussi
JSON
Présentation de l’API JSON
L’API JSON ActionScript est constituée de la classe JSON et des fonctions membres toJSON() sur quelques classes
natives. Pour les applications nécessitant un codage JSON personnalisé pour une classe, la structure ActionScript
propose diverses méthodes permettant de remplacer le codage par défaut.
La classe JSON gère en interne l’importation et l’exportation des classes ActionScript qui ne fournissent pas de
membre toJSON(). Dans ces cas, la classe JSON traverse les propriétés publiques de chaque objet qu’elle détecte. Si un
objet contient d’autres objets, JSON parcourt les objets imbriqués et effectue la même traversée. Si un objet fournit une
méthode toJSON(), JSON utilise cette méthode personnalisée plutôt que son algorithme interne.
L’interface JSON est composée d’une méthode d’encodage, stringify(), et d’une méthode de décodage, parse().
Chacune de ces méthodes fournit un paramètre permettant d’insérer votre propre logique dans la procédure de codage
et de décodage JSON. Pour stringify(), ce paramètre est appelé replacer ; pour parse(), il est appelé reviver.
Ces paramètres prennent une définition de fonction avec deux arguments à l’aide de la signature suivante :
function(k, v):*
Méthodes toJSON()
La signature des méthodes toJSON() est
public function toJSON(k:String):*
JSON.stringify() appelle la méthode toJSON(), si elle existe, pour chaque propriété publique qu’elle rencontre
lorsqu’elle traverse un objet. Une propriété consiste en une paire clé-valeur. Lorsque stringify() appelle la méthode
toJSON(), il transmet la clé, k, de la propriété qu’il examine actuellement. Une implémentation toJSON() standard
évalue chaque nom de propriété et renvoie l’encodage souhaité de sa valeur.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 122
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
La méthode toJSON() peut renvoyer tout type de valeur (identifiée à l’aide du signe *) et pas uniquement une chaîne.
Ce type de renvoi de variable permet à la méthode toJSON() de renvoyer un objet, le cas échéant. Par exemple, si une
propriété de votre classe personnalisée contient un objet issu d’une autre bibliothèque tierce, vous pouvez renvoyer cet
objet dès que la méthode toJSON() détecte votre propriété. JSON parcourt alors l’objet tiers. Le processus de codage
est le suivant :
• Si la méthode toJSON() renvoie un objet qui n’est pas évalué par rapport à une chaîne, stringify() parcourt cet
objet.
• Si la méthode toJSON() renvoie une chaîne, stringify() enveloppe la valeur dans une autre chaîne, renvoie la
chaîne enveloppée et passe à la valeur suivante.
Dans de nombreux cas, il est préférable de renvoyer un objet plutôt que de renvoyer une chaîne JSON créée par votre
application. Le renvoi d’un objet implique l’utilisation de l’algorithme de codage JSON et permet à JSON de se répéter
dans les objets imbriqués.
La méthode toJSON() n’est pas définie dans la classe Object ou dans la plupart des autres classes natives. Son absence
indique à JSON d’effectuer sa traversée standard sur les propriétés publiques de l’objet. Si vous préférez, vus pouvez
également utiliser la méthode toJSON() pour exposer les propriétés privées de votre objet.
Certaines classes natives posent néanmoins des problèmes que les bibliothèques ActionScript sont incapables de
résoudre efficacement dans tous les cas d’utilisation. Pour ces classes, ActionScript fournit une implémentation triviale
que le client peut à nouveau implémenter selon ses besoins. Les classes qui fournissent des membres toJSON() triviaux
sont les suivantes :
• ByteArray
• Date
• Dictionary
• XML
Vous pouvez intégrer la classe ByteArray dans une sous-classe pour remplacer sa méthode toJSON(), mais vous
pouvez aussi redéfinir son prototype. Les classes Date et XML, qui sont déclarées comme étant finales, vous obligent à
utiliser le prototype de classe pour redéfinir toJSON(). La classe Dictionary est déclarée comme étant dynamique, ce
qui vous donne la liberté de remplacer la méthode toJSON().
Définition du comportement JSON personnalisé
Vous disposez de plusieurs options pour implémenter vos propres codage et décodage JSON pour les classes natives :
• Définir ou remplacer toJSON() sur la sous-classe personnalisée d’une classe native non finale
• Définir et redéfinir toJSON() sur le prototype de la classe
• Définir une propriété toJSON sur une classe dynamique
• Utiliser les paramètres JSON.stringify() replacer et JSON.parser() reviver
Voir aussi
ECMA-262, 5e édition
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 123
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
Définition de la méthode toJSON() sur le prototype d’une classe intégrée
L’implémentation JSON native dans ActionScript imite le mécanisme JSON ECMAScript défini dans ECMA-262, 5e
édition. Etant donné qu’ECMAScript ne prend pas en charge les classes, ActionScript définit le comportement de
JSON en termes de distribution basée sur les prototypes. Ancêtres des classes ActionScript 3.0, les prototypes
permettent un héritage simulé, ainsi que les ajouts et redéfinitions de membres.
ActionScript permet de définir ou de redéfinir toJSON() sur le prototype d’une classe. Ce privilège s’étend aux classes
déclarées comme étant finales. Lorsque vous définissez toJSON() sur le prototype d’une classe, votre définition
s’applique à toutes les occurrences de cette classe dans le cadre de votre application. Par exemple, voici comment vous
pouvez définir une méthode toJSON() sur le prototype de la classe MovieClip :
MovieClip.prototype.toJSON = function(k):* {
trace("prototype.toJSON() called.");
return "toJSON";
}
Lorsque votre application appelle la méthode stringify() sur une occurrence de MovieClip, stringify()renvoie
le résultat de votre méthode toJSON() :
var mc:MovieClip = new MovieClip();
var js:String = JSON.stringify(mc); //"prototype toJSON() called."
trace("js: " + js); //"js: toJSON"
Vous pouvez en outre remplacer toJSON() dans les classes natives qui définissent cette méthode. Par exemple, le code
suivant remplace Date.toJSON() :
Date.prototype.toJSON = function (k):* {
return "any date format you like via toJSON: "+
"this.time:"+this.time + " this.hours:"+this.hours;
}
var dt:Date = new Date();
trace(JSON.stringify(dt));
// "any date format you like via toJSON: this.time:1317244361947 this.hours:14"
Définition ou remplacement de toJSON() au niveau de la classe
Les applications n’ont pas toujours besoin d’utiliser des prototypes pour redéfinir toJSON(). Il est également possible
de définir toJSON() en tant que membre d’une sous-classe si la classe parente n’est pas marquée comme finale. Vous
pouvez par exemple étendre la classe ByteArray et définir une fonction toJSON() publique :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 124
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
package {
import flash.utils.ByteArray;
public class MyByteArray extends ByteArray
{
public function MyByteArray() {
}
public function toJSON(s:String):*
{
return "MyByteArray";
}
}
}
var ba:ByteArray = new ByteArray();
trace(JSON.stringify(ba)); //"ByteArray"
var mba:MyByteArray = new MyByteArray(); //"MyByteArray"
trace(JSON.stringify(mba)); //"MyByteArray"
Si un classe est dynamique, il est possible d’ajouter une propriété toJSON à un objet de cette classe et de lui attribuer
une fonction de la façon suivante :
var d:Dictionary = new Dictionary();
trace(JSON.stringify((d))); // "Dictionary"
d.toJSON = function(){return {c : "toJSON override."};} // overrides existing function
trace(JSON.stringify((d))); // {"c":"toJSON override."}
Vous pouvez remplacer, définir ou redéfinir toJSON() sur n’importe quelle classe ActionScript. Néanmoins, la plupart
des classes ActionScript intégrées ne définissent pas toJSON(). La classe Object ne définit pas la méthode toJSON dans
son prototype par défaut ni ne la déclare en tant que membre de classe. Seule une poignée de classes natives définit la
méthode comme fonction prototype. C’est pourquoi, dans la plupart des cas, vous ne pouvez pas remplacer toJSON()
de façon traditionnelle.
Les classes natives qui ne définissent pas toJSON() sont sérialisées sur JSON par l’implémentation JSON interne. Dans
la mesure du possible, évitez de remplacer cette fonctionnalité intégrée. Si vous définissez un membre toJSON(), la
classe JSON utilise votre logique plutôt que sa propre fonctionnalité.
Utilisation du paramètre replacer de la méthode JSON.stringify()
Il peut être utile de remplacer toJSON() sur le prototype en vue de modifier le comportement d’exportation JSON
d’une classe dans une application. Néanmoins, votre logique d’exportation doit s’appliquer uniquement à des cas
spéciaux sous des conditions provisoires. Pour prendre en compte ces modifications à petite échelle, vous pouvez
utiliser le paramètre replacer de la méthode JSON.stringify().
La méthode stringify() applique la fonction transmise via le paramètre replacer à l’objet en cours de codage. La
signature pour cette fonction est similaire à celle de toJSON() :
function (k,v):*
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 125
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
Contrairement à la méthode toJSON(), la fonction replacer requiert la valeur v, ainsi que la clé k. Cette différence
est nécessaire, car la méthode stringify() est définie sur l’objet JSON statique et non sur l’objet en cours de codage.
Lorsque la méthode JSON.stringify() appelle replacer(k,v), elle traverse l’objet d’entrée d’origine. Le paramètre
implicite this transmis à la fonction replacer fait référence à l’objet qui détient la clé et la valeur. Etant donné que
la méthode JSON.stringify() ne modifie pas l’objet d’entrée d’origine, cet objet reste inchangé dans le conteneur
actuellement traversé. Vous pouvez par conséquent utiliser le code this[k] pour interroger la clé sur l’objet d’origine.
Le paramètre v renferme la valeur que toJSON() convertit.
Tout comme toJSON(), la fonction replacer peut renvoyer tout type de valeur. Si replacer renvoie une chaîne, le
moteur JSON convertit le contenu en séquence d’échappement entre guillemets et place ce contenu également entre
guillemets. Cette structure garantit que stringify() reçoive un objet de chaîne JSON valide qui reste une chaîne dans
un prochain appel de JSON.parse().
Le code suivant utilise le paramètre replacer et le paramètre this implicite pour renvoyer les valeurs time et hours
d’un objet Date :
JSON.stringify(d, function (k,v):* {
return "any date format you like via replacer: "+
"holder[k].time:"+this[k].time + " holder[k].hours:"+this[k].hours;
});
Utilisation du paramètre reviver de la méthode JSON.parse()
Le paramètre reviver de la méthode JSON.parse() est l’opposé de la fonction replacer : il convertit une chaîne
JSON en objet ActionScript utilisable. L’argument reviver est une fonction qui prend deux paramètres et renvoie tout
type :
function (k,v):*
Dans cette fonction, k est une clé et v est la valeur de k. Tout comme stringify(), parse() traverse les paires clévaleur
JSON et applique la fonctionreviver, si elle existe, à chaque paire. L’un des problèmes potentiels est que la
classe JSON ne renvoie pas le nom de classe ActionScript d’un objet. Il peut par conséquent être difficile de savoir quel
type d’objet ranimer. Ce problème peut en outre s’avérer particulièrement délicat lorsque les objets sont imbriqués. En
désignant les fonctions toJSON(), replacer et reviver, vous pouvez trouver des moyens d’identifier les objets
ActionScript exportés tout en gardant intacts les objets d’origine.
Exemple d’analyse
L’exemple suivant illustre une stratégie de ranimation d’objets analysés à partir de chaînes JSON. Cet exemple définit
deux classes : JSONGenericDictExample et JSONDictionaryExtnExample. La classe JSONGenericDictExample est
une classe Dictionary personnalisée. Chaque enregistrement contient le nom et la date de naissance d’une personne,
ainsi qu’un ID unique. Chaque fois que le constructeur JSONGenericDictExample est appelé, il ajoute l’objet
nouvellement créé à un tableau statique interne avec un entier augmentant statiquement comme son ID. La classe
JSONGenericDictExample définit également une méthode revive() qui extrait uniquement l’entier du membre id
le plus long. La méthode revive() utilise cet entier pour rechercher et renvoyer l’objet ranimable adéquat.
La classe JSONDictionaryExtnExample étend la classe Dictionary ActionScript. Ses enregistrements n’ont pas de
structure définie et peuvent contenir toutes sortes de données. Les données sont attribuées après la construction de
l’objet JSONDictionaryExtnExample et non par les propriétés définies dans la classe. Les enregistrements de
JSONDictionaryExtnExample utilisent les objets JSONGenericDictExample comme clés. Lorsqu’un objet
JSONDictionaryExtnExample est ranimé, la fonction JSONGenericDictExample.revive() utilise l’ID associé à
JSONDictionaryExtnExample pour récupérer l’objet de clé correct.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 126
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
Plus important encore, la méthode JSONDictionaryExtnExample.toJSON() renvoie une chaîne de marqueurs en
plus de l’objet JSONDictionaryExtnExample. Cette chaîne identifie la sortie JSON comme appartenant à la classe
JSONDictionaryExtnExample. Ce marqueur indique clairement le type d’objet en cours de traitement lors de
l’exécution de JSON.parse().
package {
// Generic dictionary example:
public class JSONGenericDictExample {
static var revivableObjects = [];
static var nextId = 10000;
public var id;
public var dname:String;
public var birthday;
public function JSONGenericDictExample(name, birthday) {
revivableObjects[nextId] = this;
this.id = "id_class_JSONGenericDictExample_" + nextId;
this.dname = name;
this.birthday = birthday;
nextId++;
}
public function toString():String { return this.dname; }
public static function revive(id:String):JSONGenericDictExample {
var r:RegExp = /^id_class_JSONGenericDictExample_([0-9]*)$/;
var res = r.exec(id);
return JSONGenericDictExample.revivableObjects[res[1]];
}
}
}
package {
import flash.utils.Dictionary;
import flash.utils.ByteArray;
// For this extension of dictionary, we serialize the contents of the
// dictionary by using toJSON
public final class JSONDictionaryExtnExample extends Dictionary {
public function toJSON(k):* {
var contents = {};
for (var a in this) {
contents[a.id] = this[a];
}
// We also wrap the contents in an object so that we can
// identify it by looking for the marking property "class E"
// while in the midst of JSON.parse.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 127
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
return {"class JSONDictionaryExtnExample": contents};
}
// This is just here for debugging and for illustration
public function toString():String {
var retval = "[JSONDictionaryExtnExample <";
var printed_any = false;
for (var k in this) {
retval += k.toString() + "=" +
"[e="+this[k].earnings +
",v="+this[k].violations + "], "
printed_any = true;
}
if (printed_any)
retval = retval.substring(0, retval.length-2);
retval += ">]"
return retval;
}
}
}
Lorsque le script d’exécution suivant appelle JSON.parse() sur un objet JSONDictionaryExtnExample, la fonction
reviver appelle JSONGenericDictExample.revive() sur chaque objet dans JSONDictionaryExtnExample. Cet
appel extrait l’ID qui représente la clé de l’objet. La fonction JSONGenericDictExample.revive() utilise cet ID pour
récupérer et renvoyer l’objet JSONDictionaryExtnExample stocké à partir d’un tableau statique privé.
import flash.display.MovieClip;
import flash.text.TextField;
var a_bob1:JSONGenericDictExample = new JSONGenericDictExample("Bob", new
Date(Date.parse("01/02/1934")));
var a_bob2:JSONGenericDictExample = new JSONGenericDictExample("Bob", new
Date(Date.parse("05/06/1978")));
var a_jen:JSONGenericDictExample = new JSONGenericDictExample("Jen", new
Date(Date.parse("09/09/1999")));
var e = new JSONDictionaryExtnExample();
e[a_bob1] = {earnings: 40, violations: 2};
e[a_bob2] = {earnings: 10, violations: 1};
e[a_jen] = {earnings: 25, violations: 3};
trace("JSON.stringify(e): " + JSON.stringify(e)); // {"class JSONDictionaryExtnExample":
//{"id_class_JSONGenericDictExample_10001":
//{"earnings":10,"violations":1},
//"id_class_JSONGenericDictExample_10002":
//{"earnings":25,"violations":3},
//"id_class_JSONGenericDictExample_10000":
// {"earnings":40,"violations":2}}}
var e_result = JSON.stringify(e);
var e1 = new JSONDictionaryExtnExample();
var e2 = new JSONDictionaryExtnExample();
// It's somewhat easy to convert the string from JSON.stringify(e) back
// into a dictionary (turn it into an object via JSON.parse, then loop
// over that object's properties to construct a fresh dictionary).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 128
Utilisation de la fonctionnalité JSON native
Dernière mise à jour le 27/4/2013
//
// The harder exercise is to handle situations where the dictionaries
// themselves are nested in the object passed to JSON.stringify and
// thus does not occur at the topmost level of the resulting string.
//
// (For example: consider roundtripping something like
// var tricky_array = [e1, [[4, e2, 6]], {table:e3}]
// where e1, e2, e3 are all dictionaries. Furthermore, consider
// dictionaries that contain references to dictionaries.)
//
// This parsing (or at least some instances of it) can be done via
// JSON.parse, but it's not necessarily trivial. Careful consideration
// of how toJSON, replacer, and reviver can work together is
// necessary.
var e_roundtrip =
JSON.parse(e_result,
/ / This is a reviver that is focused on rebuilding JSONDictionaryExtnExample objects.
function (k, v) {
if ("class JSONDictionaryExtnExample" in v) { // special marker tag;
//see JSONDictionaryExtnExample.toJSON().
var e = new JSONDictionaryExtnExample();
var contents = v["class JSONDictionaryExtnExample"];
for (var i in contents) {
// Reviving JSONGenericDictExample objects from string
// identifiers is also special;
// see JSONGenericDictExample constructor and
// JSONGenericDictExample's revive() method.
e[JSONGenericDictExample.revive(i)] = contents[i];
}
return e;
} else {
return v;
}
});
trace("// == Here is an extended Dictionary that has been round-tripped ==");
trace("// == Note that we have revived Jen/Jan during the roundtrip. ==");
trace("e: " + e); //[JSONDictionaryExtnExample ]
trace("e_roundtrip: " + e_roundtrip); //[JSONDictionaryExtnExample ]
trace("Is e_roundtrip a JSONDictionaryExtnExample? " + (e_roundtrip is
JSONDictionaryExtnExample)); //true
trace("Name change: Jen is now Jan");
a_jen.dname = "Jan"
trace("e: " + e); //[JSONDictionaryExtnExample ]
trace("e_roundtrip: " + e_roundtrip); //[JSONDictionaryExtnExample ]
129
Dernière mise à jour le 27/4/2013
Chapitre 8 : Gestion des événements
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Un système de gestion des événements permet au programmeur de répondre aux actions de l’utilisateur et aux
événements système de manière pratique. Le modèle d’événement ActionScript 3.0 n’est pas seulement pratique, il est
conforme aux normes en vigueur et bien intégré à la liste d’affichage. Ce modèle repose sur la spécification
d’événements Document Object Model (DOM) de niveau 3, une architecture de gestion d’événements normalisée. Il
constitue donc pour les programmeurs ActionScript un outil puissant et parfaitement intuitif.
Le système de gestion d’événements ActionScript 3.0 assure une interaction étroite avec la liste d’affichage. Pour
comprendre les principes de base de la liste d’affichage, voir « Programmation de l’affichage » à la page 156.
Voir aussi
Package flash.events
Spécification d’événements Document Object Model (DOM) niveau 3
Principes de base de la gestion des événements
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez concevoir un événement comme tout type d’action qui se produit dans votre fichier SWF et qui présente
un intérêt pour vous en tant que programmeur. Par exemple, la plupart des fichiers SWF prennent en charge une
certaine forme d’interaction, qu’il s’agisse d’une action aussi simple qu’un clic avec la souris ou d’une opération plus
complexe, telle que l’acceptation et le traitement des données saisies dans un formulaire. Toute interaction de ce type
dans le fichier SWF est considérée comme un événement. Des événements peuvent également se produire sans aucun
interaction directe de l’utilisateur, par exemple lorsque le chargement des données depuis un serveur se termine ou
qu’une caméra reliée devient active.
Dans ActionScript 3.0, tout événement est représenté par un objet événement, qui correspond à une occurrence de la
classe Event ou de l’une de ses sous-classes. Le rôle d’un objet événement est non seulement de stocker des
informations relatives à un événement spécifique, mais aussi de contenir des méthodes qui favorisent la manipulation
de cet objet. Par exemple, lorsque Flash Player ou AIR détecte un clic de la souris, il crée un objet événement (une
occurrence de la classe MouseEvent) qui représente cet événement particulier.
Après la création d’un objet événement, Flash Player ou AIR le distribue, ce qui signifie que l’objet événement est
transmis à l’objet représentant la cible de l’événement. L’objet qui doit recevoir l’objet événement ainsi distribué est
appelé cible d’événement. Par exemple, lorsqu’une caméra reliée devient active, Flash Player distribue un objet
événement directement à la cible de l’événement, dans ce cas l’objet représentant la caméra. Toutefois, si la cible
d’événement se trouve dans la liste d’affichage, l’objet événement est transmis tout au long de la hiérarchie de la liste
d’affichage jusqu’à ce qu’il atteigne la cible en question. Dans certains cas, l’objet événement se « propage » ensuite vers
le haut de la hiérarchie de la liste d’affichage, selon le même cheminement. Cette traversée de la hiérarchie de la liste
d’affichage correspond au flux d’événements.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 130
Gestion des événements
Dernière mise à jour le 27/4/2013
Vous pouvez « écouter » les objets événement de votre code grâce aux écouteurs d’événement. Les écouteurs
d’événement sont des fonctions ou des méthodes que vous écrivez pour répondre aux différents événements. Pour
garantir que le programme réagisse aux événements, vous devez ajouter des écouteurs d’événement soit à la cible
d’événement, soit à l’un des objets de la liste d’affichage qui font partie du flux d’événements de l’objet événement.
Chaque fois que vous écrivez un code d’écouteur d’événement, il suit cette structure de base (les éléments en gras sont
des espaces réservés que vous rempliriez pour votre cas particulier) :
function eventResponse(eventObject:EventType):void
{
// Actions performed in response to the event go here.
}
eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse);
Ce code a un double rôle. Tout d’abord, il définit une fonction, qui est une manière de spécifier les actions à exécuter
en réponse à l’événement. Ensuite, il appelle la méthode addEventListener() de l’objet source, « inscrivant » ainsi
la fonction auprès de l’événement spécifié de sorte que lorsque l’événement survient, les actions de la fonction ont lieu.
Lorsque l’événement se produit, la cible de l’événement vérifie sa liste de toutes les fonctions et méthodes enregistrées
en tant qu’écouteurs d’événement. Elle appelle ensuite chacune d’elles, transmettant l’objet événement à titre de
paramètre.
Vous devez apporter quatre modifications à ce code pour créer votre propre écouteur d’événement. Premièrement,
vous devez remplacer le nom de la fonction par celui que vous souhaitez utiliser (ceci doit être modifié à deux endroits,
là où le code indique eventResponse). Deuxièmement, vous devez spécifier le nom de la classe de l’objet événement
qui est envoyé par l’événement que vous souhaitez écouter (EventType dans le code), et vous devez indiquer la
constante pour l’événement en question (EVENT_NAME dans la liste). Troisièmement, vous devez appeler la
méthode addEventListener() sur l’objet qui enverra l’événement (eventTarget dans ce code). Vous pouvez
également modifier le nom de la variable utilisée comme paramètre de la fonction (eventObject dans ce code).
Concepts importants et terminologie
La liste de référence suivante contient des termes importants utilisés dans le cadre de la rédaction de routines de
gestion des événements :
Propagation Certains événements donnent lieu à une propagation afin de permettre à un objet d’affichage parent de
réagir aux événements distribués par ses enfants.
Phase de propagation Partie du flux d’événements dans laquelle un événement est propagé jusqu’aux objets
d’affichage parent. La phase de propagation suit la phase de capture et la phase cible.
Phase de capture Partie du flux d’événements dans laquelle un événement se propage de la cible la plus générale vers
l’objet cible le plus spécifique. La phase de capture précède la phase cible et la phase de propagation.
Comportement par défaut Certains événements sont liés à un comportement appelé comportement par défaut. Par
exemple, lorsqu’un utilisateur tape du texte dans un champ, un événement de saisie de texte est déclenché. Le
comportement par défaut de cet événement consiste à afficher le caractère tapé dans le champ de texte—mais vous
pouvez annuler ce comportement par défaut (si vous ne souhaitez pas afficher le caractère tapé, par exemple).
Distribuer Indiquer à des écouteurs d’événements qu’un événement a eu lieu.
Evénement Opération subie par un objet et que ce dernier peut signaler à d’autres objets.
Flux d’événements Lorsque des événements concernent un objet de la liste d’affichage (un objet affiché à l’écran), tous
les objets qui contiennent cet objet sont informés de l’événement et avertissent à leur tour les écouteurs d’événements
correspondants. Ce processus commence avec la scène et se poursuit à travers la liste d’affichage jusqu’à l’objet réel où
s’est produit l’événement. Il recommence ensuite avec la scène. Ce processus est appelé flux d’événements.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 131
Gestion des événements
Dernière mise à jour le 27/4/2013
Objet événement Objet contenant des informations sur l’occurrence d’un événement particulier, qui est envoyé à tous
les écouteurs lorsqu’un événement est distribué.
Cible d’événement Objet qui envoie un événement. Par exemple, si l’utilisateur clique sur un bouton situé dans un
Sprite se trouvant dans la scène, tous ces objets envoient des événements mais c’est au niveau de la cible d’événement
que se produit l’événement (le bouton cliqué, dans ce cas).
Ecouteur Objet ou fonction qui s’est enregistré auprès d’un objet pour indiquer qu’il doit être averti lorsqu’un
événement spécifique se produit.
Phase cible Stade du flux d’événements où un événement atteint la cible la plus spécifique possible. La phase cible se
produit entre la phase de capture et la phase de propagation.
Variation de la gestion d’événements dans
ActionScript 3.0 par rapport aux versions antérieures
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
En ce qui concerne la gestion des événements, la différence la plus évidente entre ActionScript 3.0 et les versions
antérieures est qu’ActionScript 3.0 comprend un seul système de gestion des événements alors que les anciennes
versions d’ActionScript en comptent plusieurs. Cette section commence par une présentation générale du
fonctionnement de la gestion des événements dans les versions précédentes, puis étudie les nouveautés qu’apporte
ActionScript 3.0 dans ce domaine.
Gestion des événements dans les versions précédentes d’ActionScript
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Antérieurement à ActionScript 3.0, le langage ActionScript fournissait plusieurs méthodes de gestion des événements :
• Les gestionnaires d’événement on(), qui peuvent se placer directement sur des occurrences Button et MovieClip
• Les gestionnaires d’événement onClipEvent(), qui peuvent se placer directement sur des occurrences MovieClip
• Des propriétés de fonction de rappel, telles que XML.onload et Camera.onActivity
• Des écouteurs d’événement, que vous pouvez enregistrer à l’aide de la méthode addListener()
• La classe UIEventDispatcher, qui implémentait partiellement le modèle d’événements DOM
Chacun de ces mécanismes présente des avantages et des inconvénients. Les gestionnaires on() et onClipEvent()
sont simples d’utilisation, mais compliquent la maintenance des projets car il peut s’avérer difficile de localiser le code
placé directement sur les boutons ou les clips. Les fonctions de rappel sont également faciles à implémenter, mais
imposent une limite d’une seule fonction de rappel par événement. L’implémentation des écouteurs d’événement est
plus complexe : ils nécessitent non seulement la création d’un objet et d’une fonction d’écouteur, mais aussi
l’enregistrement de l’écouteur auprès de l’objet qui génère l’événement. Bien qu’elle accroisse le temps système
nécessaire, cette solution vous permet de créer plusieurs objets écouteur et de tous les enregistrer pour le même
événement.
Dans ActionScript 2.0, le développement des composants engendrait un modèle d’événements encore différent. Ce
nouveau modèle, caractérisé par la classe UIEventDispatcher, reposait sur un sous-ensemble de la spécification
d’événements DOM. Ainsi, pour les développeurs accoutumés à la gestion des événements de composant, le passage
au nouveau modèle d’événements d’ActionScript 3.0 se fera sans trop de difficultés.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 132
Gestion des événements
Dernière mise à jour le 27/4/2013
Malheureusement, si l’on constate des recoupements entre les divers modèles d’événements, il existe aussi des
différences. Par exemple, dans ActionScript 2.0, certaines propriétés, telles que TextField.onChanged, peuvent
s’utiliser soit comme fonction de rappel, soit comme écouteur d’événement. Toutefois, la syntaxe qui permet
d’enregistrer les objets écouteurs varie selon que vous utilisez l’une des six classes qui prennent en charge les écouteurs
ou la classe UIEventDispatcher. Pour les classes Key, Mouse, MovieClipLoader, Selection, Stage et TextField, vous
utilisez la méthode addListener(), mais pour la gestion des événements de composant, vous utilisez une méthode
appelée addEventListener().
La multiplicité des modèles de gestion d’événements a fait naître une autre complexité : l’étendue de la fonction de
gestionnaire d’événement variait largement en fonction du mécanisme utilisé. En d’autres termes, la signification du
mot-clé this n’était pas cohérente sur l’ensemble des systèmes de gestion d’événements.
Gestion d’événements dans ActionScript 3.0
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript 3.0 utilise pour la première fois un modèle de gestion d’événements qui vient remplacer les nombreux
mécanismes qui existaient dans les précédentes versions du langage. Le nouveau modèle d’événements repose sur la
spécification d’événements de niveau 3 DOM (Document Object Model). Bien que le format de fichier SWF ne suive
pas spécifiquement la norme DOM, il existe suffisamment de similitudes entre la liste d’affichage et la structure du
DOM pour permettre l’implémentation de ce modèle d’événements. Un objet de la liste d’affichage est semblable à un
noeud de la structure hiérarchique du DOM ; dans ce chapitre, les termes objet de liste d’affichage et noeud sont
d’ailleurs utilisés de façon interchangeable.
L’implémentation du modèle d’événements DOM dans Flash Player et AIR comprend un concept appelé
« comportements par défaut ». Un comportement par défaut est une action que Flash Player ou AIR effectue comme
conséquence normale de certains événements.
Comportements par défaut
Les développeurs se chargent normalement d’écrire le code qui permet de répondre aux événements. Dans certains
cas, cependant, un comportement est si couramment associé à un événement que Flash Player ou AIR l’exécute
automatiquement, sauf si le développeur ajoute du code pour annuler son exécution. Comme Flash Player ou AIR se
livre automatiquement à cette opération, on parle de comportements par défaut.
Par exemple, lorsqu’un utilisateur entre du texte dans un objet TextField, il est si courant de voir s’afficher la saisie dans
l’objet TextField en question que ce comportement est prédéfini dans Flash Player ou AIR. Si vous ne souhaitez pas
conserver ce comportement par défaut, vous pouvez l’annuler à l’aide du système de gestion des événements.
Lorsqu’un utilisateur entre du texte dans un objet TextField, Flash Player ou AIR crée une occurrence de la classe
TextEvent afin de représenter cette saisie. Pour éviter que Flash Player ou AIR n’affiche le texte dans l’objet TextField,
vous devez accéder à cette occurrence de TextEvent spécifique et appeler sa méthode preventDefault().
Certains comportements par défaut ne peuvent pas être évités. Par exemple, Flash Player et AIR génèrent un objet
MouseEvent lorsque l’utilisateur double-clique sur un mot dans un objet TextField. Le comportement par défaut, qui
ne peut être évité, consiste à mettre en évidence le mot situé sous le curseur.
De nombreux types d’objets événement ne sont associés à aucun comportement par défaut. Par exemple, l’objet
événement Connect, que Flash Player distribue lorsqu’une connexion réseau est établie, n’est associé à aucun
comportement par défaut. La documentation de l’API relative à la classe Event et ses sous-classes fait l’inventaire de
chaque type d’événement, décrit le comportement par défaut qui lui est éventuellement associé et indique si ce dernier
peut être évité.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 133
Gestion des événements
Dernière mise à jour le 27/4/2013
Il est important de comprendre que les comportements par défaut sont uniquement associés à des objets événements
distribués par Flash Player ou AIR ; il n’en existe aucun pour les objets événements distribués via ActionScript par
programmation. Par exemple, vous pouvez utiliser les méthodes de la classe EventDispatcher pour distribuer un objet
événement du type textInput, mais cet objet ne sera associé à aucun comportement par défaut. En d’autres termes,
Flash Player et AIR n’affichent aucun caractère dans un objet TextField en réponse à un événement textInput que
vous avez distribué par programmation.
Nouveautés des écouteurs d’événement dans ActionScript 3.0
Pour les développeurs qui connaissent bien la méthode ActionScript 2.0 addListener(), il peut être utile de souligner
les différences entre le modèle d’écouteur d’événement d’ActionScript 2.0 et le modèle d’événements
d’ActionScript 3.0. La liste ci-après décrit les principales différences entre ces deux modèles d’événements :
• Pour ajouter des écouteurs d’événement dans ActionScript 2.0, vous utilisez, selon le cas, addListener() ou
addEventListener(). Dans ActionScript 3.0, il faut utiliser addEventListener() dans tous les cas.
• ActionScript 2.0 ne propose aucun flux d’événements dans ActionScript 2.0, ce qui signifie que la méthode
addListener() peut uniquement être appelée sur l’objet qui émet l’événement. Dans ActionScript 3.0, la méthode
addEventListener() peut être appelée sur tout objet faisant partie du flux d’événements.
• Dans ActionScript 2.0, les écouteurs d’événement peuvent être des fonctions, des méthodes ou des objets, alors que
dans ActionScript 3.0, seules les fonctions et les méthodes peuvent agir comme écouteurs d’événement.
Flux d’événements
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Flash Player ou AIR distribue des objets événements dès que survient un événement. Si la cible d’événement ne se
trouve pas dans la liste d’affichage, Flash Player ou AIR distribue l’objet événement directement à la cible. Par exemple,
Flash Player distribue l’objet événement Progress directement à un objet URLStream. Cependant, si la cible
d’événement se trouve dans la liste d’affichage, Flash Player distribue l’objet événement à la liste d’affichage, dans
laquelle l’objet chemine jusqu’à atteindre la cible d’événement.
Le flux d’événements représente le parcours que suivra un objet événement dans la liste d’affichage. Cette liste
s’organise de manière hiérarchique, pour constituer une arborescence. Au sommet de la liste d’affichage se trouve la
scène, un conteneur d’objet d’affichage spécial qui lui sert de racine. La Scène, représentée par la classe
flash.display.Stage, est uniquement accessible via un objet d’affichage. Chaque objet d’affichage présente une propriété
appelée stage, qui renvoie à la scène de cette application.
Lorsque Flash Player ou AIR distribue un objet d’événement pour un événement associé à une liste d’affichage, celuici
effectue un aller-retour entre la Scène et le noeud cible. Selon la définition de la spécification d’événements DOM, le
noeud cible est le noeud qui représente la cible d’événement. En d’autres termes, le noeud cible est l’objet de la liste
d’affichage au niveau duquel est survenu l’événement. Par exemple, si l’utilisateur clique sur un objet de la liste
d’affichage appelé child1, Flash Player ou AIR distribue un objet événement dont le noeud cible est child1.
Le flux d’événements se décompose en trois phases. La première correspond à la phase de capture, qui comprend tous
les noeuds de la Scène jusqu’au parent du noeud cible. La deuxième partie est appelée la phase cible, qui comprend
uniquement le noeud cible. La troisième partie s’appelle la phase de propagation. Elle comprend les noeuds rencontrés
lors du cheminement du parent du noeud cible jusqu’à la scène.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 134
Gestion des événements
Dernière mise à jour le 27/4/2013
Le nom de ces phases prend tout son sens si vous envisagez la liste d’affichage comme une hiérarchie verticale dont le
sommet est la Scène, comme illustré par le schéma suivant :
Si un utilisateur clique sur Child1 Node, Flash Player ou AIR distribue un objet événement dans ce flux d’événements.
Comme le montre l’illustration suivante, le parcours de l’objet commence à Scène. L’objet descend ensuite jusqu’à
Noeud parent, puis vers Noeud enfant1. Il se propage alors vers le haut jusqu’à Scène, en repassant par Noeud parent
pour rejoindre Scène.
Dans cet exemple, la phase de capture comprend Scène et Noeud parent pendant le trajet descendant initial. La phase
cible comprend le temps passé au noeud Noeud enfant1. La phase de propagation comprend les noeuds Noeud parent
et Scène, qui se trouvent sur le chemin du retour vers le noeud racine.
Le flux d’événements contribue au renforcement du système de gestion des événements par rapport aux versions
précédentes d’ActionScript. Dans ces dernières, le flux d’événements est inexistant, ce qui signifie que les écouteurs
d’événement s’ajoutent uniquement à l’objet qui génère l’événement. Dans ActionScript 3.0, vous pouvez ajouter des
écouteurs d’événement aussi bien à un noeud cible qu’à tout autre noeud du flux d’événements.
Cette possibilité d’ajouter des écouteurs d’événement tout au long du flux d’événements s’avère particulièrement utile
lorsqu’un composant d’interface comprend plusieurs objets. Par exemple, un objet bouton contient souvent un objet
texte qui sert de libellé au bouton. Sans la possibilité d’ajouter un écouteur au flux d’événements, il faudrait en ajouter
un à l’objet bouton et un à l’objet texte pour être sûr d’être averti des événements de clic survenant à tout endroit du
bouton. Le flux d’événements vous permet, au contraire, de placer un seul écouteur d’événement sur l’objet bouton
afin de gérer les événements de clic, qu’ils se produisent sur l’objet texte ou sur des zones de l’objet bouton non
couvertes par l’objet texte.
Cependant, certains objets événements ne participent pas aux trois phases du flux d’événements. Certains types
d’événements, tels que enterFrame et init, sont distribués directement au noeud cible et ne participent ni à la phase
de capture, ni à la phase de propagation. D’autres événements peuvent cibler des objets qui ne font pas partie de la liste
d’affichage, par exemple les événements distribués à une occurrence de la classe Socket. Ces objets événements
aboutissent directement à l’objet cible, sans participer à la phase de capture et de propagation.
Scène
Noeud parent
Noeud enfant1 Noeud enfant2
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 135
Gestion des événements
Dernière mise à jour le 27/4/2013
Pour savoir comment se comporte un type d’événement particulier, vous pouvez consulter la documentation de l’API
ou examiner les propriétés de l’objet événement. Cette dernière méthode est décrite à la section suivante.
Objets événement
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les objets événements jouent deux rôles essentiels dans le nouveau système de gestion des événements. Tout d’abord,
ces objets représentent de véritables événements, puisqu’ils stockent dans un ensemble de propriétés des informations
relatives à des événements précis. Ils contiennent en outre un jeu de méthodes qui vous permet de manipuler les objets
événement et d’agir sur le comportement du système de gestion des événements.
Pour faciliter l’accès à ces propriétés et ces méthodes, l’API Flash Player définit une classe Event qui constitue la classe
de base de tous les objets événements. La classe Event définit un jeu fondamental de propriétés et de méthodes
commun à tous les objets événement.
Cette section commence par étudier les propriétés de la classe Event avant de décrire les méthodes de cette même
classe, puis explique l’existence de sous-classes dans la classe Event.
Présentation des propriétés de la classe Event
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Event définit plusieurs propriétés et constantes en lecture seule qui fournissent des informations essentielles
sur l’objet événement. Les points suivants revêtent une importance particulière :
• Les types d’objet événement sont représentés par des constantes et stockés dans la propriété Event.type.
• La possibilité d’éviter le comportement par défaut d’un événement est représentée par une valeur booléenne,
stockée dans la propriété Event.cancelable.
• Les informations relatives au flux d’événements se trouvent dans les propriétés restantes.
Types d’objets événement
Chaque objet événement est associé à un type d’événement. Les types d’événements sont stockés dans la propriété
Event.type sous forme de chaîne. Il est utile de connaître le type d’un objet événement car votre code peut alors
distinguer les objets de types différents. Par exemple, le code suivant spécifie que la fonction clickHandler() doit
répondre à tous les objets événements clic de souris transmis à myDisplayObject :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
La classe Event est elle-même associée à deux douzaines de types d’événement, représentés par des constantes de la
classe Event. Dans cet extrait de la définition de la classe Event, certaines de ces constantes sont illustrées :
package flash.events
{
public class Event
{
// class constants
public static const ACTIVATE:String = "activate";
public static const ADDED:String= "added";
// remaining constants omitted for brevity
}
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 136
Gestion des événements
Dernière mise à jour le 27/4/2013
Ces constantes permettent de faire facilement référence à des types d’événement précis. Vous devez utiliser ces
constantes au lieu des chaînes qu’elles représentent. Si vous orthographiez de manière incorrecte un nom de constante
dans votre code, le compilateur peut détecter l’erreur. Si vous utilisez les chaînes qu’elles représentent, une erreur de
frappe ne sera pas forcément détectée lors de la compilation et pourrait provoquer un comportement inattendu,
difficile à déboguer. Par exemple, utilisez le code suivant pour ajouter un écouteur d’événement :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
plutôt que :
myDisplayObject.addEventListener("click", clickHandler);
Informations relatives aux comportements par défaut
Le code que vous écrivez est en mesure de vérifier si le comportement par défaut d’un objet événement donné peut être
évité. Pour ce faire, il doit accéder à la propriété cancelable. La propriété cancelable contient une valeur booléenne
qui indique si le comportement par défaut peut être évité ou non. Vous pouvez éviter, ou annuler, le comportement
par défaut de quelques événements à l’aide de la méthode preventDefault(). Pour plus d’informations, voir
Annulation d’un comportement associé par défaut à un événement sous « Présentation des méthodes de la classe
Event » à la page 137.
Informations de flux d’événements
Les propriétés restantes de la classe Event contiennent des informations importantes sur l’objet événement et ses
relations au flux d’événements, comme l’explique la liste suivante :
• La propriété bubbles contient des informations sur les parties du flux d’événements auquel participe l’objet
événement.
• La propriété eventPhase indique la phase actuelle du flux d’événements.
• La propriété target stocke une référence à la cible d’événement.
• La propriété currentTarget stocke une référence de l’objet de liste d’affichage qui traite actuellement l’objet
événement.
La propriété bubbles
On dit d’un événement qu’il se propage lorsqu’il participe à la phase de propagation du flux d’événements, c’est-à-dire
quand l’objet événement est transmis du noeud cible via ses ascendants jusqu’à la Scène. La propriété Event.bubbles
stocke une valeur booléenne qui indique si l’objet événement participe à la phase de propagation. Tous les événements
qui se propagent vers le haut participent également aux phases de capture et cible ; de tels événements participent donc
aux trois phases du flux d’événements. Si la valeur est true, l’objet événement participe aux trois phrases. Si la valeur
est false, l’objet événement ne participe pas à la phase de propagation.
La propriété eventPhase
Vous pouvez déterminer la phase d’événement de tout objet événement grâce à sa propriété eventPhase. La propriété
eventPhase a pour valeur un entier non signé qui représente l’une des trois phases du flux d’événements. L’API de
Flash Player définit une classe EventPhase distincte qui contient trois constantes correspondant aux trois valeurs
entières non signées, comme illustré par l’extrait de code suivant :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 137
Gestion des événements
Dernière mise à jour le 27/4/2013
package flash.events
{
public final class EventPhase
{
public static const CAPTURING_PHASE:uint = 1;
public static const AT_TARGET:uint = 2;
public static const BUBBLING_PHASE:uint= 3;
}
}
Ces constantes correspondent aux trois valeurs valables pour la propriété eventPhase. Vous pouvez utiliser ces
constantes pour améliorer la lisibilité de votre code. Supposons par exemple que vous souhaitiez être sûr qu’une
fonction appelée myFunc() soit uniquement appelée lorsque la cible d’événement se trouve dans la scène cible. Le code
suivant vous permet de tester cette condition :
if (event.eventPhase == EventPhase.AT_TARGET)
{
myFunc();
}
La propriété target
La propriété target contient une référence à l’objet cible de l’événement. Dans certains cas, ce système est simple, par
exemple, lorsqu’un micro devient actif, la cible de l’objet événement est l’objet Microphone. Toutefois, si la cible se
trouve sur la liste d’affichage, il faut tenir compte de la hiérarchie de cette dernière. Par exemple, si un utilisateur clique
avec la souris sur un point correspondant à plusieurs objets de la liste d’affichage qui se chevauchent, Flash Player
et AIR choisissent toujours comme cible d’événement l’objet qui se trouve le plus loin de la Scène.
Dans des fichiers SWF complexes, et particulièrement ceux dont les boutons sont régulièrement ornés d’objets enfant
plus petits, la propriété target ne doit pas être utilisée fréquemment car elle pointera souvent vers l’objet enfant du
bouton plutôt que vers le bouton lui-même. Dans de telles situations, il est courant d’ajouter des écouteurs
d’événement au bouton et d’utiliser la propriété currentTarget. En effet, cette dernière pointe vers le bouton alors
que la propriété target peut pointer vers l’un des enfants du bouton.
La propriété currentTarget
La propriété currentTarget contient une référence de l’objet de liste d’affichage qui traite actuellement l’objet
événement. Même s’il peut paraître étrange de ne pas savoir quel noeud traite actuellement l’objet événement que vous
étudiez, gardez à l’esprit que vous pouvez ajouter une fonction écouteur à n’importe quel objet d’affichage du flux
d’événements de l’objet événement en question. En outre, cette fonction écouteur peut être placée à tout endroit. Par
ailleurs, la même fonction écouteur peut être ajoutée à différents objets d’affichage. L’utilité de la propriété
currentTarget augmente donc avec la taille et la complexité du projet.
Présentation des méthodes de la classe Event
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Event contient trois catégories de méthodes :
• Les méthodes d’utilitaire, qui peuvent créer des copies d’un objet événement ou le convertir en chaîne
• Les méthodes de flux d’événements, qui suppriment les objets événements du flux d’événements
• Les méthodes de comportement par défaut, qui annulent le comportement par défaut ou vérifient s’il a été annulé
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 138
Gestion des événements
Dernière mise à jour le 27/4/2013
Méthodes d’utilitaire de la classe Event
La classe Event compte deux méthodes d’utilitaire. La méthode clone() permet de créer des copies d’un objet
événement. La méthode toString() permet de représenter sous forme de chaînes les propriétés d’un objet événement
ainsi que leurs valeurs. Bien qu’utilisées en interne par le modèle d’événements, ces deux méthodes sont mises à la
disposition des développeurs pour un usage générique.
Pour les développeurs expérimentés qui souhaitent créer des sous-classes de la classe Event, il est nécessaire de
redéfinir et d’implémenter des versions de ces deux méthodes d’utilitaires afin de garantir le bon fonctionnement de
la sous-classe d’événement.
Arrêt du flux d’événements
La méthode Event.stopPropagation() ou Event.stopImmediatePropagation() vous permet d’arrêter le
cheminement d’un objet événement dans le flux d’événements. Quasi identiques, ces deux méthodes diffèrent
uniquement en ce que les autres écouteurs d’événement du noeud actuel sont autorisés ou non à s’exécuter :
• La méthode Event.stopPropagation() empêche l’objet événement de passer au noeud suivant mais seulement
après que tous les autres écouteurs du noeud actuel ont été autorisés à s’exécuter.
• La méthode Event.stopImmediatePropagation() empêche l’objet événement de passer au noeud suivant sans
autoriser les autres écouteurs du noeud actuel à s’exécuter.
Quelle que soit la méthode appelée, elle n’a aucun effet sur la réalisation du comportement par défaut de l’événement.
Utilisez les méthodes de comportement par défaut de la classe Event pour éviter le comportement par défaut.
Annulation d’un comportement associé par défaut à un événement
Deux méthodes sont associées à l’annulation du comportement par défaut : preventDefault() et
isDefaultPrevented(). Appelez la méthode preventDefault() pour annuler le comportement associé par défaut
à un événement. Pour vérifier si preventDefault() a déjà été appelée sur un objet événement, appelez la méthode
isDefaultPrevented(), qui renvoie la valeur true si la méthode a déjà été appelée, false dans le cas contraire.
La méthode preventDefault() fonctionne uniquement s’il est possible d’annuler le comportement par défaut de
l’événement. Pour vérifier que c’est le cas, reportez-vous à la documentation de l’API de ce type d’événement ou
examinez la propriété cancelable de l’objet événement à l’aide du code ActionScript.
L’annulation du comportement par défaut n’a aucun effet sur la progression d’un objet événement dans le flux
d’événements. Utilisez les méthodes de flux d’événements de la classe Event pour supprimer un objet événement du
flux d’événements.
Sous-classes de la classe Event
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Pour de nombreux événements, le jeu de propriétés commun, défini dans la classe Event est suffisant. Néanmoins,
d’autres événements présentent des caractéristiques exclusives qui ne peuvent être capturées par les propriétés
disponibles dans la classe Event. Pour ces événements, ActionScript 3.0 définit plusieurs sous-classes de la classe
Evénement.
Chaque sous-classe fournit d’autres propriétés et types d’événements propres à la catégorie d’événement considérée.
Par exemple, les événements liés aux actions de la souris présentent plusieurs caractéristiques uniques, que les
propriétés définies dans la classe Event ne peuvent capturer. La classe MouseEvent constitue une extension de la classe
Event puisqu’elle ajoute dix propriétés contenant des informations telles que l’emplacement de l’événement de souris
et les éventuelles touches actionnées en même temps.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 139
Gestion des événements
Dernière mise à jour le 27/4/2013
Une sous-classe d’Event contient également des constantes qui représentent de types d’événement associés à la sousclasse.
Par exemple, la classe MouseEvent définit des constantes pour plusieurs types d’événement de souris,
notamment click, doubleClick, mouseDown et mouseUp.
Comme le décrit la section consacrée aux méthodes d’utilitaire de la classe Event dans « Objets événement » à la
page 135, lors de la création d’une sous-classe d’Event, vous devez bloquer les méthodes clone() et toString() pour
fournir la fonctionnalité propre à la sous-classe.
Ecouteurs d’événement
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Les écouteurs d’événement, également appelés gestionnaires d’événements, sont des fonctions que Flash Player et AIR
exécutent en réponse à des événements déterminés. La procédure d’ajout d’un écouteur d’événement se déroule en
deux temps. En premier lieu, vous créez une fonction ou méthode de classe que Flash Player ou AIR doit exécuter en
réponse à l’événement. On parle parfois de fonction d’écouteur ou de fonction de gestionnaire d’événement. En second
lieu, vous utilisez la méthode addEventListener() pour enregistrer la fonction d’écouteur auprès de la cible de
l’événement ou tout autre objet de la liste d’affichage qui appartient au flux d’événements approprié.
Création d’une fonction d’écouteur
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La création d’une fonction d’écouteur est un domaine dans lequel le modèle d’événements ActionScript 3.0 diffère du
modèle d’événements DOM. Dans le modèle d’événements DOM, on distingue clairement un écouteur d’événement
et une fonction d’écouteur : un écouteur d’événement est une occurrence de classe qui implémente l’interface
EventListener, tandis qu’une fonction d’écouteur est une méthode de cette classe appelée handleEvent(). Dans le
modèle d’événements DOM, vous enregistrez l’occurrence de classe qui contient la fonction d’écouteur, plutôt que la
fonction d’écouteur elle-même.
Le modèle d’événements ActionScript ne fait aucune distinction entre l’écouteur d’événement et la fonction
d’écouteur. L’interface EventListener est inexistante dans ActionScript 3.0 et les fonctions d’écouteur peuvent être
définies en dehors de toute classe ou au sein d’une classe. Par ailleurs, il n’est pas nécessaire de nommer les fonctions
d’écouteur handleEvent() ; vous pouvez utiliser tout identifiant valable. Dans ActionScript 3.0, vous enregistrez le
nom de la fonction d’écouteur elle-même.
Fonction d’écouteur définie en dehors de toute classe
Le code suivant crée un fichier SWF simple qui affiche une forme carrée de couleur rouge. Une fonction d’écouteur
appelée clickHandler(), qui n’appartient à aucune classe, écoute les événements de clic de souris dans le carré rouge.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 140
Gestion des événements
Dernière mise à jour le 27/4/2013
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
}
function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
Lorsqu’un utilisateur interagit avec le fichier SWF résultant, en cliquant sur le carré, Flash Player ou AIR génère la
sortie de suivi ci-après :
clickHandler detected an event of type: click
the this keyword refers to: [object global]
Notez que l’objet événement est transmis sous forme d’instruction à clickHandler(). Cela permet à votre fonction
d’écouteur d’examiner l’objet événement. Dans cet exemple, vous utilisez la propriété type de l’objet événement pour
vérifier que cet événement correspond à un clic.
L’exemple vérifie aussi la valeur du mot-clé this. Dans ce cas, this représente l’objet global, ce qui est logique puisque
la fonction est définie en dehors de toute classe ou objet personnalisé.
Fonction d’écouteur définie comme méthode de classe
L’exemple ci-dessous est identique au précédent, qui définit la classe ClickExample, sauf que la fonction
clickHandler() est définie comme méthode de la classe ChildSprite :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 141
Gestion des événements
Dernière mise à jour le 27/4/2013
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
}
Lorsqu’un utilisateur interagit avec le fichier SWF résultant, en cliquant sur le carré rouge, Flash Player ou AIR génère
la sortie de suivi ci-après :
clickHandler detected an event of type: click
the this keyword refers to: [object ChildSprite]
Notez que le mot-clé this renvoie à l’occurrence de ChildSprite appelée child. Voici un changement de
comportement par rapport à ActionScript 2.0. Si vous utilisiez des composants dans ActionScript 2.0, vous vous
rappelez sans doute que lorsqu’une méthode de classe était transmise à UIEventDispatcher.addEventListener(),
l’étendue de la méthode était liée au composant qui émettait l’événement, et non à la classe dans laquelle la méthode
d’écouteur était définie. En d’autres termes, si vous utilisiez cette technique dans ActionScript 2.0, le mot-clé this
renvoyait au composant émettant l’événement et non à l’occurrence de ChildSprite.
Pour certains développeurs, il s’agissait d’un vrai problème car cela signifiait qu’ils ne pouvaient accéder à aucune autre
méthode et propriété de la classe qui contenait la méthode d’écouteur. Pour le contourner, les programmeurs
d’ActionScript 2.0 pouvaient utiliser la classe mx.util.Delegate pour modifier l’étendue de la méthode d’écouteur.
Cette manipulation n’est plus nécessaire puisque ActionScript 3.0 crée une méthode liée lorsque
addEventListener() est appelée. Par conséquent, le mot-clé this fait référence à l’occurrence de ChildSprite
appelée child et le programmeur peut accéder aux autres méthodes et propriétés de la classe ChildSprite.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 142
Gestion des événements
Dernière mise à jour le 27/4/2013
Ecouteur d’événement à ne pas utiliser
Une troisième technique permet de créer un objet générique dont l’une des propriétés pointe vers une fonction
d’écouteur affectée dynamiquement. Elle est cependant déconseillée. Nous l’évoquons ici en raison de son utilisation
courante dans ActionScript 2.0 ; il n’est toutefois pas recommandé de l’utiliser dans ActionScript 3.0. Cette mise en
garde tient au fait que le mot-clé this fera référence à l’objet global et non à l’objet écouteur.
L’exemple ci-après est identique à l’exemple précédent de la classe ClickExample, sauf que la fonction d’écouteur est
définie comme faisant partie d’un objet générique appelé myListenerObj :
package
{
import flash.display.Sprite;
public class ClickExample extends Sprite
{
public function ClickExample()
{
var child:ChildSprite = new ChildSprite();
addChild(child);
}
}
}
import flash.display.Sprite;
import flash.events.MouseEvent;
class ChildSprite extends Sprite
{
public function ChildSprite()
{
graphics.beginFill(0xFF0000);
graphics.drawRect(0,0,100,100);
graphics.endFill();
addEventListener(MouseEvent.CLICK, myListenerObj.clickHandler);
}
}
var myListenerObj:Object = new Object();
myListenerObj.clickHandler = function (event:MouseEvent):void
{
trace("clickHandler detected an event of type: " + event.type);
trace("the this keyword refers to: " + this);
}
Les résultats de trace seront les suivants :
clickHandler detected an event of type: click
the this keyword refers to: [object global]
On s’attendrait à ce que this fasse référence à myListenerObj et que la sortie de suivi soit [object Object], mais
le mot-clé renvoie en fait à l’objet global. Lorsque vous transmettez un nom de propriété dynamique comme
instruction à addEventListener(), Flash Player ou AIR est incapable de créer une méthode liée. En effet, ce que vous
transmettez comme paramètre listener n’est rien de plus que l’adresse mémoire de votre fonction d’écouteur ; Flash
Player et AIR n’ont aucun moyen de lier cette adresse à l’occurrence de myListenerObj.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 143
Gestion des événements
Dernière mise à jour le 27/4/2013
Gestion des écouteurs d’événement
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Vous pouvez gérer vos fonctions d’écouteur à l’aide des méthodes de l’interface IEventDispatcher. Cette interface est
la version ActionScript 3.0 de l’interface EventTarget du modèle d’événements DOM. Bien que le nom
IEventDispatcher semble impliquer que l’objet principal de la classe est l’envoi (ou la distribution) des objets
événements, les méthodes qui lui correspondent servent en fait plus souvent à l’enregistrement, la vérification et la
suppression des écouteurs d’événement. L’interface IEventDispatcher définit cinq méthodes, comme illustré dans le
code suivant :
package flash.events
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
L’API de Flash Player implémente l’interface IEventDispatcher à l’aide de la classe Event Dispatcher. Cette dernière
constitue la classe de base de toutes les classes pouvant servir de cibles d’événement ou faire partie d’un flux
d’événements. Par exemple, la classe DisplayObject hérite de la classe EventDispatcher, par conséquent, tout objet de
la liste d’affichage peut accéder aux méthodes de l’interface IEventDispatcher.
Ajout des écouteurs d’événement
La méthode addEventListener() est la clé de voûte de l’interface IEventDispatcher. Elle permet d’enregistrer les
fonctions d’écouteurs. Les deux paramètres requis sont type et listener. Le paramètre type spécifie le type
d’événement. Avec le paramètre listener, vous pouvez spécifier la fonction d’écouteur qui doit s’exécuter lorsque
l’événement survient. Le paramètre listener peut être une référence à une fonction ou une méthode de classe.
n’utilisez pas de parenthèses pour stipuler le paramètre listener. Par exemple, la fonction clickHandler() est
spécifiée sans parenthèses dans l’appel suivant à la méthode addEventListener() :
addEventListener(MouseEvent.CLICK, clickHandler)
Le paramètre useCapture de la méthode addEventListener() vous permet de contrôler la phase du flux
d’événements pendant laquelle votre écouteur sera actif. Si useCapture a la valeur true, votre écouteur sera actif
pendant la phase de capture du flux d’événements. Si useCapture a la valeur false, votre écouteur sera actif pendant
la phase cible et la phase de propagation du flux d’événements. Pour écouter un événement pendant toutes les phases
du flux d’événements, vous devez appeler deux fois addEventListener() ; la première fois, useCapture prend la
valeur true, la seconde fois, useCapture prend la valeur false.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 144
Gestion des événements
Dernière mise à jour le 27/4/2013
Le paramètre priority de la méthode addEventListener() ne fait pas officiellement partie du modèle
d’événements DOM de niveau 3. Il est inclus dans ActionScript 3.0 pour vous offrir une plus grande souplesse dans
l’organisation de vos écouteurs d’événement. Lorsque vous appelez addEventListener(), vous pouvez définir la
priorité de cet écouteur d’événement en transmettant une valeur entière comme paramètre priority. La valeur par
défaut est 0. Vous pouvez toutefois utiliser une valeur entière négative ou positive. Plus le nombre est élevé, plus
l’exécution de l’écouteur d’événement est rapide. Les écouteurs d’événement de priorité équivalente sont exécutés
suivant l’ordre dans lequel ils ont été ajoutés : plus l’écouteur est ajouté tôt, plus il est exécuté rapidement.
Le paramètre useWeakReference vous permet de spécifier si la référence à la fonction d’écouteur est faible ou
normale. En lui attribuant la valeur true, vous évitez les situations dans lesquelles les fonctions d’écouteurs demeurent
dans la mémoire alors qu’elles sont inutiles. Flash Player et AIR utilisent une technique appelée nettoyage pour effacer
de la mémoire les objets qui ne servent plus. Un objet est considéré comme inutilisé lorsqu’il n’apparaît dans aucune
référence. Le nettoyeur de mémoire ignore les références faibles, c’est-à-dire qu’une fonction d’écouteur vers laquelle
pointe uniquement une référence faible est incluse dans le nettoyage.
Suppression des écouteurs d’événement
La méthode removeEventListener() permet de supprimer un écouteur d’événement dont vous n’avez plus besoin.
Il est judicieux de supprimer tous les écouteurs qui ne seront plus utilisés. Les paramètres requis sont notamment
eventName et listener, soit les mêmes que ceux requis pour la méthode addEventListener(). Rappel : pour
écouter les événements pendant toutes les phases du flux d’événements, vous pouvez appeler addEventListener()
deux fois, en attribuant à useCapture la valeur true la première, puis false la seconde. Pour supprimer les deux
écouteurs d’événement, il serait nécessaire d’appeler removeEventListener() à deux reprises, la première fois en
attribuant la valeur true à useCapture, la seconde fois en utilisant la valeur false.
Distribution d’événements
La méthode dispatchEvent() peut servir aux développeurs chevronnés pour distribuer un objet événement
personnalisé dans le flux d’événements. Cette méthode accepte un seul paramètre, une référence à l’objet événement,
qui doit être une occurrence de la classe Event ou de l’une de ces sous-classes. Après distribution, la propriété target
de l’objet événement est définie avec l’objet sur lequel portait l’appel dispatchEvent().
Vérification des écouteurs d’événement existants
Les deux dernières méthodes de l’interface IEventDispatcher fournissent des informations précieuses sur l’existence
des écouteurs d’événement. La méthode hasEventListener() renvoie la valeur true si un écouteur d’événement est
détecté pour un type d’événement spécifique sur un objet particulier de la liste d’affichage. La méthode
willTrigger() renvoie également la valeur true si un écouteur est détecté pour un objet donné de la liste d’affichage.
Cependant willTrigger() vérifie les écouteurs sur l’objet d’affichage en question mais également sur tous les
ascendants de cet objet dans l’ensemble des phases du flux d’événements.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 145
Gestion des événements
Dernière mise à jour le 27/4/2013
Evénements d’erreur sans écouteurs
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Plus que les événements, les exceptions constituent le mécanisme principal de gestion des erreurs dans
ActionScript 3.0. Toutefois, la gestion des exceptions ne fonctionne pas sur les opérations asynchrones telles que les
chargements de fichiers. Si une erreur survient pendant une opération asynchrone, Flash Player et AIR distribuent un
objet événement d’erreur. Si vous ne créez pas d’écouteur pour l’événement d’erreur, les versions de débogage de Flash
Player et AIR affichent une boîte de dialogue comportant des informations sur l’erreur en question. Par exemple, la
version de débogage de Flash Player affiche la boîte de dialogue suivante, qui décrit l’erreur associée à une tentative de
chargement d’un fichier par l’application à partir d’une URL non valide :
La plupart des événements d’erreur reposent sur la classe ErrorEvent. Ils présentent donc une propriété appelée text,
qui sert au stockage du message d’erreur que Flash Player ou AIR affiche. Il existe deux exceptions : les classes
StatusEvent et NetStatusEvent. Ces deux classes possèdent une propriété level (StatusEvent.level et
NetStatusEvent.info.level). Lorsque la valeur de la propriété level est error, ces types d’événement sont
considérés comme des événements d’erreur.
Un événement d’erreur n’interrompt pas l’exécution du fichier SWF. Il se traduit uniquement par l’affichage d’une
boîte de dialogue dans les versions de débogage des navigateurs et des lecteurs autonomes, d’un message dans le
panneau de sortie du lecteur de création et d’une entrée dans le fichier journal d’Adobe Flash Builder. Aucune
manifestation n’est visible dans les autres versions de Flash Player ou AIR.
Exemple de gestion des événements : Alarm Clock
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
L’exemple Alarm Clock correspond à une horloge qui permet à l’utilisateur de déterminer l’heure à laquelle l’alarme
doit se déclencher et d’afficher un message en même temps. Il repose sur l’application SimpleClock du chapitre
« Utilisation des dates et des heures » à la page 1 et illustre de nombreux aspects de l’utilisation des événements dans
ActionScript 3.0, notamment les suivants :
• Ecoute des événements et réponse
• Notification d’un événement aux écouteurs
• Créer un type d’événement personnalisé
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 146
Gestion des événements
Dernière mise à jour le 27/4/2013
Pour obtenir les fichiers d’application Flash Professional associés à cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr. Pour obtenir les fichiers d’application Flex associés à
cet exemple, voir http://www.adobe.com/go/as3examples_fr. Les fichiers d’application Alarm Clock se trouvent dans
le dossier Samples/AlarmClock. Il s’agit des fichiers suivants :
Présentation du réveil
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans cet exemple, la principale fonctionnalité de l’horloge (dont la mesure du temps et l’affichage du cadran) réutilise
le code de l’application SimpleClock, décrite à la section « Exemple de date et heure : horloge analogique simple » à la
page 6. La classe AlarmClock étend la classe SimpleClock de cet exemple en y ajoutant la fonctionnalité de réveil
requise : réglage de l’heure de déclenchement et avertissement une fois l’alarme déclenchée.
Le rôle des événements est de fournir un avertissement lorsque se produit quelque chose. La classe AlarmClock expose
l’événement Alarme, à l’écoute duquel d’autres objets peuvent être placés afin d’effectuer les actions voulues. En outre,
la classe AlarmClock utilise une occurrence de la classe Timer pour déterminer à quel moment déclencher l’alarme.
Comme la classe AlarmClock, la classe Timer fournit un événement pour avertir d’autres objets (une occurrence de
AlarmClock dans ce cas) une fois un certain délai écoulé. Comme dans la plupart des applications ActionScript, les
événements constituent une part importante de la fonctionnalité de l’exemple Alarm Clock.
Déclenchement de l’alarme
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Comme mentionné plus haut, la seule fonctionnalité de la classe AlarmClock est liée à la définition et au
déclenchement de l’alarme. La classe intégrée Timer (flash.utils.Timer) permet au développeur de définir du code qui
sera exécuté après un délai spécifique. La classe AlarmClock utilise une occurrence de Timer pour déterminer le
moment auquel déclencher l’alarme.
Fichier Description
AlarmClockApp.mxml
ou
AlarmClockApp.fla
Fichier d’application principal dans Flash (FLA) ou Flex (MXML).
com/example/programmingas3/clock/AlarmClock.as Classe permettant d’étendre la classe SimpleClock, qui ajoute la
fonctionnalité de réveil.
com/example/programmingas3/clock/AlarmEvent.as Une classe d’événement personnalisé (sous-classe de
flash.events.Event), qui sert d’objet événement à l’événement alarm
de la classe AlarmClock.
com/example/programmingas3/clock/AnalogClockFace.as Dessine une horloge ronde et les aiguilles des heures, des minutes et
des secondes en fonction de l’heure (décrit dans l’exemple
SimpleClock).
com/example/programmingas3/clock/SimpleClock.as Composant d’interface d’horloge doté d’une fonctionnalité simple de
mesure temporelle (décrit dans l’exemple SimpleClock).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 147
Gestion des événements
Dernière mise à jour le 27/4/2013
import flash.events.TimerEvent;
import flash.utils.Timer;
/**
* The Timer that will be used for the alarm.
*/
public var alarmTimer:Timer;
...
/**
* Instantiates a new AlarmClock of a given size.
*/
public override function initClock(faceSize:Number = 200):void
{
super.initClock(faceSize);
alarmTimer = new Timer(0, 1);
alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm);
}
L’occurrence de Timer définie dans la classe AlarmClock est appelée alarmTimer. La méthode initClock(), qui
effectue les opérations de configuration nécessaires à l’occurrence de AlarmClock, exploite la variable alarmTimer de
deux manières. Tout d’abord, la variable est instanciée avec les paramètres indiquant à l’occurrence de Timer
d’attendre 0 milliseconde et de déclencher l’événement timer une seule fois. Après instanciation de alarmTimer, le
code appelle la méthode addEventListener() de cette variable pour indiquer qu’il veut écouter l’événement timer
de cette variable. Le fonctionnement d’une occurrence de Timer repose sur la distribution de l’événement timer après
un certain délai. La classe AlarmClock doit savoir quand l’événement timer est distribué afin de déclencher sa propre
alarme. En appelant addEventListener(), le code AlarmClock s’enregistre comme écouteur auprès de alarmTimer.
Les deux paramètres indiquent que la classe AlarmClock souhaite écouter l’événement timer (indiqué par la constante
TimerEvent.TIMER), et que lorsque l’événement survient, la méthode onAlarm() de la classe AlarmClock doit être
appelée en réponse à l’événement.
Pour effectivement définir l’alarme, la méthode setAlarm() de la classe AlarmClock est appelée, comme suit :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 148
Gestion des événements
Dernière mise à jour le 27/4/2013
/**
* Sets the time at which the alarm should go off.
* @param hour The hour portion of the alarm time.
* @param minutes The minutes portion of the alarm time.
* @param message The message to display when the alarm goes off.
* @return The time at which the alarm will go off.
*/
public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date
{
this.alarmMessage = message;
var now:Date = new Date();
// Create this time on today's date.
alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes);
// Determine if the specified time has already passed today.
if (alarmTime <= now)
{
alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY);
}
// Stop the alarm timer if it's currently set.
alarmTimer.reset();
// Calculate how many milliseconds should pass before the alarm should
// go off (the difference between the alarm time and now) and set that
// value as the delay for the alarm timer.
alarmTimer.delay = Math.max(1000, alarmTime.time - now.time);
alarmTimer.start();
return alarmTime;
}
Cette méthode effectue plusieurs opérations, notamment le stockage du message d’alarme et la création d’un objet
Date (alarmTime) représentant le moment réel où l’alarme se déclenchera. Point le plus important de cette étude, le
minuteur de la variable alarmTimer, dans les dernières lignes la méthode, est défini et activé. Tout d’abord, la méthode
reset() est appelée, qui arrête le minuteur et le remet à zéro s’il est déjà reparti. Ensuite, l’heure actuelle (représentée
par la variable now) est soustraite à la valeur de la variable alarmTime afin de déterminer combien de millisecondes
doivent s’écouler avant le déclenchement de l’alarme. La classe Timer ne déclenche pas l’événement timer à une heure
absolue ; c’est ce décalage relatif qui est attribué à la propriété delay d’alarmTimer. Enfin, la méthode start() est
appelée pour lancer le minuteur.
Une fois le délai spécifié écoulé, alarmTimer distribue l’événement timer. Comme la classe AlarmClock s’est
enregistrée comme écouteur auprès de sa méthode onAlarm() pour l’événement timer, lorsque celui-ci survient,
onAlarm() est appelée.
/**
* Called when the timer event is dispatched.
*/
public function onAlarm(event:TimerEvent):void
{
trace("Alarm!");
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
}
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 149
Gestion des événements
Dernière mise à jour le 27/4/2013
Lorsqu’une méthode est enregistrée comme écouteur d’événement, elle doit être définie avec la signature adaptée
(c’est-à-dire le jeu de paramètres et le type de renvoi de la méthode). Pour écouter l’événement timer de la classe
Timer, une méthode doit comporter un paramètre dont le type de données est TimerEvent (flash.event.TimerEvent),
une sous-classe de la classe Event. Lorsque l’occurrence de Timer appelle ses écouteurs d’événement, elle transmet une
occurrence de TimerEvent à l’objet événement.
Notification de l’alarme à d’autres composants
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
De même que la classe Timer, la classe AlarmClock fournit un événement qui permet de transmettre des notifications
à d’autres éléments de code lorsque l’alarme se déclenche. Pour qu’une classe puisse utiliser le système de gestion des
événements intégré à ActionScript, elle doit implémenter l’interface flash.events.IEventDispatcher. La plupart du
temps, cela se fait par extension de la classe flash.events.EventDispatcher, qui assure une implémentation standard de
IEventDispatcher (ou par extension de l’une des sous-classes de EventDispatcher). Comme décrit précédemment, la
classe AlarmClock étend la classe SimpleClock, qui (par le biais d’une chaîne d’héritage) étend la classe
EventDispatcher. Ainsi, la classe AlarmClock intègre déjà une fonctionnalité lui permettant de fournir ses propres
événements.
D’autres éléments de code peuvent s’enregistrer pour être notifiés de l’événement alarm de la classe AlarmClock en
appelant la méthode addEventListener(), héritée de EventDispatcher. Lorsqu’une occurrence de AlarmClock est
prête à notifier à d’autres éléments de code le déclenchement de l’événement alarm, elle le fait en appelant la méthode
dispatchEvent(), également héritée de EventDispatcher.
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage);
this.dispatchEvent(alarm);
Ces lignes de code sont extraites de la méthode onAlarm() de la classe AlarmClock (présentée plus haut dans son
intégralité). La méthode dispatchEvent() de l’occurrence de AlarmClock est appelée, puis elle notifie à tous les
écouteurs enregistrés le déclenchement de l’événement alarm de l’occurrence de AlarmClock. Le paramètre transmis
à dispatchEvent() est l’objet événement qui sera ensuite passé aux méthodes d’écouteur. Dans ce cas, il s’agit d’une
occurrence de la classe AlarmEvent, une sous-classe de Event créée spécialement pour cet exemple.
Elaboration d’un événement d’alarme personnalisé
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Tous les écouteurs d’événement reçoivent un paramètre d’objet événement avec des informations sur l’événement qui
a été déclenché. Dans bien des cas, l’objet événement est une occurrence de la classe Event. Dans d’autres cas
néanmoins, il s’avère utile de fournir des informations complémentaires aux écouteurs d’événement. Il suffit pour cela
de définir une nouvelle classe, sous-classe de la classe Event, et d’utiliser une occurrence de cette classe comme objet
événement. Dans cet exemple, une occurrence de AlarmEvent est utilisée comme objet événement lorsque l’événement
alarm de la classe AlarmClock est distribué. La classe AlarmEvent, présentée ici, fournit des informations
complémentaires sur l’événement alarm, à savoir le message d’alarme :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 150
Gestion des événements
Dernière mise à jour le 27/4/2013
import flash.events.Event;
/**
* This custom Event class adds a message property to a basic Event.
*/
public class AlarmEvent extends Event
{
/**
* The name of the new AlarmEvent type.
*/
public static const ALARM:String = "alarm";
/**
* A text message that can be passed to an event handler
* with this event object.
*/
public var message:String;
/**
*Constructor.
*@param message The text to display when the alarm goes off.
*/
public function AlarmEvent(message:String = "ALARM!")
{
super(ALARM);
this.message = message;
}
...
}
Le meilleur moyen de créer une classe d’objet événement personnalisée est de définir une classe qui étend la classEvent,
comme illustré dans l’exemple précédent. Pour compléter la fonctionnalité héritée, la classe AlarmEvent définit une
propriété message qui contient le texte du message d’alarme associé à l’événement. La valeur message est transmise
sous forme de paramètre au constructeur AlarmEvent. La classe AlarmEvent définit également la constante ALARM qui
peut servir à référencer l’événement (alarm) lors de l’appel de la méthode addEventListener() de la classe
AlarmClock.
Outre l’ajout de fonctionnalité, chaque sous-classe Event doit redéfinir la méthode clone() héritée dans le cadre de la
gestion des événements ActionScript. Les sous-classes Event peuvent éventuellement redéfinir la méthode
toString() afin d’inclure les propriétés de l’événement personnalisé dans la valeur renvoyée par l’appel de la méthode
toString().
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 151
Gestion des événements
Dernière mise à jour le 27/4/2013
/**
* Creates and returns a copy of the current instance.
* @return A copy of the current instance.
*/
public override function clone():Event
{
return new AlarmEvent(message);
}
/**
* Returns a String containing all the properties of the current
* instance.
* @return A string representation of the current instance.
*/
public override function toString():String
{
return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase",
"message");
}
La méthode clone() redéfinie doit renvoyer une nouvelle occurrence de la sous-classe Event personnalisée, avec
toutes les propriétés personnalisées définies pour correspondre à l’occurrence actuelle. Dans la méthode toString()
redéfinie, la méthode d’utilitaire formatToString() (héritée de Event) sert à fournir une chaîne comportant le nom
du type personnalisé, ainsi que les noms et valeurs de toutes ses propriétés.
152
Dernière mise à jour le 27/4/2013
Chapitre 9 : Utilisation de domaines
d’application
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Le rôle de la classe ApplicationDomain est de stocker un tableau des définitions ActionScript 3.0. L’ensemble du code
d’un fichier SWF est défini de sorte à exister dans un domaine d’application. Les domaines d’application servent à
partitionner les classes qui se trouvent dans un même domaine de sécurité. Ainsi, plusieurs définitions de la même
classe peuvent exister et les enfants peuvent réutiliser les définitions des parents.
Vous pouvez faire appel aux domaines d’application lors du chargement, au moyen de l’API de la classe Loader, d’un
fichier SWF externe écrit en ActionScript 3.0 (Notez que vous ne pouvez pas utiliser les domaines d’application
lorsque vous chargez une image ou un fichier SWF écrit en ActionScript 1.0 ou 2.0.) Toutes les définitions
ActionScript 3.0 contenues dans la classe chargée sont stockées dans le domaine d’application. Lorsque vous chargez
un fichier SWF, vous devez indiquer que le fichier doit être inclus dans le même domaine d’application que l’objet
Loader en attribuant au paramètre applicationDomain de l’objet LoaderContext la valeur
ApplicationDomain.currentDomain. Si vous placez le fichier SWF chargé dans le même domaine d’application,
vous pourrez accéder directement à ses classes, Cela s’avère pratique si vous chargez un fichier SWF qui contient des
médias incorporés auxquels vous pouvez accéder via les noms de classe associés, ou si vous voulez accéder aux
méthodes du fichier SWF chargé.
L’exemple suivant présuppose l’accès à un fichier Greeter.swf distinct définissant une méthode publique nommée
welcome() :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 153
Utilisation de domaines d’application
Dernière mise à jour le 27/4/2013
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class ApplicationDomainExample extends Sprite
{
private var ldr:Loader;
public function ApplicationDomainExample()
{
ldr = new Loader();
var req:URLRequest = new URLRequest("Greeter.swf");
var ldrContext:LoaderContext = new LoaderContext(false,
ApplicationDomain.currentDomain);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.load(req, ldrContext);
}
private function completeHandler(event:Event):void
{
var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as
Class;
var myGreeter:Greeter = Greeter(event.target.content);
var message:String = myGreeter.welcome("Tommy");
trace(message); // Hello, Tommy
}
}
}
Voir aussi l’exemple de classe ApplicationDomain dans le manuel Guide de référence ActionScript 3.0 pour la plateforme
Adobe Flash.
Voici d’autres points à garder à l’esprit lorsque vous utilisez les domaines d’application :
• L’ensemble du code d’un fichier SWF est défini de sorte à exister dans un domaine d’application. L’application
principale s’exécute dans le domaine d’application actif. Le domaine du système contient tous les domaines
d’application, y compris le domaine actif ; il contient donc toutes les classes Flash Player.
• A l’exception du domaine du système, tous les domaines d’application sont associés à un domaine parent. Le
domaine parent du domaine de l’application principale est le domaine du système. Les classes chargées ne sont
définies que si leur parent ne les définit pas encore. Vous ne pouvez pas remplacer une définition de classe chargée
par une définition plus récente.
Le schéma suivant illustre une application qui charge du contenu à partir de divers fichiers SWF au sein d’un domaine
unique, domain1.com. Selon le contenu chargé, différents domaines d’application peuvent être utilisés. Le texte
suivant décrit la logique utilisée pour définir le domaine d’application approprié pour chaque fichier SWF de
l’application.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 154
Utilisation de domaines d’application
Dernière mise à jour le 27/4/2013
A. Utilisation A B. Utilisation B C. Utilisation C
Le fichier principal d’application est application1.swf. Il contient des objets Loader qui chargent du contenu à partir
d’autres fichiers SWF. Dans ce scénario, le domaine d’application 1 est actif. Utilisation A, Utilisation B et
Utilisation C illustrent les différentes techniques permettant de définir le domaine d’application approprié pour
chaque fichier SWF de l’application.
Utilisation A Partitionnez le fichier SWF enfant en créant un enfant du domaine du système. Dans le schéma, le
domaine d’application 2 est créé en tant qu’enfant du domaine du système. Le fichier application2.swf est chargé dans
le domaine d’application 2 et ses définitions de classe sont ainsi partitionnées à partir des classes définies dans
application1.swf.
Cette technique s’appliquera par exemple lorsqu’une ancienne application doit charger dynamiquement une nouvelle
version de la même application sans créer de conflits. Les conflits sont éliminés parce que même si les noms de classe
sont les mêmes, ils sont répartis dans différents domaines d’application.
Le code suivant crée un domaine d’application qui est un enfant du domaine du système, puis commence à charger un
fichier SWF à l’aide de ce domaine d’application :
var appDomainA:ApplicationDomain = new ApplicationDomain();
var contextA:LoaderContext = new LoaderContext(false, appDomainA);
var loaderA:Loader = new Loader();
loaderA.load(new URLRequest("application2.swf"), contextA);
Utilisation B Ajoutez de nouvelles définitions de classe aux définitions actuelles. Le domaine d’application de
module1.swf est défini sur le domaine actif (Domaine d’application 1). Vous pouvez alors ajouter au jeu actuel de
définitions de classe de l’application de nouvelles définitions de classe. Cela pourrait servir pour une bibliothèque
d’exécution partagée appartenant à l’application principale. Le fichier SWF est traité comme une bibliothèque partagée
distante (RSL, remote shared library). Utilisez cette technique pour charger des RSL à l’aide d’un fichier de
préchargement avant le lancement de l’application.
Le code suivant charge un fichier SWF, en définissant son domaine d’application sur le domaine actif :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 155
Utilisation de domaines d’application
Dernière mise à jour le 27/4/2013
var appDomainB:ApplicationDomain = ApplicationDomain.currentDomain;
var contextB:LoaderContext = new LoaderContext(false, appDomainB);
var loaderB:Loader = new Loader();
loaderB.load(new URLRequest("module1.swf"), contextB);
Utilisation C Utilisez les définitions de classe du parent en ajoutant un nouveau domaine enfant au domaine actif. Le
domaine d’application de module3.swf est un enfant du domaine actif, qui utilise pour toutes les classes les versions
du parent. Cette technique peut s’appliquer à un module d’une application Internet riche (RIA, Rich Internet
Application) à plusieurs écrans, qui serait chargé comme enfant de l’application principale et utiliserait les types de
cette dernière. Si vous pouvez garantir que toutes les classes sont toujours mises à jour pour rester compatibles avec les
anciennes versions et que l’application de chargement est toujours plus récente que les contenus qu’elle charge, les
enfants utiliseront les versions des parents. L’utilisation d’un nouveau domaine d’application permet également de
décharger toutes les définitions de classe en vue du nettoyage, à condition de veiller à ce qu’il ne subsiste aucune
référence au fichier SWF enfant.
Cette technique autorise les modules chargés à partager les objets Singleton et les membres de classe statiques de l’objet
Loader.
Le code suivant crée un domaine enfant dans le domaine actif et commence à charger un fichier SWF à l’aide de ce
domaine d’application :
var appDomainC:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
var contextC:LoaderContext = new LoaderContext(false, appDomainC);
var loaderC:Loader = new Loader();
loaderC.load(new URLRequest("module3.swf"), contextC);
156
Dernière mise à jour le 27/4/2013
Chapitre 10 : Programmation de
l’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La programmation des éléments visuels dans Adobe® ActionScript® 3.0 repose sur l’utilisation des objets d’affichage
sur la scène. Vous pouvez, par exemple, ajouter, déplacer, supprimer et trier les objets d’affichage, appliquer des filtres
et des masques, dessiner des vecteurs et des graphiques bitmap, et exécuter des transformations en trois dimensions
par le biais de l’API de programmation de l’affichage ActionScript. Les classes principales permettant de programmer
l’affichage font partie du package flash.display.
Remarque : Adobe® AIR™ fournit l’objet HTMLoader pour rendre et afficher un contenu HTML. L’objet HTMLLoader
effectue le rendu des éléments visuels du DOM HTML en tant qu’objet d’affichage unique. Il est impossible d’accéder
directement à chaque élément du DOM par le biais de la hiérarchie de la liste d’affichage ActionScript. Vous accédez aux
éléments du DOM à l’aide de l’API DOM distincte proposée par l’objet HTMLLoader.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 157
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Concepts fondamentaux de la programmation de
l’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Chaque application créée par le biais d’ActionScript 3.0 possède une hiérarchie d’objets d’affichage appelée liste
d’affichage, comme l’indique l’illustration ci-dessous. La liste d’affichage contient tous les éléments visibles de
l’application.
Comme le montre cette illustration, les éléments d’affichage se rangent dans un ou plusieurs groupes suivants :
• Scène
La scène constitue le conteneur de base des objets d’affichage. Chaque application comporte un objet Stage, qui
contient tous les objets d’affichage à l’écran. La scène correspond au conteneur de plus haut niveau et domine la
hiérarchie de la liste d’affichage :
Chaque fichier SWF est associé à une classe ActionScript, appelée classe principale du fichier SWF. Lorsqu’un fichier
SWF s’ouvre dans Flash Player ou Adobe AIR, Flash Player ou AIR appelle la fonction constructeur correspondant
à la classe et l’occurrence créée (systématiquement un type d’objet d’affichage) est ajoutée en tant qu’enfant de
l’objet Stage. La classe principale d’un fichier SWF étend systématiquement la classe Sprite (pour plus
d’informations, voir « Avantages de l’utilisation de la liste d’affichage » à la page 162).
Vous pouvez accéder à la scène via la propriété stage de toute occurrence de DisplayObject. Pour plus
d’informations, voir « Définition des propriétés de la scène » à la page 171.
• Objets d’affichage
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 158
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Dans ActionScript 3.0, tous les éléments qui apparaissent à l’écran dans une application sont des types d’objets
d’affichage. Le package flash.display comprend une classe DisplayObject, qui correspond à une classe de base
étendue par diverses autres classes. Ces autres classes représentent divers types d’objets d’affichage, tels que les
formes vectorielles, les clips et les champs de texte, pour n’en citer que quelques-uns. Pour une présentation de ces
classes, voir « Avantages de l’utilisation de la liste d’affichage » à la page 162.
• Conteneurs d’objets d’affichage
Les conteneurs d’objets d’affichage sont des types spéciaux d’objets d’affichage qui, outre leur propre représentation
visuelle, peuvent également comporter des objets enfant qui sont aussi des objets d’affichage.
La classe DisplayObjectContainer est une sous-classe de la classe DisplayObject. Un objet DisplayObjectContainer
peut contenir plusieurs objets d’affichage dans la liste d’enfants correspondante. Par exemple, l’illustration suivante
contient un type d’objet DisplayObjectContainer appelé Sprite qui comporte divers objets d’affichage :
A. Objet SimpleButton. Ce type d’objet d’affichage possède des états « up », « down » et « over ». B. Objet Bitmap. Dans ce cas de figure,
l’objet Bitmap a été chargé à partir d’un JPEG externe via un objet Loader. C. Objet Shape. Le « cadre d’image » contient un rectangle
arrondi dessiné dans ActionScript. Un filtre Ombre portée est appliqué à cet objet Shape. D. Objet TextField.
Dans le contexte des objets d’affichage, les objets DisplayObjectContainer portent également le nom de conteneurs
d’objets d’affichage voire, tout simplement, de conteneurs. Comme indiqué précédemment, la scène est un
conteneur d’objets d’affichage.
Bien que tous les objets d’affichage visibles héritent leurs caractéristiques de la classe DisplayObject, le type de
chacun d’eux correspond à une sous-classe déterminée de la classe DisplayObject. Il existe, par exemple, une
fonction constructeur associée à la classe Shape ou à la classe Video, mais aucune fonction constructeur pour la
classe DisplayObject.
Concepts importants et terminologie
La liste de référence suivante contient des termes importants utilisés dans le cadre de la programmation des graphiques
ActionScript :
Alpha Valeur colorimétrique représentant le montant de transparence (ou, plus précisément, le montant d’opacité)
d’une couleur. Ainsi, une couleur dotée d’une valeur de canal alpha de 60 % n’affiche que 60 % de son intensité totale
et est transparente à 40 %.
Graphique bitmap Graphique défini en termes informatiques sous forme de grille (lignes et colonnes) de pixels de
couleur. Les exemples courants de graphiques bitmap incluent les photos numériques et images similaires.
A
B
C D
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 159
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Mode de fondu Indique l’interaction requise du contenu de deux images qui se chevauchent. En règle générale, une
image opaque superposée à une autre image se contente de bloquer l’image placée sous elle, qui est donc totalement
invisible. Toutefois, divers modes de fondu entraînent le mélange des couleurs de diverses façons de sorte que le
résultat corresponde à une combinaison des deux images.
Liste d’affichage Hiérarchie des objets d’affichage rendus sous forme de contenu visible à l’écran par Flash Player
et AIR. La scène correspond à la racine de la liste d’affichage et tous les objets d’affichage associés à la scène ou à l’un
de ses enfants composent la liste d’affichage (même si l’objet n’est pas à proprement parler rendu, parce qu’il réside en
dehors de la scène, par exemple).
Objet d’affichage Objet représentant un type de contenu visuel dans Flash Player ou AIR. La liste d’affichage ne
contient que des objets d’affichage et toutes les classes d’objets d’affichage sont des sous-classes de la classe
DisplayObject.
Conteneur d’objet d’affichage Type spécial d’objet d’affichage qui, outre (généralement) sa propre représentation
visuelle, peut comporter des objets d’affichage enfant.
Classe principale du fichier SWF Classe qui définit le comportement de l’objet d’affichage de plus haut niveau d’un
fichier SWF, soit, fondamentalement, la classe associée au fichier SWF en tant que tel. Ainsi, dans un fichier SWF
généré dans un outil de création Flash, la classe principale correspond à la classe du document. Elle possède un
« scénario principal » qui intègre tous les autres scénarios. La classe principale du fichier SWF correspond à la classe
dont le scénario principal est une occurrence.
Masquage Technique consistant à ne pas afficher certaines parties d’une image (ou, à l’inverse, à n’afficher que
certaines parties d’une image). Les sections de l’image masque deviennent transparentes, afin d’assurer la visibilité du
contenu sous-jacent. Ce terme se réfère à la bande utilisée par un peintre en bâtiment pour empêcher la peinture d’être
appliquée à certaines sections.
Scène Conteneur visuel correspondant à la base ou à l’arrière-plan de tout contenu visuel dans un fichier SWF.
Transformation Modification des caractéristiques visuelles d’un graphique (rotation de l’objet, modification de son
échelle, désalignement, déformation ou altération de sa couleur).
Graphique vectoriel Graphique défini en termes informatiques par des lignes et des formes dessinées en fonction de
caractéristiques déterminées (épaisseur, longueur, taille, angle et position, par exemple).
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 160
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Classes d’affichage de base
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Le package flash.display ActionScript 3.0 contient des classes destinées aux objets visuels susceptibles d’apparaître
dans Flash Player ou AIR. L’illustration suivante identifie les relations entre les sous-classes de ces classes d’objets
d’affichage de base.
L’illustration indique ce dont héritent les classes d’objets d’affichage. Notez que certaines de ces classes, en particulier
StaticText, TextField et Video, ne figurent pas dans le package flash.display, mais héritent toutefois des caractéristiques
de la classe DisplayObject.
Toutes les classes qui étendent la classe DisplayObject héritent de ses méthodes et propriétés. Pour plus
d’informations, voir « Propriétés et méthodes de la classe DisplayObject » à la page 165.
Vous pouvez créer une occurrence d’un objet des classes suivantes, qui figurent dans le package flash.display :
• Bitmap : la classe Bitmap permet de définir des objets bitmap, qu’ils soient chargés à partir de fichiers externes ou
rendus via ActionScript. Vous pouvez charger des bitmaps à partir de fichiers externes par le biais de la classe
Loader. Libre à vous de charger des fichiers GIF, JPG ou PNG. Vous pouvez également créer un objet BitmapData
à partir de données personnalisées, puis créer un objet Bitmap qui utilise ces données. Les méthodes de la classe
BitmapData permettent de modifier les bitmaps, qu’ils soient chargés ou créés dans ActionScript. Pour plus
d’informations, voir « Chargement d’objets d’affichage » à la page 206 et le chapitre « Utilisation des images
bitmap » à la page 251.
• Loader : la classe Loader permet de charger des ressources externes (fichiers SWF ou graphiques). Pour plus
d’informations, voir « Chargement dynamique du contenu d’affichage » à la page 205.
• Shape : la classe Shape permet de créer des graphiques vectoriels, tels que des rectangles, des lignes, des cercles, etc.
Pour plus d’informations, voir « Utilisation de l’API de dessin » à la page 230.
• SimpleButton : un objet SimpleButton est une représentation ActionScript d’un symbole de bouton créé dans l’outil
de programmation Flash. Une occurrence de SimpleButton est dotée de quatre états de bouton : « up », « down »,
« over » et « hit test » (zone qui réagit aux événements souris et clavier).
MorphShape
DisplayObject
AVM1Movie Shape StaticText Video
DisplayObjectContainer TextField
Bitmap InteractiveObject
SimpleButton
Loader Stage
MovieClip
Sprite
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 161
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
• Sprite : un objet Sprite peut contenir des graphiques qui lui sont propres, ainsi que des objets d’affichage enfant (la
classe Sprite étend la classe DisplayObjectContainer). Pour plus d’informations, voir « Utilisation de conteneurs
d’objets d’affichage » à la page 165 et « Utilisation de l’API de dessin » à la page 230.
• MovieClip : un objet MovieClip est la forme ActionScript d’un symbole de clip créé dans l’outil de programmation
Flash. En pratique, un objet MovieClip est similaire à un objet Sprite, à une exception près : il possède également
un scénario. Pour plus d’informations, voir « Utilisation des clips » à la page 333.
Les classes suivantes, qui ne figurent pas dans le package flash.display, sont des sous-classes de la classe DisplayObject :
• La classe TextField, qui figure dans le package flash.text, est un objet d’affichage destiné à l’affichage et à la saisie de
texte. Pour plus d’informations, voir « Principes de base de l’utilisation du texte » à la page 383.
• La classe TextLine, qui figure dans le package flash.text.engine, correspond à l’objet d’affichage permettant
d’afficher des lignes de texte composées par Flash Text Engine et Text Layout Framework. Pour plus
d’informations, voir « Utilisation de Flash Text Engine » à la page 410 et « Utilisation de Text Layout Framework »
à la page 440.
• La classe Video, qui figure dans le package flash.media, correspond à l’objet d’affichage utilisé pour afficher des
fichiers vidéo. Pour plus d’informations, voir « Utilisation de la vidéo » à la page 489.
Les classes suivantes du package flash.display étendent la classe DisplayObject, mais il est impossible d’en créer une
occurrence. Parce qu’elles combinent des fonctionnalités communes en une classe unique, elles servent plutôt de
classes parent à d’autres objets d’affichage.
• AVM1Movie : la classe AVM1Movie permet de représenter des fichiers SWF chargés créés dans ActionScript 1.0
et 2.0.
• DisplayObjectContainer : les classes Loader, Stage, Sprite et MovieClip étendent chacune la classe
DisplayObjectContainer. Pour plus d’informations, voir « Utilisation de conteneurs d’objets d’affichage » à la
page 165.
• InteractiveObject : classe de base de tous les objets utilisés pour interagir avec la souris et le clavier. Les objets
SimpleButton, TextField, Loader, Sprite, Stage et MovieClip sont tous des sous-classes de la classe
InteractiveObject. Pour plus d’informations sur la création d'une interaction de souris ou de clavier, voir
« Principes de base de l’interaction utilisateur » à la page 574.
• MorphShape : ces objets sont générés lors de la création d’une interpolation de forme dans l’outil de
programmation Flash. Il est impossible d’en créer des occurrences par le biais d’ActionScript, mais vous pouvez y
accéder dans la liste d’affichage.
• Scène : la classe Stage étend la classe DisplayObjectContainer. Il n’existe qu’une seule occurrence de scène par
application, et elle figure au sommet de la hiérarchie de la liste d’affichage. Vous pouvez accéder à la scène via la
propriété stage de toute occurrence de DisplayObject. Pour plus d’informations, voir « Définition des propriétés
de la scène » à la page 171.
Par ailleurs, la classe StaticText, qui figure dans le package flash.text, étend la classe DisplayObject, mais il est
impossible d’en créer une occurrence dans du code. Les champs de texte statique sont créés dans Flash uniquement.
Les classes suivantes ne sont ni des objets d’affichage, ni des conteneurs d’objets d’affichage et n’apparaissent pas dans
la liste d’affichage, mais affichent des graphiques sur la scène. Elles dessinent des éléments dans un rectangle, appelé
fenêtre d’affichage, positionné relativement à la scène.
• StageVideo : la classe StageVideo affiche le contenu vidéo en faisant appel, dans la mesure du possible, à
l’accélération matérielle. Cette classe est disponible à partir de Flash Player 10.2. Pour plus d’informations, voir
« Présentation à accélération matérielle par le biais de la classe StageVideo » à la page 528.
• StageWebView : la classe StageWebView affiche le contenu HTML. Elle est prise en charge depuis la version 2.5
d’AIR. Pour plus d’informations, voir « Objets StageWebView » à la page 1068.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 162
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Les classes fl.display suivantes proposent des fonctionnalités équivalentes à celles des classes flash.display.Loader et
LoaderInfo. Utilisez-les au lieu des classes flash.display équivalentes en cas de développement dans l’environnement
Flash Professional (CS5.5 ou ultérieur). Dans cet environnement, ces classes permettent de résoudre les problèmes liés
à TLF avec préchargement RSL. Pour plus d’informations, voir « Utilisation des classes ProLoader et ProLoaderInfo »
à la page 210.
• fl.display.ProLoader : équivalente à flash.display.Loader
• fl.display.ProLoaderInfo : équivalente à flash.display.LoaderInfo
Avantages de l’utilisation de la liste d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans ActionScript 3.0, des classes distinctes sont réservées aux différents types d’objets d’affichage. Dans
ActionScript 1.0 et 2.0, un grand nombre de types d’objets identiques sont inclus dans une même classe : MovieClip.
Cette individualisation des classes et la structure hiérarchique des listes d’affichage présentent les avantages suivants :
• Rendu plus efficace et utilisation réduite de la mémoire
• Gestion optimisée de la profondeur
• Parcours entier de la liste d’affichage
• Objets d’affichage absents de la liste
• Classement simplifié en sous-classes des objets d’affichage
Rendu plus efficace et taille réduite des fichiers
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans ActionScript 1.0 et 2.0, vous ne pouvez dessiner des formes que dans un objet MovieClip. ActionScript 3.0
intègre des classes d’objets d’affichage plus simples, dans lesquelles vous pouvez dessiner des formes. Parce que ces
classes d’objets d’affichage ActionScript 3.0 ne contiennent pas le jeu complet de méthodes et propriétés associées à un
objet MovieClip, elles mobilisent moins de ressources en mémoire et processeur.
Par exemple, à l’encontre d’un objet Shape, chaque objet MovieClip comporte des propriétés associées au scénario du
clip. Les propriétés de gestion du scénario font parfois appel à un volume considérable de ressources en mémoire et
processeur. Dans ActionScript 3.0, l’utilisation de l’objet Shape se traduit par une amélioration des performances.
L’objet Shape nécessite moins de ressources que l’objet MovieClip, plus complexe. Flash Player et AIR n’ont pas besoin
de gérer les propriétés MovieClip inutilisées, optimisant ainsi la vitesse et réduisant les besoins de mémoire de l’objet.
Gestion optimisée de la profondeur
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans ActionScript 1.0 et 2.0, la profondeur était gérée par un système et des méthodes de gestion linéaire de la
profondeur, tels que getNextHighestDepth().
ActionScript 3.0 comprend la classe DisplayObjectContainer, dont les méthodes et propriétés sont mieux adaptées à
la gestion de la profondeur des objets d’affichage.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 163
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Dans ActionScript 3.0, lorsque vous déplacez un objet d’affichage au sein de la liste des enfants d’une occurrence de
DisplayObjectContainer, les autres enfants du conteneur d’objets d’affichage sont automatiquement repositionnés et
des positions d’index enfant appropriées leur sont affectées dans le conteneur d’objets d’affichage.
Par ailleurs, ActionScript 3.0 permet systématiquement de détecter tous les objets enfant de tout conteneur d’objets
d’affichage. Chaque occurrence de DisplayObjectContainer possède une propriété numChildren, qui indique le
nombre d’enfants figurant dans le conteneur d’objets d’affichage. Puisque la liste des enfants d’un conteneur d’objets
d’affichage correspond systématiquement à une liste indexée, vous pouvez examiner chaque objet de la liste de la
position d’index 0 à la dernière position d’index (numChildren - 1). Cette technique n’était pas proposée par les
méthodes et propriétés d’un objet MovieClip dans ActionScript 1.0 et 2.0.
ActionScript 3.0 permet de parcourir aisément et séquentiellement la liste d’affichage, car les numéros d’index de la
liste des enfants d’un conteneur d’objets d’affichage se suivent. Parcourir la liste d’affichage et gérer la profondeur des
objets est désormais beaucoup plus simple que dans ActionScript 1.0 et 2.0. Dans ActionScript 1.0 et 2.0, un clip
pouvait en effet contenir des objets dont l’ordre de profondeur n’était pas séquentiel, ce qui rendait parfois le parcours
de la liste d’objets difficile. Dans ActionScript 3.0, chaque liste d’enfants d’un conteneur d’objets d’affichage est mise
en cache en interne sous forme de tableau, ce qui permet des recherches extrêmement rapides (par index). Passer en
boucle sur tous les enfants d’un conteneur d’objets d’affichage s’avère également très rapide.
Dans ActionScript 3.0, vous pouvez également accéder aux enfants d’un conteneur d’objets d’affichage par le biais de
la méthode getChildByName() de la classe DisplayObjectContainer.
Parcours entier de la liste d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript 1.0 et 2.0 ne vous permettaient pas d’accéder à certains objets, telles les formes vectorielles, dessinées dans
l’outil de programmation Flash. Dans ActionScript 3.0, vous pouvez accéder à tous les objets de la liste d’affichage,
qu’ils aient été créés en ActionScript ou dans l’outil de programmation Flash. Pour plus d’informations, voir
« Parcours de la liste d’affichage » à la page 169.
Objets d’affichage absents de la liste
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
ActionScript 3.0 permet de créer des objets d’affichage qui ne figurent pas dans la liste d’affichage visible. Ils portent
le nom d’objets d’affichage hors liste. Un objet d’affichage n’est ajouté à la liste d’affichage visible que lorsque vous
appelez la méthode addChild() ou addChildAt() d’une occurrence de DisplayObjectContainer qui a déjà été
intégrée à la liste d’affichage.
Les objets d’affichage hors liste permettent d’assembler des objets d’affichage complexes, tels que ceux qui possèdent
plusieurs conteneurs d’objets d’affichage comportant plusieurs objets d’affichage. En n’intégrant pas à la liste des
objets d’affichage, vous pouvez assembler des objets complexes sans avoir à effectuer leur rendu. Vous économisez
ainsi le temps de traitement correspondant. Vous pouvez alors ajouter un objet hors liste à la liste d’affichage au
moment voulu. Il est également possible d’intégrer un enfant d’un conteneur d’objets d’affichage à la liste d’affichage,
puis de l’en extraire ou d’en modifier la position dans cette dernière, le cas échéant.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 164
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Classement simplifié en sous-classes des objets d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Dans ActionScript 1.0 et 2.0, il était souvent nécessaire d’ajouter de nouveaux objets MovieClip à un fichier SWF pour
créer des formes de base ou afficher des bitmaps. Dans ActionScript 3.0, la classe DisplayObject comprend un grand
nombre de sous-classes intégrées, telles que Shape et Bitmap. Parce que les classes d’ActionScript 3.0 sont plus
spécialisées pour des types spécifiques d’objets, il est plus simple de créer des sous-classes de base des classes intégrées.
Par exemple, pour dessiner un cercle dans ActionScript 2.0, vous pourriez créer une classe CustomCircle qui étend la
classe MovieClip lors de la création d’une occurrence d’un objet de la classe personnalisée. Néanmoins, cette classe
comprendrait également diverses propriétés et méthodes émanant de la classe MovieClip (telles que totalFrames) qui
ne s’appliquent pas à elle. Dans ActionScript 3.0, vous pouvez toutefois créer une classe CustomCircle qui étend l’objet
Shape et, de ce fait, ne comprend pas les propriétés et méthodes sans rapport contenues dans la classe MovieClip. Le
code suivant illustre un exemple de classe CustomCircle :
import flash.display.*;
public class CustomCircle extends Shape
{
var xPos:Number;
var yPos:Number;
var radius:Number;
var color:uint;
public function CustomCircle(xInput:Number,
yInput:Number,
rInput:Number,
colorInput:uint)
{
xPos = xInput;
yPos = yInput;
radius = rInput;
color = colorInput;
this.graphics.beginFill(color);
this.graphics.drawCircle(xPos, yPos, radius);
}
}
Utilisation des objets d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Maintenant que vous maîtrisez les bases de la scène, des objets d’affichage, des conteneurs d’objets d’affichage et de la
liste d’affichage, cette section contient des informations plus détaillées relatives à l’utilisation des objets d’affichage
dans ActionScript 3.0.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 165
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Propriétés et méthodes de la classe DisplayObject
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Tous les objets d’affichage sont des sous-classes de la classe DisplayObject et, de ce fait, héritent des propriétés et
méthodes de cette dernière. Les propriétés dont ils héritent correspondent aux propriétés de base qui s’appliquent à
tous les objets d’affichage. Par exemple, chaque objet d’affichage possède une propriété x et une propriété y qui
indiquent sa position dans son conteneur d’objets d’affichage.
Il est impossible de créer une occurrence de DisplayObject à l’aide du constructeur de la classe DisplayObject. Vous
devez créer un autre type d’objet (un objet qui est une sous-classe de la classe DisplayObject), tel Sprite, pour créer une
occurrence d’objet par le biais de l’opérateur new. Par ailleurs, pour créer une classe d’objet d’affichage personnalisée,
vous devez créer une sous-classe de l’une des sous-classes d’objets d’affichage ayant une fonction constructeur
utilisable (telle que la classe Shape ou la classe Sprite). Pour plus d’informations, voir la description de la classe
DisplayObject dans le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe Flash.
Ajout d’objets d’affichage à la liste d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque vous créez une occurrence d’un objet d’affichage, elle n’apparaît pas à l’écran (sur la scène) tant que vous ne
l’avez pas ajoutée à un conteneur d’objets d’affichage figurant dans la liste d’affichage. Par exemple, dans le code
suivant, l’objet myText TextField n’est pas visible si vous omettez la dernière ligne de code. Dans la dernière ligne de
code, le mot-clé this doit se référer à un conteneur d’objets d’affichage figurant déjà dans la liste d’affichage.
import flash.display.*;
import flash.text.TextField;
var myText:TextField = new TextField();
myText.text = "Buenos dias.";
this.addChild(myText);
Lorsque vous ajoutez un élément visuel à la scène, il devient un enfant de cette dernière. Le premier fichier SWF chargé
dans une application (tel celui intégré à une page HTML) est automatiquement ajouté en tant qu’enfant de la scène. Il
peut s’agir de n’importe quel type d’objet qui étend la classe Sprite.
Tout objet d’affichage créé sans utiliser ActionScript (par exemple en ajoutant une balise MXML dans un fichier
MXML Flex ou en plaçant un élément sur la scène dans Flash Professional) est ajouté à la liste d’affichage. Bien que
vous n’ajoutiez pas ces objets d’affichage par le biais d’ActionScript, vous pouvez y accéder via ActionScript. Par
exemple, le code suivant règle la largeur d’un objet appelé button1, qui a été ajouté dans l’outil de programmation (et
non via ActionScript) :
button1.width = 200;
Utilisation de conteneurs d’objets d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Si un objet DisplayObjectContainer est supprimé de la liste d’affichage ou s’il est transféré ou transformé d’une autre
façon, chaque objet d’affichage de DisplayObjectContainer est également supprimé, transféré ou transformé.
Un conteneur d’objets d’affichage correspond à un type d’objet d’affichage et peut être ajouté à un autre conteneur
d’objets d’affichage. Par exemple, l’image suivante illustre un conteneur d’objets d’affichage, pictureScreen, qui
comporte une forme de contour et quatre autres conteneurs d’objets d’affichage (de type PictureFrame) :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 166
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
A. Forme définissant la bordure du conteneur d’objets d’affichage pictureScreen B. Quatre conteneurs d’objets d’affichage, qui sont des enfants
de l’objet pictureScreen
Pour qu’un objet d’affichage apparaisse dans la liste d’affichage, vous devez l’ajouter à un conteneur d’objets
d’affichage figurant dans la liste d’affichage. A cet effet, vous utilisez la méthode addChild() ou la méthode
addChildAt() de l’objet conteneur. Par exemple, sans la dernière ligne du code suivant, l’objet myTextField ne
s’afficherait pas :
var myTextField:TextField = new TextField();
myTextField.text = "hello";
this.root.addChild(myTextField);
Dans cet exemple de code, this.root pointe vers le conteneur d’objets d’affichage MovieClip qui comporte le code.
Dans votre propre code, vous pouvez stipuler un autre conteneur.
A B
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 167
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Utilisez la méthode addChildAt() pour ajouter l’enfant à une position déterminée de la liste des enfants du conteneur
d’objets d’affichage. Ces positions d’index basées sur zéro dans la liste des enfants se réfèrent à l’ordre d’apparition (de
l’avant à l’arrière) des objets d’affichage. Considérons par exemple les trois objets d’affichage suivants. Chaque objet a
été créé à partir d’une classe personnalisée appelée Ball.
L’ordre d’apparition de ces objets d’affichage dans leur conteneur peut être modifié par le biais de la méthode
addChildAt(). Considérons par exemple le code qui suit :
ball_A = new Ball(0xFFCC00, "a");
ball_A.name = "ball_A";
ball_A.x = 20;
ball_A.y = 20;
container.addChild(ball_A);
ball_B = new Ball(0xFFCC00, "b");
ball_B.name = "ball_B";
ball_B.x = 70;
ball_B.y = 20;
container.addChild(ball_B);
ball_C = new Ball(0xFFCC00, "c");
ball_C.name = "ball_C";
ball_C.x = 40;
ball_C.y = 60;
container.addChildAt(ball_C, 1);
Une fois ce code exécuté, les objets d’affichage sont placés comme suit dans l’objet DisplayObjectContainer
container. Notez l’ordre d’apparition des objets.
Pour placer un objet en tête de la liste d’affichage, il suffit de l’ajouter à nouveau à celle-ci. Par exemple, après le code
précédent, utilisez la ligne de code suivante pour placer ball_A en première position dans la pile :
container.addChild(ball_A);
Ce code supprime ball_A de son emplacement actuel dans la liste d’affichage de container, et l’ajoute ensuite au
sommet de la liste, ce qui a pour effet de le placer en haut de l’empilement d’objets.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 168
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Vous disposez de la méthode getChildAt() pour vérifier l’ordre d’apparition des objets d’affichage. La méthode
getChildAt() renvoie les objets enfant d’un conteneur en fonction du numéro d’index transmis. Par exemple, le code
suivant révèle le nom des objets d’affichage placés à des positions diverses dans la liste des enfants de l’objet
DisplayObjectContainer container :
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_C
trace(container.getChildAt(2).name); // ball_B
Si vous supprimez un objet d’affichage de la liste des enfants de son conteneur parent, les éléments de la liste ayant un
indice plus élevé descendent tous d’une position dans l’index des enfants. Ainsi, si nous reprenons l’exemple
précédent, le code ci-après illustre le transfert de l’objet d’affichage qui occupait la position 2 dans l’objet
DisplayObjectContainer container vers la position 1 suite à la suppression d’un objet d’affichage occupant une
position inférieure dans la liste d’enfants :
container.removeChild(ball_C);
trace(container.getChildAt(0).name); // ball_A
trace(container.getChildAt(1).name); // ball_B
Les méthodes removeChild() et removeChildAt() ne suppriment pas entièrement une occurrence d’objet
d’affichage. Elles se contentent de la supprimer de la liste des enfants du conteneur. Une autre variable peut continuer
à faire référence à l’occurrence (utilisez l’opérateur delete pour supprimer totalement un objet).
Un objet d’affichage ne possédant qu’un seul conteneur parent, vous ne pouvez ajouter une occurrence d’objet
d’affichage qu’à un seul conteneur d’objets d’affichage. Par exemple, le code suivant indique que l’objet d’affichage tf1
ne peut figurer que dans un seul conteneur (soit, dans ce cas, un Sprite, qui étend la classe DisplayObjectContainer) :
tf1:TextField = new TextField();
tf2:TextField = new TextField();
tf1.name = "text 1";
tf2.name = "text 2";
container1:Sprite = new Sprite();
container2:Sprite = new Sprite();
container1.addChild(tf1);
container1.addChild(tf2);
container2.addChild(tf1);
trace(container1.numChildren); // 1
trace(container1.getChildAt(0).name); // text 2
trace(container2.numChildren); // 1
trace(container2.getChildAt(0).name); // text 1
Si vous ajoutez à un conteneur d’objets d’affichage un objet qui est déjà contenu dans un autre conteneur d’objets
d’affichage, l’objet sera supprimé de la liste des enfants de ce dernier.
Outre les méthodes décrites précédemment, la classe DisplayObjectContainer définit plusieurs méthodes d’utilisation
des objets d’affichage enfant, notamment :
• contains() : détermine si un objet d’affichage est un enfant d’un objet DisplayObjectContainer.
• getChildByName() : extrait un objet d’affichage en fonction de son nom.
• getChildIndex() : renvoie la position d’index d’un objet d’affichage.
• setChildIndex() : modifie la position d’un objet d’affichage enfant.
• removeChildren() : supprime plusieurs objets d’affichage enfants.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 169
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
• swapChildren() : permute l’ordre de deux objets d’affichage.
• swapChildrenAt() : permute l’ordre de deux objets d’affichage définis en fonction de leur valeur d’index.
Pour plus d’informations, voir les entrées pertinentes du manuel Guide de référence ActionScript 3.0 pour la plateforme
Adobe Flash.
N’oubliez pas qu’un objet d’affichage qui ne figure pas dans la liste d’affichage (donc, qui ne se trouve pas dans un
conteneur d’objets d’affichage enfant de la scène) est appelé objet d’affichage hors liste.
Parcours de la liste d’affichage
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Comme nous l’avons vu, la liste d’affichage est une structure en arborescence. Au sommet de l’arborescence figure la
scène, qui peut comporter plusieurs objets d’affichage. Les objets d’affichage qui sont eux-mêmes des conteneurs
d’objets d’affichage peuvent contenir d’autres objets d’affichage, voire des conteneurs d’objets d’affichage.
La classe DisplayObjectContainer comporte des propriétés et méthodes de parcours de la liste d’affichage, par le biais
des listes d’enfants des conteneurs d’objets d’affichage. Considérons par exemple le code suivant, qui ajoute deux
objets d’affichage, title et pict, à l’objet container (qui est un Sprite, et la classe Sprite étend la classe
DisplayObjectContainer) :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 170
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
var container:Sprite = new Sprite();
var title:TextField = new TextField();
title.text = "Hello";
var pict:Loader = new Loader();
var url:URLRequest = new URLRequest("banana.jpg");
pict.load(url);
pict.name = "banana loader";
container.addChild(title);
container.addChild(pict);
La méthode getChildAt() renvoie l’enfant de la liste d’affichage à une position d’index déterminée :
trace(container.getChildAt(0) is TextField); // true
Vous pouvez également accéder aux objets enfant en indiquant leur nom. Chaque objet d’affichage possède un nom,
qui est attribué par défaut par Flash Player ou AIR (tel « instance1 ») si vous ne l’attribuez pas vous-même. Par
exemple, le code suivant indique comment utiliser la méthode getChildByName() pour accéder à un objet d’affichage
enfant portant le nom « banana loader » :
trace(container.getChildByName("banana loader") is Loader); // true
L’utilisation de la méthode getChildByName() entraîne parfois un ralentissement des performances par rapport à la
méthode getChildAt().
Puisque la liste d’affichage d’un conteneur d’objets d’affichage peut contenir d’autres conteneurs d’objets d’affichage
en tant qu’objets enfant, vous pouvez parcourir la liste d’affichage complète de l’application sous forme
d’arborescence. Par exemple, dans l’extrait de code illustré précédemment, une fois l’opération de chargement de
l’objet Loader pict terminée, un objet d’affichage enfant (l’image bitmap) de l’objet pict est chargé. Pour accéder à
cet objet d’affichage bitmap, vous pouvez écrire pict.getChildAt(0). Vous pouvez également écrire
container.getChildAt(0).getChildAt(0) (puisque container.getChildAt(0) == pict).
La fonction suivante génère un extrait trace() en retrait de la liste d’affichage d’un conteneur d’objets d’affichage :
function traceDisplayList(container:DisplayObjectContainer,indentString:String = ""):void
{
var child:DisplayObject;
for (var i:uint=0; i < container.numChildren; i++)
{
child = container.getChildAt(i);
trace(indentString, child, child.name);
if (container.getChildAt(i) is DisplayObjectContainer)
{
traceDisplayList(DisplayObjectContainer(child), indentString + "")
}
}
}
Adobe Flex
Si vous utilisez Flex, notez que cette application définit un grand nombre de classes d’objets d’affichage de composant
et que celles-ci priment sur les méthodes d’accès à la liste d’affichage de la classe DisplayObjectContainer. Par exemple,
la classe Container du package mx.core prime sur la méthode addChild() et autres méthodes de la classe
DisplayObjectContainer (étendue par la classe Container). Dans le cas de la méthode addChild(), la classe primant
sur la méthode, vous ne pouvez pas ajouter tous les types d’objets d’affichage à une occurrence de Container dans Flex.
La méthode remplacée demande dans ce cas que l’objet enfant ajouté soit de type mx.core.UIComponent.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 171
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Définition des propriétés de la scène
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La classe Stage annule la plupart des propriétés et méthodes de la classe DisplayObject. Si vous appelez l’une de ces
propriétés ou méthodes annulées, Flash Player et AIR renvoient une exception. Par exemple, l’objet Stage ne possède
pas de propriété x ou y car, en tant que conteneur principal de l’application, sa position est fixe. Or, les propriétés x et
y indiquent la position d’un objet d’affichage par rapport à son conteneur, et puisque la scène ne se trouve pas dans un
autre conteneur d’objets d’affichage, ces propriétés seraient inapplicables.
Remarque : certaines propriétés et méthodes de la classe Stage sont réservées aux objets d’affichage appartenant au même
sandbox de sécurité que le premier fichier SWF chargé. Pour plus d’informations, voir « Sécurité de la scène » à la
page 1109.
Contrôle de la cadence de lecture
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
La propriété framerate de la classe Stage permet de définir la cadence de tous les fichiers SWF chargés dans
l’application. Pour plus d’informations, voir le manuel Guide de référence ActionScript 3.0 pour la plate-forme Adobe
Flash.
Contrôle de la mise à l’échelle de la scène
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Lorsque la portion de l’écran qui représente Flash Player ou AIR est redimensionnée, le moteur d’exécution ajuste
automatiquement le contenu de la scène en conséquence. La propriété scaleMode de la classe Stage détermine
comment le contenu de la scène est ajusté. Cette propriété peut être réglée sur quatre valeurs distinctes, définies en tant
que constantes dans la classe flash.display.StageScaleMode :
• StageScaleMode.EXACT_FIT met à l’échelle le fichier SWF de sorte à occuper les nouvelles dimensions de la scène
sans tenir compte du format d’origine du contenu. Etant donné que les facteurs d’échelle ne sont pas
nécessairement identiques en largeur et en hauteur, le contenu risque de sembler écrasé ou étiré en cas de
modification du format de la scène.
• StageScaleMode.SHOW_ALL met à l’échelle le fichier SWF de sorte à occuper les nouvelles dimensions de la scène
sans modifier le format du contenu. Ce mode de mise à l’échelle affiche la totalité du contenu, mais risque de donner
lieu à des bordures de type « boîte aux lettres » similaires aux barres noires qui entourent un film grand écran sur
une télévision standard.
• StageScaleMode.NO_BORDER met à l’échelle le fichier SWF de sorte à occuper totalement les nouvelles dimensions
de la scène sans modifier le format du contenu. Ce mode de mise à l’échelle exploite pleinement la zone d’affichage
de la scène, mais risque d’engendrer un recadrage.
• StageScaleMode.NO_SCALE : ne met pas à l’échelle le fichier SWF. Si les nouvelles dimensions de la scène sont
inférieures aux dimensions d’origine, le contenu est recadré. Si elles leur sont supérieures, l’espace ajouté est vide.
Dans le mode de mise à l’échelle StageScaleMode.NO_SCALE uniquement, les propriétés stageWidth et
stageHeight de la classe Stage permettent de déterminer les dimensions réelles de la scène redimensionnée,
exprimées en pixels. (Dans les autres modes, les propriétés stageWidth et stageHeight renvoient toujours la
largeur et la hauteur d’origine du fichier SWF.) De plus, lorsque la propriété scaleMode est définie sur
StageScaleMode.NO_SCALE et que le fichier SWF est redimensionné, l’événement resize de la classe Stage est
distribué, ce qui vous permet d’effectuer des ajustements en conséquence.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 172
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Définir scaleMode sur StageScaleMode.NO_SCALE permet donc de mieux contrôler l’ajustement du contenu en
cas de redimensionnement de la fenêtre. Par exemple, si un fichier SWF contient une vidéo et une barre de contrôle,
il peut s’avérer utile de conserver la taille de la barre de contrôle en cas de redimensionnement de la scène et de ne
modifier que la taille de la fenêtre de vidéo en fonction du changement de taille de la scène. Ce cas de figure est
illustré dans l’exemple suivant :
// mainContent is a display object containing the main content;
// it is positioned at the top-left corner of the Stage, and
// it should resize when the SWF resizes.
// controlBar is a display object (e.g. a Sprite) containing several
// buttons; it should stay positioned at the bottom-left corner of the
// Stage (below mainContent) and it should not resize when the SWF
// resizes.
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
var swfStage:Stage = mainContent.stage;
swfStage.scaleMode = StageScaleMode.NO_SCALE;
swfStage.align = StageAlign.TOP_LEFT;
swfStage.addEventListener(Event.RESIZE, resizeDisplay);
function resizeDisplay(event:Event):void
{
var swfWidth:int = swfStage.stageWidth;
var swfHeight:int = swfStage.stageHeight;
// Resize the main content area
var newContentHeight:Number = swfHeight - controlBar.height;
mainContent.height = newContentHeight;
mainContent.scaleX = mainContent.scaleY;
// Reposition the control bar.
controlBar.y = newContentHeight;
}
Définition du mode de mise à l’échelle de la scène pour les fenêtres AIR
La propriété scaleMode de la scène indique comment celle-ci met à l’échelle et écrête les objets d’affichage enfant lors
d’un redimensionnement de fenêtre. N’utilisez que le mode noScale dans AIR. Lorsque ce mode est activé, la scène
n’est pas mise à l’échelle. La taille de la scène est modifiée directement en fonction des limites de la fenêtre. Les objets
risquent d’être écrêtés si la taille de la fenêtre est inférieure à sa taille initiale.
Les modes de mise à l’échelle de la scène sont adaptés aux environnements tels qu’un navigateur Web qui ne permet
pas nécessairement de contrôler la taille ou le format de la scène. Grâce aux modes, vous pouvez sélectionner le cas de
figure le moins inadapté lorsque la scène ne correspond pas à la taille ou au format idéal défini par l’application. Dans
AIR, vous contrôlez toujours la scène. Par conséquent, modifier la disposition du contenu ou redimensionner la
fenêtre assure un meilleur résultat que l’activation de la mise à l’échelle de la scène.
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 173
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Dans le navigateur et la fenêtre AIR initiale, la relation entre la taille de fenêtre et le facteur d’échelle initial est extraite
du fichier SWF chargé. Toutefois, lorsque vous créez un objet NativeWindow, AIR choisit une relation arbitraire
définie sur 72:1 entre la taille de fenêtre et le facteur d’échelle. Par conséquent, si la fenêtre mesure 72x72 pixels, un
rectangle de 10x10 pixels ajouté à la fenêtre est dessiné à la taille correcte (soit 10x10 pixels). Par contre, si la fenêtre
mesure 144x144 pixels, un rectangle de 10x10 pixels est mis à l’échelle (soit 20x20 pixels). Si vous préférez utiliser une
propriété scaleMode autre que noScale pour une scène de fenêtre, vous pouvez compenser le résultat en définissant
le facteur d’échelle de tout objet d’affichage de la fenêtre sur le rapport 72 pixels/largeur et hauteur actuelles de la scène.
Le code suivant calcule par exemple le facteur d’échelle requis de l’objet d’affichage client :
if(newWindow.stage.scaleMode != StageScaleMode.NO_SCALE){
client.scaleX = 72/newWindow.stage.stageWidth;
client.scaleY = 72/newWindow.stage.stageHeight;
}
Remarque : les fenêtres Flex et HTML définissent automatiquement la propriété scaleMode de la scène sur noScale.
Modifier la propriété scaleMode entrave le fonctionnement des mécanismes de mise en forme automatique utilisés dans
ces types de fenêtres.
Utilisation du mode Plein écran
Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures
Le mode plein écran permet de définir la scène d’un film de sorte à remplir totalement le moniteur sans bordure ou
menu. La propriété displayState de la classe Stage permet d’activer ou désactiver ce mode pour un fichier SWF. La
propriété displayState peut être réglée sur l’une des valeurs définies par les constantes de la classe
flash.display.StageDisplayState. Pour activer le mode plein écran, définissez la propriété displayState sur
StageDisplayState.FULL_SCREEN :
stage.displayState = StageDisplayState.FULL_SCREEN;
Pour activer le mode interactif plein écran (nouveauté dans Flash Player 11.3), définissez la propriété displayState
sur StageDisplayState.FULL_SCREEN_INTERACTIVE :
stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
Dans Flash Player, le mode plein écran ne peut être activé que via ActionScript en réponse à un clic de souris (clic de
bouton droit inclus) ou une frappe de touche. Le contenu AIR qui s’exécute dans le sandbox de sécurité de l’application
ne nécessite pas que le mode plein écran soit activé en réponse à une action de l’utilisateur.
Pour quitter le mode plein écran, définissez la propriété displayState sur StageDisplayState.NORMAL.
stage.displayState = StageDisplayState.NORMAL;
Un utilisateur peut également désactiver le mode plein écran en plaçant le focus sur une autre fenêtre ou en utilisant
l’une des combinaisons de touches suivantes : la touche Echap (toutes les plates-formes), Contrôle-W (Windows),
Commande-W (Mac) ou Alt-F4 (Windows).
Activation du mode plein écran dans Flash Player
Pour activer le mode plein écran d’un fichier SWF intégré à une page HTML, le code HTML requis pour intégrer Flash
Player doit comprendre une balise param et un attribut embed, associés au nom allowFullScreen et à la valeur true,
comme suit :
GUIDE DU DÉVELOPPEUR D’ACTIONSCRIPT 3.0 174
Programmation de l’affichage
Dernière mise à jour le 27/4/2013
Dans l’outil de programmation Flash, choisissez Fichier -> Paramètres de publication, puis dans la boîte de dialogue
Paramètres de publication, cliquez sur l’onglet HTML et sélectionnez le modèle Flash seulement - Autorisation du
Plein écran.
Dans Flex, assurez-vous que le modèle HTML inclut les balises