WindowedApplication的Flex 4 / Air设置范围

时间:2010-07-09 13:39:02

标签: flex air

由于某种原因,这个flex 4代码给了我一个错误,但我无法弄清楚为什么。在我的WindowedApplication我有:

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

错误讯息:   ArgumentError:错误#2007:参数rect必须为非null。

我最初也尝试过没有rect对象,只是做了:

this.bounds = prefs.bounds as Rectangle;

这给了我以下错误:

  

TypeError:错误#1034:类型强制失败:无法将Object @ 1dbbe1f1转换为flash.geom.Rectangle。

这似乎是一个虚假的错误,因为我可以在没有错误的情况下为pre分配pref.bounds。我不知道为什么这不起作用。它在flex 3兼容模式下工作,但这也打破了很多我的火花组件,所以我不能使用它。

1 个答案:

答案 0 :(得分:0)

rect = prefs.bounds as Rectangle;

rect最终为null,因为prefs.bounds不是Rectangle类的实例。使用as关键字进行投射会在失败时返回null

在致电trace(prefs.bounds);后,只需提供readObject即可查看其中包含的内容。


更新

prefs.bounds中的值具有x,y,width和height属性这一事实并不会使它成为Rectangle对象 - 它只是具有这四个属性的对象。简单的解决方案是从这些值创建Rectangle对象并使用它:

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

如果在将矩形对象写入文件流之前调用registerClassAlias,则readObject将返回适当类型的对象而不是通用对象。

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);