2009-05-18 8 views
3

Voici la classe:Comment remplir les paramètres requis dans une balise MXML personnalisée?

package fnc { 
    import mx.containers.Canvas; 

    public class Deck extends Canvas { 

     protected var _chipCount:int; 

     public function Deck(chipCount:int) { 
      /* Associate some chips with this deck */ 
      _chipCount = chipCount; 
     } 

     public function get chipCount():int { 
      return _chipCount; 
     } 
    } 
} 

Voici le MXML:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 

L'exécution de cette application obtient cette erreur:

ArgumentError: Error # 1063: Argument non-concordance de comptage sur fnc :: Deck (). Prévu 1, a obtenu 0. à mx.core :: Conteneur/createComponentFromDescriptor() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ cadre \ src \ mx \ core \ Container.as: 3579] à mx. core :: Conteneur/createComponentsFromDescriptors() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ cadre \ src \ mx \ core \ Conteneur.as: 3493] at mx.core :: Container/createChildren() [C : \ autobuild \ 3.2.0 \ frameworks \ projets \ cadre \ src \ mx \ core \ Container.as: 2589] à mx.core :: UIComponent/initialize() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ framework \ src \ mx \ core \ UIComponent.as: 5370] à mx.core :: Conteneur/initialize() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ framework \ src \ mx \ core \ Container.as:2526] à mx.core :: Application/initialiser() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ cadre \ src \ mx \ core \ Application.as: 846] à Practi ce/initialize() [C: \ Documents and Settings \ LocalService \ Mes documents \ Flex Builder 3 \ Practice \ src \ Practice.mxml: 0] à mx.managers :: SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C: \ autobuild \ 3.2.0 \ frameworks \ projets \ framework \ src \ mx \ gestionnaires \ SystemManager.as: 2009] at mx.managers :: SystemManager/initializeTopLevelWindow() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ framework \ src \ mx \ managers \ SystemManager.as: 3234] at mx.managers :: SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C: \ autobuild \ 3.2.0 \ frameworks \ projets \ framework \ src \ mx \ gestionnaires \ SystemManager.as: 3064] at mx.managers: : SystemManager/docFrameListener() [C: \ autobuild \ 3.2.0 \ frameworks \ projets \ cadre \ src \ mx \ managers \ SystemManager.as: 2916]

Ajout de chipCount="0" au MXML l ike ceci:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck chipCount="0" horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 

Obtient cette erreur de compilation:

gravité et description Chemin ressources Localisation Création temps Id propriété 'chipcount' est en lecture seule. Practice/src Practice.mxml line 3 1242656555328 26

Comment spécifier le nombre initial de puces?

Répondre

2

En réponse à brd6644 commentaire:

package 
{ 
    import mx.containers.Canvas; 

    public class Deck extends Canvas 
    { 
     protected var _chipCount:int; 
     private var chipCountChanged:Boolean; 

     public function Deck() 
     { 
      super(); 
     } 

     public function set chipCount(value:int):void 
     { 
      if (chipCount != value) 
      { 
       _chipCount = value; 
       chipCountChanged = true; 
       invalidateProperties(); 
       //call invalidateSize() if changing chipCount value may change the size of your component 
       //call invalidateDisplayList() if changing chipCount value need a redraw of your component 
      } 
     } 

     public function get chipCount():int 
     { 
      return _chipCount; 
     } 

     override protected function commitProperties():void 
     { 
      super.commitProperties(); 

      if (chipCountChanged) 
      { 
       chipCountChanged = false; 
       //here update properties that change because of chipCount new value. 
      } 
     } 

    } 
} 
6

Vous n'êtes pas en mesure de transmettre des paramètres au constructeur d'un élément lorsque vous le déclarez en MXML. Vous aurez besoin d'un constructeur vide, puis d'une propriété appelée ChipCount. Votre code devra également être mis à jour pour que ChipCount ne soit pas défini (ou défini sur 0).

Ma recommandation serait de changer le pont à quelque chose comme ceci:

public class Deck extends Canvas { 

    protected var _chipCount:int; 

    public function Deck() { 
     _chipCount = 0; // Default ChipCount and wait for it to be set. 
    } 

    public function get chipCount():int { 
     return _chipCount; 
    } 

    public function set chipCount(value:int):int { 
     // Add logic here to validate ChipCount before setting. 
     _chipCount = value; 

    } 
} 
+0

Gah, tu me bats à elle! – quoo

+0

Vous pouvez aller plus loin en utilisant le schéma d'invalidation UIComponent. Ajoutez une propriété "chipCountChanged", définissez-la sur true dans le setter pour chipCount, puis appelez invalidateProperties(). Ensuite, remplacez commitProperties() si chipCountChanged == true, traitez le changement à ce moment-là. C'est ainsi que la plupart des UIComponents intégrés fonctionnent. –

+0

Je souhaite avoir compris ce que vous voulez dire - mais je ne peux pas sans le code exemple complet. –

1

Je crois que si vous l'extension d'un UIComponent vous ne pouvez pas passer des arguments au constructeur - il vous faudrait trouver une autre façon de réglage du nombre de puces.Je vous suggère d'écouter l'événement initialize et la placèrent alors:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Script> 
    public function setChipCount():void{ 
    myDeck.chipCount = 0; 
    } 
</mx:Script> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck id="myDeck" initalize="setChipCount()" horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 
Questions connexes