IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

inputText focus null dans un ViewStack


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 37
    Par défaut inputText focus null dans un ViewStack
    Bonjour,

    J'ai un problème:

    J'ai un ViewStack comprenant plusieurs pages. Lorsque je vais sur une autre page que la première, et qu'elle contient un inputText, j'obtiens l'exception suivante:

    TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
    at mx.managers::FocusManager/focusInHandler()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\managers\FocusManager.as:601]
    Mais par contre après ça fonctionne ça m'énerve.

    Code contenant la ViewStack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
     
    	<mx:Panel layout="absolute"
    			  title="Bienvenue {model.login.prenom}"
    			  width="100%"
    			  height="100%"
    			  xmlns:viewC="view.component.*">
    		<mx:Script>
    			<![CDATA[
    				import modelLocator.ModelLocator;
    				[Bindable]
    				public var model:ModelLocator=ModelLocator.getInstance();
    			]]>
    		</mx:Script>
    		<mx:ViewStack id="MenuAdminContent"
    					  resizeToContent="true"
    					  alpha="1.0" creationPolicy="all">
    			<viewC:AccueilView label="Accueil"
    							   width="100%"
    							   height="100%"
    							   backgroundColor="#FFFFFF"/>
    			<viewC:InsertArticleView label="Gestion des insertions"
    									 width="100%"
    									 height="100%"/>
    			<viewC:ReserveArticleView label="Gestion des réservations"
    									  width="100%"
    									  height="100%"/>
    			<viewC:SellArticleView label="Gestion des ventes"
    								   width="100%"
    								   height="100%"/>
    			<viewC:PretArticleView label="Gestion des prêts"
    								   width="100%"
    								   height="100%"/>
    			<viewC:ManageUserView label="Gestion utilisateurs"
    								  width="100%"
    								  height="100%"/>
     
    		</mx:ViewStack>
    		<mx:LinkBar dataProvider="MenuAdminContent"
    					fontSize="12"/>
     
     
    	</mx:Panel>
    </mx:Canvas>
    Et le code d'une des pages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
    		   width="100%"
    		   height="100%"
    		   backgroundColor="#FDFDFD">
    	<mx:states>
    		<mx:State name="AddUser">
    			<mx:AddChild position="lastChild">
    				<mx:Form x="42"
    						 y="323"
    						 width="315"
    						 height="206">
    					<mx:FormItem label="Label">
    						<mx:TextInput/>
    					</mx:FormItem>
    				</mx:Form>
    			</mx:AddChild>
    		</mx:State>
    	</mx:states>
    	<mx:Script>
    		<![CDATA[
    			import mx.events.IndexChangedEvent;
    			import com.adobe.cairngorm.control.CairngormEventDispatcher;
    			import control.FonctionEvent;
    			import modelLocator.ModelLocator;
    			import mx.containers.ViewStack;
     
    			[Bindable]
    			public var model:ModelLocator=ModelLocator.getInstance();
     
    			private function generatePassword():String
    			{
    				var chars:Array=new Array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F", "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L", "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R", "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X", "y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "#", "@", "%", "&", "?", ",", ".", "-", "_", "!", "+", "$", "€", "=");
    				var specialChars:Boolean=false;
    				var size:int=6;
    				var pass:String="";
    				for (var x:int=0; x < size; x++)
    				{
    					if (specialChars == true)
    						pass+=chars[(Math.floor(Math.random() * (chars.length)))];
    					else
    						pass+=chars[(Math.floor(Math.random() * (chars.length - 14)))];
    				}
    				//inputPassword.text=pass;
    				return pass;
    			}
     
    			private function addNewUser():void
    			{
    				currentState='AddUser';
    				//var evt:FonctionEvent=new FonctionEvent();
    				//CairngormEventDispatcher.getInstance().dispatchEvent(evt);
    			}
    		]]>
    	</mx:Script>
     
    	<mx:Grid x="22"
    			 y="115"
    			 id="grid1">
    		<mx:GridRow width="100%"
    					height="100%"
    					id="gAddUser">
    			<mx:GridItem width="100%"
    						 height="100%"
    						 verticalAlign="middle">
    				<mx:Image source="assets/images/icones/Add.png"/>
     
    			</mx:GridItem>
    			<mx:GridItem width="100%"
    						 height="100%">
    				<mx:LinkButton label="Ajouter un nouvel utilisateur"
    							   fontSize="16"
    							   id="linkbutton4"
    							   click="addNewUser()"/>
    			</mx:GridItem>
    		</mx:GridRow>
    		<mx:GridRow width="100%"
    					height="100%"
    					id="gridrow2">
    			<mx:GridItem width="100%"
    						 height="100%"
    						 verticalAlign="middle"
    						 id="griditem1">
    				<mx:Image source="assets/images/icones/Modify.png"/>
    			</mx:GridItem>
    			<mx:GridItem width="100%"
    						 height="100%"
    						 id="griditem2">
    				<mx:LinkButton label="Modifier un utilisateur"
    							   fontSize="16"
    							   id="linkbutton1"/>
    			</mx:GridItem>
    		</mx:GridRow>
    		<mx:GridRow width="100%"
    					height="100%"
    					id="gridrow1">
    			<mx:GridItem width="100%"
    						 height="100%"
    						 verticalAlign="middle"
    						 id="griditem4">
    				<mx:Image source="assets/images/icones/Delete.png"/>
    			</mx:GridItem>
    			<mx:GridItem width="100%"
    						 height="100%"
    						 id="griditem3">
    				<mx:LinkButton label="Supprimer un utilisateur"
    							   fontSize="16"
    							   id="linkbutton2"/>
    			</mx:GridItem>
    		</mx:GridRow>
    		<mx:GridRow width="100%"
    					height="100%"
    					id="gridrow3">
    			<mx:GridItem width="100%"
    						 height="100%">
    				<mx:Image id="image1"/>
    			</mx:GridItem>
    			<mx:GridItem width="100%"
    						 height="100%"
    						 id="griditem5">
    				<mx:LinkButton label="Imprimer un fichier PDF"
    							   fontSize="16"
    							   id="linkbutton3"/>
    			</mx:GridItem>
    		</mx:GridRow>
    	</mx:Grid>
    	<mx:Form x="349" y="115" width="236">
    		<mx:FormItem label="Label">
    			<mx:TextInput/>
    		</mx:FormItem>
    	</mx:Form>
     
     
    </mx:Canvas>
    Merci d'avance !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Par défaut
    Bonjour,

    Par défaut les pages d'un ViewStack sont créées lors du premier affichage.
    Il est fort probable que ton programme appelle la méthode setFocus d'un TextInput pas encore instancié.

    Je n'ai pas trouvé dans le code à quel moment la méthode setFocus était appelée...

    Une solution est de créer tous les composants d'un container au début (cf. creationPolicy).

  3. #3
    Membre averti
    Inscrit en
    Février 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 37
    Par défaut
    La méthode setFocus est utilisée lorsque je clique sur mon inputText.

    Autrement j'ai vu ce creationPolicy, que j'ai mis sur "all", et que j'ai essayé de mettre un peu partout mais sans succès. No comprendo.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Par défaut
    Tu veux dire que la page s'affiche normalement et que c'est au moment où tu click sur le InputText que tu déclenches l'erreur ?

  5. #5
    Membre averti
    Inscrit en
    Février 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 37
    Par défaut
    exactement oui !

  6. #6
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    Salut,

    Peux tu nous montrer ton code correspondant au setfocus sur ton textInput lors du clic?

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  7. #7
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 74
    Par défaut
    Bon j'imagine que tu as résolu ton probleme depuis le temps.
    Néanmoins, comme j'ai rencontré le même problème, je post ma solution.

    Déjà je re-situe le contexte, mon application est constitué de modules, et beaucoup de problèmes similaires sont remontés suite à l'utilisation de modules.

    Apparament, certains managers doivent être instanciés comme des singleton, mais avec les modules, le Flash player s'en mêle les pinceaux. Attention, je dis ce que j'en ai compris. Bref.

    La solution à beaucoup de ses problèmes est de mettre dans le mxml père de l'application, des instance de ces managers. Donc la plupart du temps deux lignes comme suit résolvent le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import mx.managers.BrowserManager;
    private var browserManager:BrowserManager;
    Voilà pour ce que j'ai trouvé sur le net.

    Pour le Focus manager évidement ca ne suffit apparemment pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import mx.managers.IFocusManager;
    private var ifocusManager:IFocusManager;
    Pour le FocusManager il faut réelement instancier la classe donc dans une function sur le creationComplete de l'appli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        private function init():void {<div style="margin-left:40px">
            ifocusManager = new FocusManager(this);</div>}
    Voila avec cela je n'est plus le probleme

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Par défaut
    Effectivement le problème est décrit ici :
    Advanced Flex Programming / Creating Modular Applications
    Modular applications overview
    "Because a module is loaded into a child domain, it owns class definitions that are not in the main application's domain. For example, the first module to load the PopUpManager class becomes the owner of the PopUpManager class for the entire application because it registers the manager with the SingletonManager. If another module later tries to use the PopUpManager, Adobe ® Flash® Player throws an exception. The solution is to ensure that managers such as PopUpManager and DragManager and any other shared services are defined by the main application (or loaded late into the shell's application domain). When you promote one of those classes to the shell, the class can then be used by all modules.
    Par contre ce que je trouve bizarre pour le focus manager c'est qu'il n'y a pas de Singleton dans son cas !!

    Par ailleurs tu as écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import mx.managers.IFocusManager;
    private var ifocusManager:IFocusManager;
    et tu dis qu'il est nécessaire de créer une instance explicitement.
    N'est-ce pas parce tu as utilisé IFocusManager (l'interface) au lieu de FocusManager (l'implémentation).

    Est-ce que tu peux dire quels genres de problèmes a été réglé par l'ajout d'une référence à FocusManager ?

  9. #9
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 74
    Par défaut
    Citation Envoyé par jylaxx Voir le message
    Est-ce que tu peux dire quels genres de problèmes a été réglé par l'ajout d'une référence à FocusManager ?
    Ben exactement le problème décrit au début du Post !!!

    Une erreur lors d'un simple clique dans une zone de saisie de texte.
    Ou même le chargement d'un module contenant une zone de saisie de texte.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Par défaut
    Bizarre, j'utilise intensivement les modules et je n'ai jamais rencontré ce problème...

    Est-ce que tu essayé de remplacer IFocusManager par FocusManager, sans créer d'instance ? Si oui est-ce que c'est suffisant pour régler le problème ?

    Merci.

Discussions similaires

  1. [Oracle] Recherche nulle dans une base et affichage
    Par GLDavid dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/04/2006, 01h01
  2. ASP et valeur NULL dans requêtes SQL
    Par chuck_m dans le forum ASP
    Réponses: 7
    Dernier message: 13/08/2004, 11h15
  3. Date nulle dans une requete paramétrée avec TParameter
    Par denrette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/06/2004, 08h37
  4. recherche Date nulle dans une table
    Par lol_adele dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/04/2004, 14h06
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo