以DateField在Flex的DataGrid上進行編修

在DataGrid設為editable時進入該欄.會以Text格式去處理編修.但如該欄是個Date 格式時便會出問題,故要用些小技巧來處理才行.我的作法如下:

1.建立一個inline的元件
<mx:Component id=”DateEditor”>
  <mx:DateField formatString=”YYYY/MM/DD”>
   <mx:Script>
    <![CDATA[
     import vo.dm.InvNumber;
     
     override public function set data(value:Object):void{
                  if(listData){
                      this.selectedDate =new Date( value[Object(listData).dataField] );
                } 
        }  
    ]]>
   </mx:Script>
  </mx:DateField>
 </mx:Component>

2.DataGrid上至要有三個event需宣告,及editable設為true
<mx:DataGrid    
    editable=”true” 
     itemEditBegin=”editBegin(event)”
    itemEditEnd=”editEnd(event)”
    itemFocusIn=”itemFocusIn(event)”
     >
3.所用之欄位的itemEditor
<mx:columns>
    <mx:DataGridColumn dataField=”datetimefield_name” labelFunction=”dgDateFunc” width=”100″ itemEditor=”{DateEditor}” />

4.Event handle如下:
   
private function editBegin( event:DataGridEvent ):void {
   var field:String = event.dataField;
   var ADG:DataGrid = event.currentTarget as DataGrid;
   var selectedItem:Object = event.currentTarget.selectedItem;
   //此部份目前沒有特別的處理.
   if (field == “datetimefield_name”) {
     //var ds:String = event.currentTarget.itemEditorInstance
     //event.currentTarget.itemEditorInstance.formatString=”YYYY/MM/DD”;
   }
  }
  
  private function editEnd( event:DataGridEvent ):void {
   
   var field:String = event.dataField;
   var ADG:DataGrid = event.currentTarget as DataGrid;
   var selectedItem:Object = event.currentTarget.selectedItem;

   // 檢查是否修改,如未異動則離開.
   if( ADG.itemEditorInstance is TextInput &&
     ( selectedItem[field] == (ADG as Object).itemEditorInstance.text ) )
       return;

 //在入FocusOut,有時為防制些特例.故我會先移再加入.
   ADG.removeEventListener( DataGridEvent.ITEM_FOCUS_OUT ,itemFocusOut ); 
   ADG.addEventListener( DataGridEvent.ITEM_FOCUS_OUT ,itemFocusOut );
   
    if (field == “datetimefield_name”) {
     var ds:String = event.currentTarget.itemEditorInstance[ADG.columns[event.columnIndex].editorDataField];
     var dateValue:Date = new Date( ds );
      selectedItem[field] = dateValue;

//在此停止掉end edit事件會進行的動作.
      event.preventDefault();
      //清掉DateField元件
      ADG.destroyItemEditor();

     //使顯示為修改後的值
      event.itemRenderer.data  = selectedItem;
            
      return;
     
    }
  }
  
  //修改後的Event
  private function itemFocusOut(e:DataGridEvent):void
  {    
   e.currentTarget.removeEventListener( DataGridEvent.ITEM_FOCUS_OUT ,itemFocusOut );  
   //可在此回存 doUpdate( );   
  }
  
  //for DateField Event
  private function itemFocusIn(event:DataGridEvent):void
  {
   if ( event.itemRenderer is DateField )
      ( event.itemRenderer as DateField).formatString=”YYYY/MM/DD”;
   }

發表於 作法 | 已標籤 , , , | 發表迴響

Flex及Javascript之交互呼叫(1)

為了能取得browser關閉或切換到其他頁面時,flex內remoting-service內尚有未清除的資料,故利用javascript來通知flex清除.

import flash.external.*;
public function initApp():void {
ExternalInterface.addCallback(“BrowserWindowUnload”,  handleWinUnload);
}
public function handleWinUnload():void {
….

}

JavaScript部份:

<script language=”JavaScript” type=”text/javascript”>
<!–
window.onbeforeunload=closeEvent;
function closeEvent()
{
 var flex = document.${application} || window.${application};
 flex.BrowserWindowUnload();

}
// –>
</script>

發表於 作法 | 已標籤 , , , | 1 則迴響

FLV轉檔之測試研究

FLV轉檔之測試研究
key Frame 關鍵畫面.會影響到
1. 拖曳時之提示畫面.
2. 拖曳之相隔時間長度.
如影片的keyFram=1則表示每個fram都要有key會造成檔案很大但因每個Frame都有便能控製的很好.
結論:
KeyFrame的多寡視片源的Frame/秒而定.
如需要的flv檔只為了提供給重頭播到尾,則keyframe可用較大的值,或轉檔程式

自動設值(Key frame interval: 60 frames).
如需要的是做為檢查各分頁之用的有較好的控制,則要較小的值.如keyFrame=1則每頁都會有keyFrame但檔案會變的較大(我測約4倍).

但如是使用在Flash Media Server 時,Media Server則可設定成不受此限,而能工作正常.
建議使用Adobe Flash CS3 video Encoder
轉完的檔案會有總長時間(Can seek to end)

LV

發表於 Adobe Flex | 發表迴響

BitmapData與ByteArray的操作

在Flash內,我們如果需要對外部載入圖檔,或是stage上的Sprite
做一些點陣圖形的操作(變形旋轉或其他)
要將處理過後的點陣資料,做頁面上顯示或是另做檔案儲存
在這過程中,都是在於DisplayObject,BitmapData與ByteArray這三者的轉換處理
以下是常用處理範例
BitmapData操作
1.如何取得DisplayObject的bitmapData

var bitmapData:BitmapData=new BitmapData();

bitmapData.draw(DisplayObject) 
2.如何取得外部圖檔或swf的bitmapData
(也就是將外部檔案寫到bitmapData內)
1.利用Loader載入外部檔案

var loader:Loade=new Loader()

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);

loader.load(‘xxx.jpg’);
2.載入完成後,將載入資料寫到bitmapData內

var bitmapData:BitmapData=new BitmapData();

bitmapData.draw(loader)

3.如何將bitmapData變成一個DisplayObject

var bitmapData:BitmapData=new BitmapData();

var bitmap:Bitmap=new Bitmap(bitmapData);

DisplayObjectContainer.addChild(bitmap); 
4.如何將bitmapData變成byteArray
如果要將圖檔以資料方式傳到Server上,要轉成byteArray形式才能上傳

var byteArray:ByteArray=JPEGEncoder.ecncode(bitmapdata)

ByteArray操作
1.如何將byteArray變成一個實體檔案

var targetFile:File =File.createTempFile();

var stream:FileStream = new FileStream();

stream.open(targetFile, FileMode.WRITE)

stream.writeBytes(byteArray, 0, 0);

stream.close(); 
2.如何將byteArray變成bitmapData

var bitmapData:BitmapData=new BitmapData();

bitmapData.setPixels(new Rectangle(),byteArray);

發表於 Adobe Flex | 1 則迴響