Désactiver un formulaire avec Flash
Par -Alexandre LEGOUT aka LAlex- le 9 avril 2004, 11:47 - AS2 - Lien permanent
Lors de la création du formulaire servant à rajouter un commentaire, je me suis retrouvé confronté au problème de la désactivation de celui-ci lorsque l'animation effectue certaines actions, comme inscrire une adresse dans les notification, insérer le commentaire, etc... Je suis donc allé fouiller dans le code source de MTGotoAndComment de Stéfane Funaro pour voir comment il faisait cela, et l'astuce mérite d'être connue. ![]()
Il s'agit en fait de baisser l'alpha du formulaire, et de mettre au dessus un clip transparent, de lui donner le comportement d'un bouton, et d'enlever le curseur en form de main. Je n'ai pas encore trouvé le moyen de créer ce "masque" en trouvant automatiquement les coordonnées.
Voici un exemple de comment faire dans le cas d'un formulaire sous forme de clip :function initForm($frm:MovieClip, $x:Number, $y:Number, $w:Number, $h:Number):Void {
// Creation du clip "masquant"
var disab = $frm.createEmptyMovieClip("disableClip", $frm.getNextHighestDepth());
with (disab) {
// Dessin du clip avec un remplissage d'alpha 0
beginFill(0,0);
moveTo(0,0);
lineTo(10,0);
lineTo(10,10);
lineTo(0,10);
lineTo(0,0);
// Coordonnées du formulaire dans le clip
_x = $x;
_y = $y;
// Largeur du formulaire dans le clip
_width = $w;
_height = $h;
// Création du bouton
onRelease = function () {};
useHandCursor = false;
// Par défaut, le formulaire est activé
_visible = false;
}
// Activer/désactiver le formulaire
$frm.setEnabled = function($bool) {
this.disableClip._visible = $bool;
this._alpha = $bool ? 100 : 40;
}
// Récupérer l'état du formulaire
$frm.getEnabled = function() {
return this.disableClip._visible;
}
// "Switcher" entre les deux états du formulaire
$frm.toggleEnabled = function() {
this.setEnabled(!this.getEnabled());
}
}
Vous avez ainsi à votre disposition les méthodes setEnabled, getEnabled et toggleEnabled pour votre clip contenant le formulaire qui contrôleront l'état du formulaire !!! ![]()
Commentaires
salut
Je n'ai pas encore trouvé le moyen de créer ce "masque" en trouvant automatiquement les coordonnées.
. Le propriété width et height de l'object Stage ne fonctionne pas? :\
A+
Les propriétés de Stage peuvent servir dans le cas d'une animation qui ne contient que le formulaire, mais si le formulaire n'est qu'une partie de l'animation, ca le fait pas ...
++ ^^
ok je croyais que le probleme était spécifique a ton formulaire...
le _width et le _height du clip qui contient le formulaire de fonctionne pas non plus?
Le _width et le _height éventuellement, mais de toutes façons, il faudrait quand-même donner ses coordonnées, si le point en haut à gauche n'est pas 0,0 ... alors quite à donner les coordonnées, on est pas aux dimensions prés !
++ ^^
salut

il reste toujours la possibilité de faire un for.. in sur ton formulaire pour détecter le clip qui est en haut en gauche et celui en bas a droite. Avec ces infos, tu devrais être en mesure de trouver la position exact de ton formulaire
Le problème, c'est de ne pas savoir si le clip en haut à gauche est centré sur 0,0 ou pas ... A moins de faire une batterie de hitTest ... :\
++ ^^
Pourquoi tu fais pas des champs et boutons qui sont tous dans un ordre simple style : truc1, truc2 etc.. que tu leur donne pas un enabled = false à tous les boutons et un type="dynamic" si c'est des fields ? et pour réactiver.. type="input" et enabled=true ?
bye
Disons qu'en terme de performances, la solution que je donne ici n'a plus rien à voir !
Et puis le .enabled à tendance à faire des siennes parfois, si le onRelease est toujours présent ... :\
Mais c'est bien évidemment à cette solution que j'avais pensé en premier !
++ ^^
Ah bon un blem sur le onRelease ? j'ai jamais eu ce problème ?

En tout cas je trouve plus propre de gérer les éléments de mon formulaire avec une classe FormManager par exemple qu'avec un clip écran qui coupe l'accés à celui ci
C'est l'éternel débat propreté/performances !!!
Souviens de deux posts en arrière, quand on parle de la "propreté" des return en plein milieu d'une fonction ! 
moi j'aime les return dans une fonction aussi
lol 

function show (msg) {if (msg == undefined) return ;
trace (msg) ;
}
bye
Concernant la taille et position d'un clip, la fonction MovieClip.getBounds() te retourne tout ca d'un coup, sans soucis des positions relatives et du point de reference 0,0
Ouah, je connaissais pas du tout cette instruction !!!

Bon, je vais refaire le code avec alors !
++ ^^
Et voila la version finale du code, grace au getBounds !
Et même qu'elle est sans bugs celle-ci (pas comme celle du post ... :$)
function initForm($frm:MovieClip):Void {var coords = $frm.getBounds();
// Creation du clip "masquant"
var disab = $frm.createEmptyMovieClip("disableClip", $frm.getNextHighestDepth());
with (disab) {
// Dessin du clip avec un remplissage d'alpha 0
beginFill(0,0);
moveTo(0,0);
lineTo(10,0);
lineTo(10,10);
lineTo(0,10);
lineTo(0,0);
// Coordonnées du formulaire dans le clip
_x = coords.xMin;
_y = coords.yMin;
// Largeur du formulaire dans le clip
_width = coords.xMax - coords.xMin;
_height = coords.yMax - coords.yMin;
// Par défaut, le formulaire est activé
_visible = false;
}
// Création du bouton
disab.onRelease = function () {};
disab.useHandCursor = false;
// Activer/désactiver le formulaire
$frm.setEnabled = function($bool) {
this.disableClip._visible = !$bool;
this._alpha = $bool ? 100 : 40;
}
// Récupérer l'état du formulaire
$frm.getEnabled = function() {
return !this.disableClip._visible;
}
// "Switcher" entre les deux états du formulaire
$frm.toggleEnabled = function() {
this.setEnabled(!this.getEnabled());
}
}
Pourquoi faire le bouton en deux etapes, ca marche pas en un coup? Sans tester, un morceau de code:

with (disab) {// Dessin du clip avec un remplissage d'alpha 0
beginFill(0,0);
with (coords) {
moveTo(xmin,ymin);
lineTo(xmax,ymin);
lineTo(xmax,ymax);
lineTo(xmin,ymax);
lineTo(xmin,ymin);
}
// Par défaut, le formulaire est activé
_visible = false;
}
En general je suis pas fan des with imbriques, mais si ca marche...
Pas bête !
Mais en général, je fait toujours une forme de taille fixe, dessinnée depuis l'origine que je redimensionne. Deja parce que je préfère que le coin en haut à gauche soit (0,0) ... mais j'aurais pu dessiner directement la forme avec les bonnes dimensions, c'est vrai !
Question d'habitude ... 
Par contre, ce que j'ai pas compris, c'est que le onRelease et le useHandCursor ne marchaient pas dans le with !!! 8O
++ ^^
pour le onRelease... c'est normal car tu crée une fonction.. et on peut pas créer de variables dans un with juste les appeler ou les changer si elles existent déjà

pour le useHandCursor faut que je teste ??
bye
Ca doit être du au fait que la création du onRelease ne marchait pas, donc le useHandCursor n'avait aucun effet !
++ ^^
Héhé! Je réponds en retard, je n'avais pas mit à jour le fil rss!!! :/
C'est un vieux truc que j'utilise depuis longtemps, mettre un masque invisible et lui appliquer un onRelease bidon et useHandCursor à false.
Mais en fait, c'est un truc que je fais par automatisme, vieux truc habituel. Et je le fais souvent à la main simplement.
Mais en fait j'y pense en lisant tout cela... Mettre tout simplement sur le clip du formulaire un onRelease devrait fonctionner non ? J'y pense vite et n'ai pas le temps d'essayer, mais en principe, simplement mettre sur le formulaire :
this.useHandCursor = false;this.onRelease = function(){};
En théorie ça devrait marcher, non ? Pas besoin de dessiner un masque et tout. En fait l'idée du masque vient du fait que souvent j'aime mettre un masque à '20%' d'alpha, afin de donner un indicateur visuel à l'usager, lui faisant comprendre pourquoi tout est 'gelé'... En grisant la zone formulaire, c'est plus évident. Et tant qu'à y être au centre du masque je mets parfois une petite animation du genre 'sablier'...
Fil des commentaires de ce billet