【永恒的瞬间】
☜Give me hapy ☞
一个简单的ActionScript 3 Iterator实现

darron schall 发布了一个As3 Iterator的实现,你可以点击这里下载,该组件的用法非常简单,下载的压缩包包括一个Iterator接口和一个范例的Array Iterator实现,以下是使用范例:

import com.darronschall.util.*;
var arr:Array = [1, 2, 3];
var it:Iterator = new ArrayIterator( arr );
while ( it.hasNext() )
{
	trace( it.next() );  // 1, 2, 3
}

var it2:Iterator = new ArrayIterator( null );
trace( it2.hasNext() ); // false
ActionScript 3 : 通过类名称获取类引用

在ActionScript 3中如果我们只知道类名称但又想获得一个类的引用的话,那么我们可以使用flash.utils.getDefinitionByNam创建一个类的实例。

例如:

package
{
  import flash.display.Sprite;
  import flash.utils.getDefinitionByName;

  public class DynamicCall extends Sprite
  {
    public function DynamicCall()
    {
           var ClassReference:Class = getDefinitionByName("String") as Class;
           var s:String = (new ClassReference("foo=") as String);
           trace(s);
    }
  }
}

以上代码根据类名称“String”创建一个String类的实例,getDefinitionByName需要完整类路径,所以如果我们想创建MovieClip的实例的话,我们需要提供完整的类路径:

           var ClassReference:Class = getDefinitionByName("flash.display.MovieClip") as Class;

这样的方法虽然有些旁门左道,但却非常有用!

Flex2:在Excel与Flex之间粘贴数据

试用过Google Spreadsheets的朋友,可能发现其一个有意思的特性,我们可以直接将Excel中的多行数据直接复制插入到Google Spreadsheets中(OpenOffice也可以直接复制过去),没尝试过的朋友可以马上按如下步骤测试下:

在Excel(或OpenOffice Calc)中选择多行数据,敲Ctrl+C键,复制选择的多行数据:

然后到Google Spreadsheets,敲Ctrl+V键,前面复制的单元格就被复制过来了:

这是如何做到的呢?其实很简单,在Excel(OpenOffice Calc)中,当多个单元格被复制时,这些单元格的数据是以tab键分隔一行行数据(tab-separated values (TSV))存放在剪贴板中的,当这些数据被粘贴到Google Spreadsheets中时,这些TSV格式的数据被解析并被相应插入到Google Spreadssheets中了。

既然知道其中的奥妙,那么剩下的就是在Flex中实现同样的效果了。以下是我们的实现思路,可以在Excel和Flex相互直接复制粘贴数据。

我们的思路的精妙所在是隐藏文本(TextField)组件的使用:

  1. 在DataGrid中,当按下Ctrl键时,我们创建一个隐藏的文本(TextField)组件,并将焦点定位给它,这样,我们就可以接受任何通过Ctrl+V粘贴过来的数据。相应的我们也将DataGrid选择行数据以TSV格式拷贝到TextField组件中,并且将所有的文本选择,这样我们使用Ctrl+C操作就可以复制当前行所有数据了。
  2. 监听隐藏文件组件的textInput事件。如果有任何数据被粘贴的话,那么在这里数据将被解析,并插入到DataGrid中。
  3. 当Ctrl键释放后,移除隐藏的文本组件。

以下是完整实现示例代码:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
   <mx:Script>
       <![CDATA[
   import flash.events.KeyboardEvent;

   private function dataGridKeyDownHandler(event:KeyboardEvent):void
   {
     if (event.ctrlKey && !dataGrid.getChildByName("clipboardProxy"))
     {
       // Add an invisible TextField object to the DataGrid
       var textField:TextField = new TextField();
       textField.name = "clipboardProxy";
       dataGrid.addChild(textField);
       textField.visible = false;

       textField.type = TextFieldType.INPUT;
       textField.multiline = true;

       // Populate the TextField with selected data in TSV format

       textField.text = getTextFromItems(dataGrid.selectedItems);
       textField.setSelection(0, textField.text.length - 1);

       // Listen for textInput event

       textField.addEventListener(TextEvent.TEXT_INPUT,
           clipboardProxyPasteHandler);

       // Set player-level focus to the TextField

       systemManager.stage.focus = textField;
     }
   }


   private function dataGridKeyUpHandler(event:KeyboardEvent):void
   {
     if (!event.ctrlKey)
     {
       var textField:TextField = TextField(dataGrid
           .getChildByName("clipboardProxy"));
       if (textField)
         dataGrid.removeChild(textField);
     }
   }

   private function clipboardProxyPasteHandler(event:TextEvent):void
   {
     // Extract values from TSV format and populate the DataGrid

     var items:Array = getItemsFromText(event.text);
     for each (var item:Object in items)
       dataGrid.dataProvider.addItem(item);
   }

   private function getItemsFromText(text:String):Array
   {
     var rows:Array = text.split("\n");
     if (!rows[rows.length - 1])
       rows.pop();

     var columns:Array = dataGrid.columns;
     var itemsFromText:Array = [];

     for each (var rw:String in rows)
     {
       var fields:Array = rw.split("\t");

       var n:int = Math.min(columns.length, fields.length);
       var item:Object = {};
       for (var i:int = 0; i < n; i++)
         item[columns[i].dataField] = fields[i];
       itemsFromText.push(item);
     }

     return itemsFromText;  
   }

   private function getTextFromItems(items:Array):String
   {
     var columns:Array = dataGrid.columns;
     var textFromItems:String = "";

     for each (var it:Object in items)
     {
       for each (var c:DataGridColumn in columns)
         textFromItems += it[c.dataField] + "\t";
       textFromItems += "\n";
     }

     return textFromItems;
   }
   ]]>
   </mx:Script>
   
   <mx:DataGrid id="dataGrid" editable="true"
       keyDown="dataGridKeyDownHandler(event)"
       keyUp="dataGridKeyUpHandler(event)">
       <mx:columns>
           <mx:DataGridColumn headerText="Scheduled Date"
               dataField="scheduledDate" />
           <mx:DataGridColumn headerText="Home Team"
               dataField="homeTeam" />
           <mx:DataGridColumn headerText="Away Team"
               dataField="awayTeam" />
           <mx:DataGridColumn headerText="Field"
               dataField="field" />
       </mx:columns>
       <mx:dataProvider>
           <mx:Object scheduledDate="4/1/2006" homeTeam="Chester Bucks"
               awayTeam="Long Valley Hitters" field="Dawn Field" />
       </mx:dataProvider>
   </mx:DataGrid>
</mx:Application>

运行实例(FlashPlayer9.0)

以下是最终实现的效果图:

原文:Copy 'n paste between Excel and Flex

Flex 2 中文资源 swc 文件

Flex 2 是严重向 Java 看齐,本地化也是与Java类似。
这里不想去探讨 ResourceBundle 类和 Locale 类的问题,而仅仅是针对 ${FRAMEWORKS}/locale 下的 en_US 的汉化,以及 compc 命令的一些使用方法。

在${FRAMEWORKS}(一般是 C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\frameworks)下有一个 locale 文件夹,其中默认只有一个 en_US 文件夹,里面存放的是英语的资源文件,有若干个 .properties 文件和几个 .swc 文件,.properties 文件相当于源代码,.swc 相当于库,通过 compc 命令可以进行编译。framework_rb.swc 中的内容包括日期、验证提示消息、货币符号,一些出错报告,等等内容,大家可以看下。需要说明的一点 .properties 文件中不能使用引号。

我所做的就是将 en_US 文件夹复制下,改名为 zh_CN,然后修改每个 .properties 文件的内容,然后编译成 .swc 文件。重点是修改 validators.properties 文件,因为这里的很多提示是给最终用户看的,比如邮件地址写错了,会有一个提示,必须是中文的。需要注意的是,修改后,要将文件编码格式改为 UTF-8,否则会有乱码。其他文件更多的是给 coder 自己看的,我就没去详细的翻译:P

修改之后就是编译了,开始->运行->cmd
命令行下输入:
cd C:\Program Files\Adobe\Flex Builder 2

FlexFrameworkCmdPrompt.bat "C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2" "C:\Program Files\Adobe\Flex Builder 2\jre"

compc -locale zh_CN -source-path "Flex SDK 2/frameworks/locale/{locale}" -include-resource-bundles collections controls core effects formatters logging SharedResources skins states validators -output "Flex SDK 2/frameworks/locale/zh_CN/framework_rb.swc"

这样就会在 ${FRAMEWORKS}/locale/zh_CN 下生成 framework_rb.swc,也就是我们所需要的本地化资源文件,以后只要在建立 project 之后,打开工程属性窗口,定位到 Flex Complier,右边的 additional complier arguments 的内容改为 -locale zh_CN,即可使用中文本地化资源了。


下载地址:http://www.xinhuaedu.cn/site/slobber/flex_2_zh_cn_locale.html
posted on 2007-02-10 13:09 ☜♥☞MengChuChen 阅读(1623) 评论(0)  编辑  收藏 所属分类: flex2.0

只有注册用户登录后才能发表评论。


网站导航: