<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[RIA爱好者]]></title>
  <subtitle type="html"><![CDATA[Flash,Flash Remoting,Flex,AIR,Ajax,Silverlight]]></subtitle>
  <id>http://www.riafan.com/</id>
  <link rel="alternate" type="text/html" href="http://www.riafan.com/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.riafan.com/atom.asp" /> 
  <generator uri="http://www.riafan.com/" version="3.1.6.227">RIA爱好者</generator> 
  <updated>2010-03-10T00:00:26+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[使用Flash Builder 4进行Unit Test]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-03-10T00:00:26+08:00</updated>
	  <published>2010-03-10T00:00:26+08:00</published>
		  <summary type="html"><![CDATA[<p>作为一个新特性，Flash Builder 4已经集成FlexUnit Test，使用起来很方便，下面我们就以一个Case来谈谈怎样在Flash Builder 4中进行Unit Test。</p>
<p>1. 准备工作。首先用Flash Builder 4在一个Flex工程新建一个类。如下面代码。</p>
<pre>package
{
	import flash.utils.ByteArray;

	public class ObjectUtil
	{
		public static function clone(source:*):* 
		{
			var ba:ByteArray = new ByteArray();
			ba.writeObject(source);
			ba.position = 0;
			return ba.readObject();
		}
	}
}</pre>
<p>这个工具类实现对象的深度clone，也就是被复制的目标对象不再是源对象的参照，改变目标对象不会影响源对象。因为ActionScript 3.0和Flex Framework中有不少内置对象，如Date、Object、Array、ArrayColection、BitmapData等，情况比较多，单元测试正好派上用场。</p>
<p>2. 创建新的FlexUnit TestCase 类。</p>
<p>选择该类＞新建＞TestCase 类，打开下图所示对话框，一般按默认设置就行了。如下图所示。</p>
<p><img alt="" border="1" src="http://www.riafan.com//userfiles/image/10-03/testcase.gif" /></p>
<p>选择应为其生成测试方法存根的方法。如下图所示。</p>
<p><img alt="" border="1" src="http://www.riafan.com//userfiles/image/10-03/choosemethod.gif" /></p>
<p>Flash Builder 4将自动为我们生成TestCase类和主程序文件的结构代码。在TestCase类中，已经有一个没有实现的测试方法testClone，为方便错误跟踪，我们修改成了四个测试方。如下代码所示。</p>
<pre>public function testCloneObject():void
{
	var obj:Object= {name:&quot;Jim&quot;, age:25}
	var newObj:Object = ObjectUtil.clone(obj);
	newObj.age = 28;
	assertObjectEquals(obj, {name:&quot;Jim&quot;, age:25});
}

public function testCloneArray():void
{
	var arr:Array= [1,2];			
	var newArr:Array = ObjectUtil.clone(arr);
	newArr[1] = 3;
	assertObjectEquals(arr, [1,2]);
}

public function testCloneCollection():void
{
	var ac:ArrayCollection = new ArrayCollection([
		{name:&quot;Jim&quot;, age:28},
		{name:&quot;Tom&quot;, age:30}
	]);
	
	var newAC:ArrayCollection = ObjectUtil.clone(ac);
	newAC.getItemAt(0).name = &quot;Kite&quot;;
	assertEquals(ac.getItemAt(0).name, &quot;Jim&quot;);
}

public function testBitmapData():void
{
	var bmd:BitmapData = new BitmapData(100,100,false);
	bmd.setPixel(10,10,0xFF0000);
	var newBMD:BitmapData = ObjectUtil.clone(bmd);
	newBMD.setPixel(10,10,0x0000FF);;
	assertEquals(bmd.getPixel(10,10), 0xFF0000);
}</pre>
<p>注意，在FlexUnit 1 test中, 每个你创建的方法的方法名都必须以test开头, 这个是为了让测试运行器辨识需要测试的方法。</p>
<p>3. 创建新的FlexUnit Test Suite 类。选择该类＞新建＞TestSuie类，打开对话框，输入TestSuie类名，选择目标测试类和方法。如下图所示。</p>
<p><img alt="" border="1" src="http://www.riafan.com//userfiles/image/10-03/testsuite.gif" /></p>
<p>4. 修改主程序。</p>
<p>打开主程序mxml，做如下修改。</p>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; 
	xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; 
	xmlns:flexui=&quot;flexunit.flexui.*&quot;
	xmlns:mx=&quot;library://ns.adobe.com/flex/halo&quot; minWidth=&quot;800&quot; minHeight=&quot;600&quot;
	creationComplete=&quot;creationCompleteHandler()&quot;&gt;	
	&lt;fx:Script&gt;
	&lt;![CDATA[
		import flexUnitTests.UtilSuite;
		
		private var flexUnitTests_UtilSuite_obj:flexUnitTests.UtilSuite;
		
		protected function creationCompleteHandler():void
		{
			testRunner.test = UtilSuite.suite();
			testRunner.startTest();
		}
	]]&gt;
	&lt;/fx:Script&gt;
	
	&lt;flexui:TestRunnerBase id=&quot;testRunner&quot;
		width=&quot;100%&quot; height=&quot;100%&quot;/&gt;

&lt;/s:Application&gt;</pre>
<p>5. 运行测试程序。</p>
<p>结果testBitmapData()方法测试失败：TypeError: Error #1034: 强制转换类型失败:无法将 Object@b9b5fb1 转换为 flash.display.BitmapData。</p>
<p>6. 修改错误。其实，BitmapData有自己的clone方法，我们只要将这个方法整合到ObjectUtil类中就行了。</p>
<p>打开ObjectUtil类，添加一个条件，最终代码如下。</p>
<pre>public static function clone(source:*):* 
{
	var ba:ByteArray = new ByteArray();
	ba.writeObject(source);
	ba.position = 0;
	if(source is BitmapData)
	{
		return (source as BitmapData).clone();
	}
	return ba.readObject();
}</pre>
<p>回到第五步再进行测试，直到全部方法都通过。</p>
<p>另外，FlexUnit 4 test所用代码更简单，还支持元数据标签。通过运行方式＞FlexUnit 测试，可以直接生成主程序代码。FlexUnit 4 test的界面是总结性的，很简单，还有就是FlexUnit 面版，大家有空可以试一下。</p>
<p>更多关于FlexUnit Test的文章</p>
<ul>
    <li><a href="http://www.insideria.com/2008/04/unit-testing-with-flexunit-1.html">http://www.insideria.com/2008/04/unit-testing-with-flexunit-1.html</a></li>
    <li><a href="http://unitedmindset.com/jonbcampos/2009/06/01/flash-builder-4-feature-unit-tests/">http://unitedmindset.com/jonbcampos/2009/06/01/flash-builder-4-feature-unit-tests/</a></li>
    <li><a href="http://www.adobe.com/devnet/flex/articles/flashbuilder4_tdd.html">http://www.adobe.com/devnet/flex/articles/flashbuilder4_tdd.html</a></li>
</ul>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/unit-test-with-flash-builder-4.html" /> 
	  <id>http://www.riafan.com/default.asp?id=206</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Flex 4新书]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=10" label="Resouce" /> 
	  <updated>2010-03-03T16:51:21+08:00</updated>
	  <published>2010-03-03T16:51:21+08:00</published>
		  <summary type="html"><![CDATA[<p>Flex 4正式版还没出来，第一本Flex 4已经可以从Amazon购买了：<a href="http://www.amazon.com/Hello-Flex-4-Peter-Armstrong/dp/1933988762/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1267604858&amp;sr=1-1">Hello! Flex 4</a>，一看名字就知道是本入门的书，riabook已经有<a href="http://www.nshen.net/riabook_books/Hello-Flex-4.rar">下载</a>了。另外，有其它几本Flex 4新书现在也开始预订了。</p>
<ul>
    <li><a href="http://www.amazon.com/Flash-Builder-Bible-David-Gassner/dp/0470488956/ref=sr_1_4?ie=UTF8&amp;s=books&amp;qid=1267604858&amp;sr=1-4">Flash Builder 4 and Flex 4 Bible</a></li>
    <li><a href="http://www.amazon.com/Flex-4-Action-Tariq-Ahmed/dp/1935182420/ref=sr_1_3?ie=UTF8&amp;s=books&amp;qid=1267604858&amp;sr=1-3">Flex 4 in Action</a></li>
    <li><a href="http://www.amazon.com/Essential-Guide-Flex-4/dp/1430223936/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1267604858&amp;sr=1-2">The Essential Guide to Flex 4</a></li>
</ul>
<p>呵呵，期待Flex 4正式版发行。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/resource/flex-4-books.html" /> 
	  <id>http://www.riafan.com/default.asp?id=205</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[自定义Flex Validator]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-03-03T01:33:40+08:00</updated>
	  <published>2010-03-03T01:33:40+08:00</published>
		  <summary type="html"><![CDATA[<p>如果创建自定义Validator类，一般要继承Validator基类，覆盖基类doValidation() 方法。下面实例我们就来自定义一个简单的中国大陆身份证号码的Validator类。</p>
<p>大家都知道，新身份证号码是由18位数字组成的，其中前六位表示省市县代码，第6~13位表示出生日期。而旧身份证号码是由15位数字组成的，其中前六位表示省市县代码，第6~11位表示出生日期。下面我们来看代码实现。</p>
<pre>results = super.doValidation(value);</pre>
<p>results数组由ValidationResult对象组成，通过构造ValidationResult对象来定义验证错误代码和验证错误消息等。这一句调用了父类的doValidation() 方法，实现使验证程序生成必填字段的功能。</p>
<pre>for (var i:int = 0; i &lt; len; i++)
{
	var c:String = val.charAt(i);
	if (isNaN(parseInt(c)))
	{
		results.push(new ValidationResult(
			true, null, &quot;invalidChar&quot;, invalidCharError));
		return results;
	}
		            
}</pre>
<p>这个代码块用来验证身份证号码每一位是否为整数。</p>
<pre>if (len	== 18)
{
	dateStr	= val.substr(6, 8);
	if(!DateField.stringToDate(dateStr, &quot;YYYYMMDD&quot;))
	{
		results.push(new ValidationResult(
			true, null, &quot;invalidDate&quot;,
			invalidDateError));
		return results;
	}
}</pre>
<p>上述代码块用来验证18位身份证号码的出生日期。</p>
<pre>else if(len == 15)
{
	dateStr	= val.substr(6,	6);
	if(!DateField.stringToDate(dateStr, &quot;YYMMDD&quot;))
	{
		results.push(new ValidationResult(
			true, null, &quot;invalidDate&quot;,
			invalidDateError));
		return results;
	}
}</pre>
<p>此代码块用来验证15位身份证号码的出生日期。</p>
<pre>else
{
	 results.push(new ValidationResult(
		true, null, &quot;digit&quot;, 
		digitError));
	 return	results;
}</pre>
<p>该代码块用来验证添加身份证号码位数不正确时的错误提示信息。</p>
<p>也许有人要问，为什么不直接继承NumberValidator呢？NumberValidator包含了对小数、负数、千分位等的处理，用起来太过了。也许有人要问，为什么不直接了使用RegExpValidator呢？原因在于RegExpValidator无法验证出生日期。</p>
<p>本实例中的IDCardValidator类的很简单，我们可以侦听其它输入表单(如出生地和出生日期)来改进对身份证号码的验证。</p>
<p><a href="http://www.riafan.com/flex/customvalidator/"><font color="#3333cc">点击此处</font></a>查看该实例的效果，<a href="http://www.riafan.com/flex/customvalidator/srcview/CustomValidator.zip"><font color="#3333cc">点击此处</font></a>下载该实例的源码。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/custom-validator.html" /> 
	  <id>http://www.riafan.com/default.asp?id=204</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[AIR中的延迟呈现]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=8" label="DeskTop" /> 
	  <updated>2010-02-11T11:34:04+08:00</updated>
	  <published>2010-02-11T11:34:04+08:00</published>
		  <summary type="html"><![CDATA[<p>当用AIR访问操作系统剪贴板时，有一个重要概念，称为延迟呈现(deferred rendering)，它允许我们将一个方法的引用而不是具体数据传入剪贴板。</p>
<p>使用延迟呈现后，只有当用户请求一个粘贴操作时，数据才会真正增加到剪贴板。如果要处理大量数据或者将信息复制到剪贴板对用户处理器负荷太大时，延迟呈现就会非常有用。请看下面代码：</p>
<pre>private function copyToClipboard():void
{
	//var dataObj:Object = grid.selectedItem;
	Clipboard.generalClipboard.clear();
	//Clipboard.generalClipboard.setData(&quot;customFormat&quot;, dataObj);
	Clipboard.generalClipboard.setDataHandler(&quot;customFormat&quot;, getData);
	status = &quot;复制成功&quot;;
}</pre>
<p>要完成延迟呈现，应当使用setDataHandler()方法。这里会传入方法而不是具体的数据，只有用户尝试粘贴操作时才会执行这个方法。若要直接向此剪贴板对象添加数据，请改用setData()方法。</p>
<p>注意，使用延迟呈现有一个的缺点：用户关闭AIR应用时，数据不再可用。</p>
<p><a href="http://www.riafan.com//userfiles/file/10-02/deferred-rendering.zip">点击此处</a>下载本实例的完整源码。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/desktop/air-deferred-rendering.html" /> 
	  <id>http://www.riafan.com/default.asp?id=203</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[使用Validator改进数据向导生成的Flex应用]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-01-25T09:24:29+08:00</updated>
	  <published>2010-01-25T09:24:29+08:00</published>
		  <summary type="html"><![CDATA[<p>对于一个Flex CRUD应用来说，新增更新记录前进行数据验证是必要的，这回我们将讲解怎样使用Validator改进数据向导生成的Flex应用。</p>
<p><a href="http://www.riafan.com/flex/validator/">点击此处</a>查看该实例的效果，<a href="http://www.riafan.com/flex/validator/srcview/validator.zip">点击此处</a>下载该实例的源码。</p>
<p>对于所有的验证器来说，一般都会设定source和property两个属性。我们可以通过验证器属性方便地自定义出错信息甚至国际化，这里就不再讲述。</p>
<p>先看新增记录，打开源文件Student.mxml。</p>
<p>1) 为&ldquo;学号&rdquo;输入文本增添了一个正则表达式验证器(RegExpValidator)，正则表达式验证器的关键在于设置expression属性，通过正则表达式我们可以完成类似字符串验证器(StringValidator)、日期验证器(DateValidator)等验证器的功能。从这个意义上讲，正则表达式验证器的功能是最强大的，不过没其它特定的验证器使用起来方便。比如说此实例中的正则表达式^[WS]\d-\d\{6}$中，我们不得不对&ldquo;{&rdquo;进行了转义，如果是使用ActionScrip来写表达式，&ldquo;\&rdquo;也需要转义，大家在使用时要注意这一点。</p>
<p>2) 为&ldquo;姓名&rdquo;输入文本增添了一个字符串验证器。</p>
<p>3) 为&ldquo;生日&rdquo;DateField创建了一个日期验证器。日期验证器是最复杂的一个验证器，它最重要的一个属性是inputFormat，由于在输入格式中我们用到了特殊字符，因此我们不得不在allowedFormatChars属性中显示地声明。一般来说，验证器会放在主程序中，还可以放在了自定义组件中(如DateFieldEx.mxml)，效果是一样的。</p>
<p>4) 默认情况下，当验证器失去焦点时，就会对该控件进行校验，然而点击新增按钮仍可以提交数据，这不是我们想要的。此处我们在insertItem回调函数中使用validateAll静态方法对所有的验证对外进行校验，从而保证了提交数据前数据的有效性。</p>
<p>再来看修改记录，打开源文件StudentScript.as，注意如下代码片段：</p>
<pre>private function editCellEnd(e:DataGridEvent):void
{
    var dsRowIndex:int = e.rowIndex;
    var dsFieldName:String = e.dataField;
    var dsColumnIndex:Number = e.columnIndex;
    var col:DataGridColumn = dataGrid.columns[dsColumnIndex];
    if(col.dataField == &quot;Name&quot;)
    {
    	 var editor:TextInput = dataGrid.itemEditorInstance as TextInput;
   		 if(editor.text.length == 0)
   		 {
   		 	editor.errorString = nameValidator.requiredFieldError;
   		 	e.preventDefault();
   		 }
    }
    else if(col.dataField == &quot;Birthday&quot;)
    {
		 var df:DateFieldEx = dataGrid.itemEditorInstance as DateFieldEx;
	   	 if(df.validator.validate().type == ValidationResultEvent.INVALID)
	   	 {
	   	 	e.preventDefault();
	   	 }
    }
}</pre>
<p>1) 对于DataGrid来说，在编辑单元格时，校验项目编辑器一般会在校验失败时，在itemEditEnd事件处理方法中执行preventDefault方法来阻止关闭项目编辑器，不然是看不到校验效果的。</p>
<p>2) 除了使用验证器属性,我们还可以设置验证对象(UIComponent)的errorString属性来显示验证出错信息。</p>
<p>3) 另外，在编辑单元格时，无法执行这类服务器端验证。如果要执行这类验证，那么当您的应用程序启动时，您应当向服务器查询要验证的数据，并在编辑单元格时使用它。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/enhance-flex-app-with-validator.html" /> 
	  <id>http://www.riafan.com/default.asp?id=202</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[使用itemEditor改进数据向导生成的Flex应用]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-01-21T23:37:09+08:00</updated>
	  <published>2010-01-21T23:37:09+08:00</published>
		  <summary type="html"><![CDATA[<p>利用Flex Builder 3的数据向导可以很快捷地生成一个Flex CRUD应用，然而该应用的所有项目编辑器都是输入文本，如果数据提供程序项目中字段为布尔、日期等其他数据类型，输入文本使用起来就不方便了，得使用相应的项目编辑器或自定义项目编辑器。</p>
<p><a href="http://www.riafan.com/flex/itemeditor">点击此处</a>查看该实例的效果，<a href="http://www.riafan.com/flex/itemeditor/srcview/itemeditor.zip">点击此处</a>下载该实例的源码。</p>
<p>在本实例中，对于&ldquo;性别&rdquo;列，我们使用CheckBox项目编辑器；对于&ldquo;生日&rdquo;列，使用了自定义的DateField项目编辑器；对于&ldquo;班级&rdquo;列，则使用了自定义的ComboBox项目编辑器。这样的界面，用户易懂，使用起来很方便。而且，当我们在新增记录时，也使用了这些项目编辑器作为控件，从而有效地重用了组件。</p>
<p>改进前的的应用，不管属性值有没有更新，当焦点从一个项目编辑器移动到另一个项目编辑器，或者从一条记录移动到另一条记录时，都会提交到服务器端处理，这样情况不是我们想要的。因此我们干脆移除了当项目编辑结束时调度的事件处理函数，新增了Update按钮，只有当用户单击该按钮时，才将更新的当前记录提交到服务器端。如下代码片段：</p>
<pre>private function updateItem():void 
{
	var vo:*  = dataGrid.selectedItem;
	if(vo)
	gateway.Update(
		vo.StudentID,        vo.Name,        vo.Gender,        vo.Birthday,        vo.ClassName	);
}</pre>
<p>当然，要改进的地方还有很多，比如说新增更新记录时要进行数据验证，留在下次再讲解吧。</p>
<p>更多关于itemEditor的教程：</p>
<ul>
    <li><a target="_blank" href="http://www.adobe.com/cn/devnet/flex/articles/itemeditors_pt1.html">理解 Flex itemEditor－第 1 部分：内联 itemEditor</a></li>
    <li><a target="_blank" href="http://www.adobe.com/cn/devnet/flex/articles/itemeditors_pt2.html">理解 Flex itemEditor－第 2 部分：编辑事件和复杂编辑器</a></li>
    <li><a target="_blank" href="http://www.adobe.com/cn/devnet/flex/articles/itemeditors_pt3.html">理解 Flex itemEditor－第 3 部分：将 itemRenderer 用作 itemEditor</a></li>
</ul>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/enhance-flex-app-with-itemeditor.html" /> 
	  <id>http://www.riafan.com/default.asp?id=201</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[网络监视器激活时不能从Zend AMF返回数据]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-01-14T23:30:18+08:00</updated>
	  <published>2010-01-14T23:30:18+08:00</published>
		  <summary type="html"><![CDATA[<p>在Flash Builder 4 Beta2中，当网络监视器激活时，光标会一直显示忙碌状态，不能从Zend AMF返回数据。</p>
<p>我已经向官方提交了此问题：<a href="http://bugs.adobe.com/jira/browse/FB-23903">http://bugs.adobe.com/jira/browse/FB-23903</a>。我的测试环境是Window XP + IIS 5.1 PHP 5.2.10.10 。不知道大家在其它环境下有没有这个问题，希望在即将发布的正式版中没有这个问题。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/fb-23903.html" /> 
	  <id>http://www.riafan.com/default.asp?id=200</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[使用发布SWC的两个问题]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2010-01-14T11:01:01+08:00</updated>
	  <published>2010-01-14T11:01:01+08:00</published>
		  <summary type="html"><![CDATA[<p>好久没更新了，在最近的项目中使用发布swc时遇到两个问题，特总结一下以备查用。</p>
<p>问题一：</p>
<p>我用JSWOOF.swc时遇到下面的问题</p>
<p>1044: Interface method addChildBridge in namespace mx.managers:ISystemManager not implemented by class _Main_mx_managers_SystemManager</p>
<p>问题是由于Flex SDK不兼容造成的。早版本的JSWOOF.swc和as3corelib.swc是用Flex SDK 3.2编译的，而我的使用环境是Flex SDK 3.1。官方也意识到了这个问题而做了修正，我们只要更新到最新的swc版本即可。</p>
<p>问题二：</p>
<p>我在Flash Bulder中发布swc遇到问题：Unable to export SWC oem</p>
<p>这是由于swc资源文件在删除时，Flash Bulder没有自动更新。解决办法就是选择project Properties ＞Flex Library Build Path ＞Assets，先反选所有的assets，再重选所有的assets。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/swc-issues.html" /> 
	  <id>http://www.riafan.com/default.asp?id=199</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[在Flex中居中显示Alert]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=5" label="Flex" /> 
	  <updated>2009-12-25T13:14:15+08:00</updated>
	  <published>2009-12-25T13:14:15+08:00</published>
		  <summary type="html"><![CDATA[<p>一般情况下，发布Flex应用时swf的宽高都是100%，页面没有滑条，这时Alert弹出时是居中显示的。但如果swf的尺寸大于页面窗口尺寸而使用页面滑条而非Flex滑条，Alert弹出时是不会居中的。怎么解决这个问题呢？</p>
<p>因为涉及页面窗口，所以单靠Flex是不行的，得用Javascript获取当前页面窗口大小和对象边界与窗口中目前可见内容的最左端、最上端之间的距离。如下面JS:</p>
<pre>function getWin()
{
	var winWidth = 0, winHeight = 0;
	var xOffset = 0, yOffset = 0;
	//Netscape compliant
	if( typeof( window.pageYOffset ) == &quot;number&quot; &amp;&amp; typeof( window.innerWidth ) == &quot;number&quot;) 
	{
		winWidth = window.innerWidth;
		winHeight = window.innerHeight;
		xOffset = window.pageXOffset;
		yOffset = window.pageYOffset;
	} 
	//DOM compliant
	else if( document.body 
		&amp;&amp; ( document.body.scrollLeft || document.body.scrollTop ) 
		&amp;&amp; ( document.body.clientWidth || document.body.clientHeight) ) 
	{
		winWidth = document.body.clientWidth;
		winHeight = document.body.clientHeight;
		xOffset = document.body.scrollLeft;
		yOffset = document.body.scrollTop;
	}
	//IE6 standards compliant mode
	else if( document.documentElement
		&amp;&amp; ( document.documentElement.clientWidth || document.documentElement.clientHeight )
		&amp;&amp; ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
	{
		winWidth = document.documentElement.clientWidth;
		winHeight = document.documentElement.clientHeight;
		xOffset = document.documentElement.scrollLeft;
		yOffset = document.documentElement.scrollTop;
	}
	return [winWidth, winHeight, xOffset, yOffset];
}</pre>
<p>传回的是个数组，然后我们再在Flex中使用ExternalInterface.call取得前页面窗口大小及拖动滑条之后的偏移距离。</p>
<p><a href="http://www.riafan.com/flex/alert">点击此处</a>查看该实例的效果，<a href="http://www.riafan.com/flex/alert/srcview/alert.zip">点击此处</a>下载该实例的源码。</p>
<p>感兴趣的话可以测试一下：拖动页面滑条，点击click按钮，在不同的浏览器中不同大小的窗口下Alert始终是居中显示的。</p>
<p>注意：</p>
<p>1. 考虑到Javascript对浏览器的兼容性，我们在代码中作了不少判断；</p>
<p>2. 因为Alert是个静态类，我们不得不重写了该类，对Alert位置的调整是通过覆写updateDisplayList方法完成的；</p>
<p>3. 如果swf只是整个页面的一部分，要让Flex Alert居中是不可能的。只能在页面中通过Javascript来弹出alert窗口，因为Flex中的Alert是无法位于页面的最上层的。</p>
<p>最后，祝大家圣诞快乐！</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/flex/center-alert.html" /> 
	  <id>http://www.riafan.com/default.asp?id=198</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[让ZendAMF支持UTF-8]]></title>
	  <author>
		 <name>Flying</name>
		 <uri>http://www.riafan.com/</uri>
		 <email>riafan@163.com</email>
	  </author>
	  <category term="" scheme="http://www.riafan.com/default.asp?cateID=9" label="Backend" /> 
	  <updated>2009-12-22T23:05:33+08:00</updated>
	  <published>2009-12-22T23:05:33+08:00</published>
		  <summary type="html"><![CDATA[<p>在Flash Builder 4中，新增了使用ZendAMF向导访问服务器数据，很明显ZendAMF已经取代了Amfphp成为Flex与PHP数据通信的最佳解决方案。不过，同Amfphp一样，ZendAMF也面临一个编码的问题。怎样让ZendAMF支持UTF-8呢？更进一步说，怎样解决ZendAMF的中文乱码问题呢？</p>
<p>不知道大家还记得<a href="http://www.riafan.com/article/backend/amfphp-configuration.html">http://www.riafan.com/article/backend/amfphp-configuration.html</a>这篇文章不？要设置Amfphp支持UTF-8得在gateway中显示地修改编码。相比之下，ZendAMF的设置更简单些，因为它本身就支持UTF-8！只要gateway和php服务类都是UTF-8格式，就可以支持中文！。</p>
<p><img alt="UTF-8格式" border="0" src="http://www.riafan.com//userfiles/image/09-12/utf-8.gif" /></p>
<p>上图是利用Dreamweaver设置的，当然我们也可以使用UltraEdit等其它工具来设置UTF-8格式。注意：<span>不要选择BOM。</span></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.riafan.com/article/backend/zendamf-utf-8.html" /> 
	  <id>http://www.riafan.com/default.asp?id=197</id>
  </entry>	
		
</feed>
