2010-07-09 4 views
1

pour une raison quelconque ce code flex 4 me donne une erreur, mais je ne peux pas comprendre pourquoi. Dans mon WindowedApplication je:Flex 4/Air limites de réglage pour WindowedApplication

var prefs:Object = fs.readObject(); 
fs.close(); 
var rect:Rectangle = new Rectangle(); 
rect = prefs.bounds as Rectangle; 
this.bounds = rect; // error here 

Error message: ArgumentError: Error #2007: Parameter rect must be non-null.

Je l'origine essayé aussi sans l'objet rect et juste fait:

this.bounds = prefs.bounds as Rectangle; 

qui me donne l'erreur suivante:

TypeError: Error #1034: Type Coercion failed: cannot convert [email protected] to flash.geom.Rectangle.

Cela ressemble à une erreur bidon puisque je peux assigner pref.bounds à rect sans erreur. Je ne sais pas pourquoi ça ne marche pas. Il fonctionne en mode de compatibilité flex 3, mais cela casse aussi beaucoup de mes composants d'étincelles, donc je ne peux pas l'utiliser.

Répondre

0
rect = prefs.bounds as Rectangle; 

rect finit comme null parce prefs.bounds n'est pas une instance de Rectangle classe. La diffusion avec des mots clés as renvoie null en cas d'échec.

Il suffit de donner un trace(prefs.bounds); après l'appel à readObject pour voir ce qu'il contient.


Mise à jour:

Le fait que la valeur de prefs.bounds ont x, y, propriétés de largeur et de hauteur, ne fait pas un objet Rectangle - il est juste un objet avec ces quatre propriétés. La solution facile est de créer un objet Rectangle à partir de ces valeurs et de l'utiliser:

var prefs:Object = fs.readObject(); 
var rect:Rectangle = new Rectangle(prefs.bounds.x, prefs.bounds.y, prefs.width, prefs.height); 
this.bounds = rect; 

Si vous appelez registerClassAlias avant d'écrire l'objet rectangle dans le flux de fichiers, le readObject reviendriez un objet de type approprié au lieu d'un générique un.

registerClassAlias("flash.geom.Rectangle", Rectangle); 
fs.writeObject(this.bounds); 

//later... 
//Casting with() will throw an error if the read object is not a Rectangle 
var rect:Rectangle = Rectangle(fs.readObject()); 
trace(rect); 
+0

si vous dites que: this.bounds = rect; équivaut à: this.bounds = null; Et windowedApp n'accepte pas cela? Lorsque j'utilise le débogueur, prefs.bound a tous les champs que vous attendez, largeur, hauteur, x, y, etc. Donc, si ce n'est pas un rectangle, je ne sais pas ce que ce serait. L'objet prefs est d'ailleurs généré à l'origine à partir de this.bounds et enregistré dans un fichier. C'est pourquoi quand je le lis avec ce code, je suis surpris qu'il s'étouffe comme ça. – solerous

+0

@solerous voir ma mise à jour. – Amarghosh

+0

Hey merci pour les bonnes réponses. Malheureusement, le code ne fonctionne pas. var rect: Rectangle = Rectangle (fs.readObject()); trace (rect); TypeError: Erreur n ° 1034: La coercition de type a échoué: impossible de convertir l'objet @ 1db7bdf9 en flash.geom.Rectangle. Même si j'utilise: registerClassAlias ​​("flash.geom.Rectangle", Rectangle); fs.writeObject (this.bornes); pour l'enregistrer initialement. Je ne comprends tout simplement pas pourquoi AIR ne peut pas faire ce genre de conversion 1: 1. Ce code est en fait tiré d'une application dans Flex 3 et il a parfaitement fonctionné là. Je ne sais pas ce qui a changé dans Flex 4. – solerous

Questions connexes