Bonjour,

Je cherche a créer des Panels ou autre TitleWindow a la volée, cela ne pose pas de probleme, dans une fonction AS3 je fait :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
 
public function onNewWindow():void
{
  var oPanel:Panel = new Panel;
  mx.managers.PopUpManager.addPopUp(oPanel, this, false);	
}
Maintenant, je veut faire pareil avec un custom component, qui utilise le code behind.



fichier MenuTest.mxml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
 
<comp:MenuTestClass
		xmlns:comp="components.*"
	 	xmlns:mx="http://www.adobe.com/2006/mxml" 
		>
 
		<mx:Canvas>
			<mx:Button label="Sauvegarder" id="btnSave" />
		</mx:Canvas>
 
</comp:MenuTestClass>

Fichier MenuTestClass.as

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
 
package components
{  
    import mx.controls.*;
    import mx.containers.*;
    import mx.events.FlexEvent;
 
	public class MenuTestClass extends TitleWindow
	{
		public var btnSave:Button;
 
		public function MenuTestClass() {
 
			btnSave.addEventListener("click", onSave);
 
			this.title = "Settings";
			this.alpha = 0.98;
			this.percentHeight  = 100;
			this.percentWidth = 100;
			this.x = 320;
			this.y = 90;
 
 
		}
 
		private function onSave():void {
			Alert.show("onSave");
                        // etc
		}
 
	}
 
 
}

Voici le probleme : Apparemment, le code behind est effectif uniquement si le composant est instanciée en mxml

Application principale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
...
  <MenuTest>
       ....
  <MenuTest/>
...

Ceci ne m'intéresse pas, car comme dit le composant est crée a la volé, en reprenant le premier exemple, mais avec utilisation du custom component.


en utilisant le nom de la class AS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public function onNewWindow():void
{
  var oTest:MenuTestClass = new MenuTestClass ;
  mx.managers.PopUpManager.addPopUp(oTest, this, false);	
}
Résultat :
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 components::MenuTestClass()[...\src\components\MenuTestClass.as:13]
Ce qui veut dire que le btnSave n'est pas instancié, mais juste définit, le code behind n'est plus effectif et la fenetre n'est pas affiché, car on ne passe pas par le code mxml. Cela marche si j'instancie btnSave = new Button et que je l'ajoute avec un this.addChild(btnSave). Comme pour creer un compsant uniquement en AS (le mxml est donc ignoré)

Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche sans composants a l'intérieur.
____________________________________________________________

En utilisant le nom du fichier mxml, comme on le ferai dans une instanciation en mxml.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public function onNewWindow():void
{
  var oTest:MenuTest = new MenuTest ;
  mx.managers.PopUpManager.addPopUp(oTest, this, false);	
}
Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche avec les composants, mais bien sur la fonction onSave ne peut etre appelle.

Alors, le code behind n'est pas supporté depuis l'action script ? d'ailleurs dans le tuto d'adobe http://www.adobe.com/devnet/flex/qui...g_code_behind/ le composant est bien instancié en mxml

Dernière remarque, le code behind fonctionne uniquement pour l'instance (this) du composant, ainsi un this.title = "Quarante deux "; changera bien le titre, mais les membres ne sont pas bindé.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?xml version="1.0" encoding="utf-8"?>
<custom:ApplicationClass 
    xmlns:custom="components.*"
 
    viewSourceURL="src/CodeBehind/index.html"
    width="400" height="310"
>
    <custom:PaddedPanel title="Code Behind">
 
        <custom:AddressForm id="addressForm"/>
    </custom:PaddedPanel>
</custom:ApplicationClass>