【永恒的瞬間】
          ?Give me hapy ?
          一個(gè)簡(jiǎn)單的ActionScript?3?Iterator實(shí)現(xiàn)

          darron schall 發(fā)布了一個(gè)As3 Iterator的實(shí)現(xiàn),你可以點(diǎn)擊這里下載,該組件的用法非常簡(jiǎn)單,下載的壓縮包包括一個(gè)Iterator接口和一個(gè)范例的Array Iterator實(shí)現(xiàn),以下是使用范例:

          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?:?通過(guò)類名稱獲取類引用

          在ActionScript 3中如果我們只知道類名稱但又想獲得一個(gè)類的引用的話,那么我們可以使用flash.utils.getDefinitionByNam創(chuàng)建一個(gè)類的實(shí)例。

          例如:

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

          以上代碼根據(jù)類名稱“String”創(chuàng)建一個(gè)String類的實(shí)例,getDefinitionByName需要完整類路徑,所以如果我們想創(chuàng)建MovieClip的實(shí)例的話,我們需要提供完整的類路徑:

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

          這樣的方法雖然有些旁門左道,但卻非常有用!

          Flex2:在Excel與Flex之間粘貼數(shù)據(jù)

          試用過(guò)Google Spreadsheets的朋友,可能發(fā)現(xiàn)其一個(gè)有意思的特性,我們可以直接將Excel中的多行數(shù)據(jù)直接復(fù)制插入到Google Spreadsheets中(OpenOffice也可以直接復(fù)制過(guò)去),沒(méi)嘗試過(guò)的朋友可以馬上按如下步驟測(cè)試下:

          在Excel(或OpenOffice Calc)中選擇多行數(shù)據(jù),敲Ctrl+C鍵,復(fù)制選擇的多行數(shù)據(jù):

          然后到Google Spreadsheets,敲Ctrl+V鍵,前面復(fù)制的單元格就被復(fù)制過(guò)來(lái)了:

          這是如何做到的呢?其實(shí)很簡(jiǎn)單,在Excel(OpenOffice Calc)中,當(dāng)多個(gè)單元格被復(fù)制時(shí),這些單元格的數(shù)據(jù)是以tab鍵分隔一行行數(shù)據(jù)(tab-separated values (TSV))存放在剪貼板中的,當(dāng)這些數(shù)據(jù)被粘貼到Google Spreadsheets中時(shí),這些TSV格式的數(shù)據(jù)被解析并被相應(yīng)插入到Google Spreadssheets中了。

          既然知道其中的奧妙,那么剩下的就是在Flex中實(shí)現(xiàn)同樣的效果了。以下是我們的實(shí)現(xiàn)思路,可以在Excel和Flex相互直接復(fù)制粘貼數(shù)據(jù)。

          我們的思路的精妙所在是隱藏文本(TextField)組件的使用:

          1. 在DataGrid中,當(dāng)按下Ctrl鍵時(shí),我們創(chuàng)建一個(gè)隱藏的文本(TextField)組件,并將焦點(diǎn)定位給它,這樣,我們就可以接受任何通過(guò)Ctrl+V粘貼過(guò)來(lái)的數(shù)據(jù)。相應(yīng)的我們也將DataGrid選擇行數(shù)據(jù)以TSV格式拷貝到TextField組件中,并且將所有的文本選擇,這樣我們使用Ctrl+C操作就可以復(fù)制當(dāng)前行所有數(shù)據(jù)了。
          2. 監(jiān)聽(tīng)隱藏文件組件的textInput事件。如果有任何數(shù)據(jù)被粘貼的話,那么在這里數(shù)據(jù)將被解析,并插入到DataGrid中。
          3. 當(dāng)Ctrl鍵釋放后,移除隱藏的文本組件。

          以下是完整實(shí)現(xiàn)示例代碼:

          <?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>
          

          運(yùn)行實(shí)例(FlashPlayer9.0)

          以下是最終實(shí)現(xiàn)的效果圖:

          原文:Copy 'n paste between Excel and Flex

          Flex 2 中文資源 swc 文件

          Flex 2 是嚴(yán)重向 Java 看齊,本地化也是與Java類似。
          這里不想去探討 ResourceBundle 類和 Locale 類的問(wèn)題,而僅僅是針對(duì) ${FRAMEWORKS}/locale 下的 en_US 的漢化,以及 compc 命令的一些使用方法。

          在${FRAMEWORKS}(一般是 C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\frameworks)下有一個(gè) locale 文件夾,其中默認(rèn)只有一個(gè) en_US 文件夾,里面存放的是英語(yǔ)的資源文件,有若干個(gè) .properties 文件和幾個(gè) .swc 文件,.properties 文件相當(dāng)于源代碼,.swc 相當(dāng)于庫(kù),通過(guò) compc 命令可以進(jìn)行編譯。framework_rb.swc 中的內(nèi)容包括日期、驗(yàn)證提示消息、貨幣符號(hào),一些出錯(cuò)報(bào)告,等等內(nèi)容,大家可以看下。需要說(shuō)明的一點(diǎn) .properties 文件中不能使用引號(hào)。

          我所做的就是將 en_US 文件夾復(fù)制下,改名為 zh_CN,然后修改每個(gè) .properties 文件的內(nèi)容,然后編譯成 .swc 文件。重點(diǎn)是修改 validators.properties 文件,因?yàn)檫@里的很多提示是給最終用戶看的,比如郵件地址寫錯(cuò)了,會(huì)有一個(gè)提示,必須是中文的。需要注意的是,修改后,要將文件編碼格式改為 UTF-8,否則會(huì)有亂碼。其他文件更多的是給 coder 自己看的,我就沒(méi)去詳細(xì)的翻譯:P

          修改之后就是編譯了,開(kāi)始->運(yùn)行->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"

          這樣就會(huì)在 ${FRAMEWORKS}/locale/zh_CN 下生成 framework_rb.swc,也就是我們所需要的本地化資源文件,以后只要在建立 project 之后,打開(kāi)工程屬性窗口,定位到 Flex Complier,右邊的 additional complier arguments 的內(nèi)容改為 -locale zh_CN,即可使用中文本地化資源了。


          下載地址:http://www.xinhuaedu.cn/site/slobber/flex_2_zh_cn_locale.html
          posted on 2007-02-10 13:09 ???MengChuChen 閱讀(1637) 評(píng)論(0)  編輯  收藏 所屬分類: flex2.0
          主站蜘蛛池模板: 镇平县| 宣城市| 抚顺市| 施甸县| 钦州市| 离岛区| 繁昌县| 新泰市| 天峨县| 原平市| 磐安县| 三亚市| 邛崃市| 阳江市| 淮滨县| 奉贤区| 抚松县| 四平市| 磴口县| 临漳县| 荃湾区| 紫金县| 天门市| 教育| 来宾市| 鸡东县| 临夏市| 闸北区| 阿瓦提县| 子洲县| 太谷县| 沅江市| 中西区| 铁岭县| 张家界市| 惠水县| 渭南市| 江孜县| 乃东县| 屏山县| 封丘县|