Flex/AIR/AS3/Error Code2009.08.31 17:08
warning: unable to bind to property 'isCheck' on class 'Object' (class is not an IEventDispatcher)
위 경고 메세지가 뜰 경우 대처 방법

Bind 된 데이타의 타입이 정확하지 않을 경우 Object 객체에 담아서 대입한다.

[출처] Tong - BlueSky_09님의 Flex/Flash/AIR/As통 http://tong.nate.com/lhs0806/40051251

혹시나 봤을지 모르겠지만, FLEX 실행시에 Debugger 를 걸던지 , flashlog.txt 파일에 떨어지는 저런 경고문구들을
본적이 있을것이다. 없으면...ㅠ_ㅠ 쥐쥐~~~ 
가장 대표적인 예로 저렇게 경고를 뜨게하려면 간단하다. 

===============================================================================
1. ActionScript 부분
=============================================================================== 

private function ResultHandler(event:ResultEvent):void{
    // 조회된 정보를 가져온후 DATA 를 핸들링한다.   
    orginalLists = new ArrayCollection();
    orginalLists = ArrayCollection(event.result);
   
    madeLists = new ArrayCollection();
   
    for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    });
    }
  } 

===============================================================================
2. MXML 부분
===============================================================================

<mx:DataGridColumn headerText="FactoryName" dataField="value5">
  <mx:itemRenderer>
    <mx:Component>
      <mx:HBox width="100%" height="100%" backgroundAlpha="0" horizontalScrollPolicy="off" verticalScrollPolicy="off">
      <mx:Script>
      <![CDATA[
     
      import mes.common.utils.ComponentUtils;     
      import mx.controls.ComboBox;
      import mx.events.CloseEvent;
      import mx.controls.Alert;

                         
      public function setComboIndex():void{         
        if(data != null){         
            combo1.selectedIndex = ComponentUtils.getComboIndex(combo1 , String(data.value5));
        }
      }     
      ]]>
      </mx:Script>
      <common:PlantComboBoxRenderer id= "combo1"  change="{data.value5 = combo1.selectedItem.data}">               
      </common:PlantComboBoxRenderer>
      </mx:HBox>
    </mx:Component>
    </mx:itemRenderer>
  </mx:DataGridColumn> 

============================================================================================= 

=> 스크립트 소스부분을 보면 RemoteObject 의 결과 이벤트로서 호출되는 함수란것을 알수있다(?) 
    머 중요한건 아니고, 암튼 잘 보면 result 의 사이즈 만큼 for 문을 돌면서, 새로운 배열에 
    Dynamic 하게 객체를 생성해서 새로운 ArrayCollection 을 만들고 있다. 아래처럼.... 

    for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    }); 

    그리고, madeLists 녀석은 [Bindable] 메타 테그로 선언되어져서 MXML 부분에 DataGrid 의 dataProvider 로 
    바인딩 되어있다.(소스의 전체를 긁어다 놓은것이 아니므로 말로써 이해하기 바람~~) 
    다음으로, MXML 부분을 보면, DataGrid 안에 한 칼럼에 ComboBox 를 넣기 위해 itemRenderer 를 사용하여 , 
    inLine 스크립트를 구현하였다. 

    실제 저 소스가 돌아가는 원리를 순서로 표현하면, 

    1. 인라인으로 구현된 ComboBox  가 초기화 되면서, DB 접속을 한다. 
    2. 받아온 결과로 ComboBox 의 dataProvider 에 데이터를 바인딩한다. 
    3. CallBack 함수로 구현된 부모클래스의 setComboIndex() 를 호출한다. 
        - ComboBox 에서 호출하는 상세부분은 위 소스에는 없다. 
    4. ActionScript 부분에서 DataGrid 에 바인딩 해준 값을 가져다가 ComboBox 에 존재하는지 검사한다. 
    5. ComboBox 에 해당 데이터가 있으면 ComboBox 의 selectedIndex 를 선택되어있게 한다. 

-> 즉, DataGrid 안에 ComboBox 를 넣고, 그 초기값을 셋팅하기 위한 삽질이다. (물론 더 좋은 방법도 많으리라 생각한다.) 
그런데, 문제는 저렇게 바인딩 하고 실행하면 아마 위 제목에 뿌려진 경고가 좍좍좍 뿌려질것이다.
이유인즉..(검색과 삽질....)
우리가

 for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    }); 

이렇게 집어넣은것이 문제인것이다. DataGrid 에서 바인딩을 해야 하는데, 실제 Object 의 성향을 알지 못한다는것이다.
머 깊게 들어가봐야 머리만 복잡하고, FLEX 접고 싶어질 뿐이라 해결책만 간단하게 설명하자면.......
윗 부분을

for(var i:uint = 0; i < orginalLists.length ; i++){ 
      var objectProxy:ObjectProxy = new ObjectProxy();
      objectProxy.value1 = orginalLists.getItemAt(i).value1;
      objectProxy.value2 = orginalLists.getItemAt(i).value2;
      objectProxy.value3 = orginalLists.getItemAt(i).value3;
      objectProxy.value4 = orginalLists.getItemAt(i).value4;
      objectProxy.value5 = orginalLists.getItemAt(i).value5;
      objectProxy.isCheck = "N"; 

      madeLists.addItem(objectProxy);


이런식으로 바꾸면 만사 OK 라는 것이다. 즉, 바인딩 되는 Object 대해서는 저렇게 선언이 되어져야만
ObjectProxy 라는 녀석이 그 객체를 Tracking 하면서 속성값의 변경이라던가를 감시하는것 같다.
사실 저렇게 안해도 아무 문제는 없다.(구현상)
그런데 깔끔해진 로그 파일을 보면 감탄하리라 생각된다. 앞으로도 저렇게 쓰는 습관을 들이는것이 좋을듯 하다. 

두서가 쓸데없이 길었지만 예제를 보다 적나라하게 설명하고자 나름 길게 삽질 했으니 이해바란다.~
모두 수고~
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★

[출처] 지돌스타님 블로그 http://blog.jidolstar.com/329

Flex에서 Image 클래스를 이용해서 로드하는 컨텐츠중 png, jpg 등의 이미지를 회전, 확대를 하게 되면 이미지가 약간씩 깨진다.

이때 깨지는 것을 방지하기 위해 Bitmap클래스의 smoothing 속성을 true로 설정하면되는데...
Image클래스에 로드되는 컨텐츠는 DisplayObject이므로 바로 smoothing을 적용할 수 없다.
매번 smoothing속성을 적용하는 것도 귀찮으므로
Image클래스를 확장하여 SmoothImage 클래스를 만들어 보았다.

/** 
 * SmoothImage 클래스 
 * 제작 : 지돌스타(http://blog.jidolstar.com, jidolstar@gmail.com) 
 * 환경 : Flex 3 
 * 
 * Image로 로드하는 컨텐츠에 smoothing 자동적용시켜 회전, 확대시 이미지가 깨지는 것을 방지해준다. 
 */ 
package com.starpl.components 
{ 
      import flash.display.Bitmap; 
      import flash.display.DisplayObject; 
      import flash.events.Event; 
      import flash.events.IOErrorEvent; 
      import flash.events.SecurityErrorEvent; 
      
      import mx.controls.Image; 
  
      public class SmoothImage extends Image 
      { 
            public function SmoothImage() 
            { 
                    super(); 
            } 
            
            override public function load(url:Object=null):void 
            { 
                    super.load(url); 
                    addEventHandlers(); 
            } 
            
            private function completeEventHandler(event:Event):void 
            { 
                    var content:DisplayObject = this.content as DisplayObject; 
                    var bitmap:Bitmap; 
                    if(content) 
                    { 
                          bitmap = content as Bitmap; 
                          if( bitmap ) 
                                bitmap.smoothing=true; 
                    } 
                    removeEventHandlers(); 
            } 
            
            override public function set source(value:Object):void 
            { 
                    var bitmap:Bitmap = value as Bitmap; 
                    if( bitmap ) 
                    { 
                          bitmap.smoothing = true;  
                    } 
                    super.source = value; 
            } 
            
            private function ioEventHandler(event:IOErrorEvent):void 
            { 
                    removeEventHandlers(); 
            } 
            
            private function securityErrorEventHandler(event:SecurityErrorEvent):void 
            { 
                    removeEventHandlers(); 
            } 
            
            private function addEventHandlers():void 
            { 
                    this.addEventListener(Event.COMPLETE, completeEventHandler); 
                    this.addEventListener(IOErrorEvent.IO_ERROR, ioEventHandler); 
                    this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorEventHandler); 
            } 
            
            private function removeEventHandlers():void 
            { 
                    this.removeEventListener(Event.COMPLETE, completeEventHandler); 
                    this.removeEventListener(IOErrorEvent.IO_ERROR, ioEventHandler); 
                    this.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorEventHandler); 
            } 
      } 
}


사용방법은 Image처럼 사용하면 되겠다.






어려운 팁은 아닌데 의외로 알면 유용하다는 거~~ ^^
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/Component2009.08.31 17:01

Tree의 내용이 변경되어 스크롤바의 크기가 제대로 적용되지 않을 경우 Tree를 확장하여 크기에 따라 스크롤을 재정의 한다.

Tree크기에 따른 스크롤바 크기 자동설정

package{ 
    import flash.events.Event; 
    import mx.controls.Tree; 
    import mx.core.mx_internal; 
    import mx.core.ScrollPolicy; 
    import mx.events.TreeEvent; 

    public class AutoSizeTree extends Tree { 
          public function AutoSizeTree(){ 
              super(); 
              horizontalScrollPolicy = ScrollPolicy.AUTO; 
          } 
          
          // we need to override maxHorizontalScrollPosition because setting 
          // Tree's maxHorizontalScrollPosition adds an indent value to it, 
          // which we don't need as measureWidthOfItems seems to return exactly 
          // what we need.  Not only that, but getIndent() seems to be broken 
          // anyways (SDK-12578). 
        
          // I hate using mx_internal stuff, but we can't do 
          // super.super.maxHorizontalScrollPosition in AS 3, so we have to 
          // emulate it. 

          override public function get maxHorizontalScrollPosition():Number          { 
              return mx_internal::_maxHorizontalScrollPosition; 
          } 
      
          override public function set maxHorizontalScrollPosition(value:Number):void { 
              mx_internal::_maxHorizontalScrollPosition = value; 
              dispatchEvent(new Event("maxHorizontalScrollPositionChanged")); 
              
              scrollAreaChanged = true; 
              invalidateDisplayList(); 
          } 
          
          override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
          { 
              // we call measureWidthOfItems to get the max width of the item renderers. 
              // then we see how much space we need to scroll, setting maxHorizontalScrollPosition appropriately 
              var diffWidth:Number = measureWidthOfItems(0,0) - (unscaledWidth - viewMetrics.left - viewMetrics.right); 
              
              if (diffWidth <= 0) 
                    maxHorizontalScrollPosition = NaN; 
              else 
                    maxHorizontalScrollPosition = diffWidth; 
              
                    super.updateDisplayList(unscaledWidth, unscaledHeight); 
          } 
    } 
} 
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/AIR2009.08.31 16:57

[File] 디렉토리 및 파일 내역 참조

Package flash.filesystem
Class public class File

Public Properties
applicationDirectory:File - [static] [read-only] 응용프로그램의 설치된 파일을 포함하는 폴더입니다.

applicationStorageDirectory:File - [static] [read-only] 응용 프로그램의 전용 저장소 디렉토리입니다.

예) C:\Documents and Settings\User\Application Data\com.adobe.example.FileStream\Local Store
AIR에서는 Application Data폴더내에서 어플리케이션 단위로 로컬 저장소 형태의 폴더를 구성할 수 있다.
[출처] - http://cafe.naver.com/apollocation/379

Example

더보기


constructor:Object - 생성된 class 또는 생성자입니다.

Example

더보기



creationDate:Date - [read-only] Local disk에 생성된 날짜입니다.

creator:String - [read-only] Mac OS/Mac OS X에서만 사용가능한 파일의 Macintosh creator 타입입니다.

data:ByteArray - [read-only] load() method 호출 성공후 로드된 data입니다.

desktopDirectory:File - [static][read-only] 사용자의 데스크톱(바탕화면) 디렉토리입니다.

Example

더보기



documentsDirectory:File - [static][read-only] 사용자의 문서 (내 문서) 디렉토리입니다.

Example

더보기



exists:Boolen - [read-only] 파일 또는 디렉토리가 있는지 여부를 나타냅니다.

Example

더보기



extension:String - [read-only] 참조된 파일의 확장자명입니다.

icon:Icon - [read-only] 파일에 대해 정의된 아이콘을 포함하는 Icon 객체입니다.
GUI형식의 OS에서 사용되는 파일의 아이콘 관련 정보를 가진 flash.desktop.Icon 객체의 참조를 리턴한다.
[출처] - http://cafe.naver.com/apollocation/379

Example

더보기



 isDirectory:Boolen - [read-only] 디렉토리가 참조되어 있는지 여부를 나타냅니다.

Example

더보기



 isHidden:Boolen - [read-only] 참조된 파일 또는 디렉토리가 "숨겨져" 있는지 여부를 나타냅니다. 참조된 파일 또는 디렉토리가 숨겨져 있는 경우에는 값이 true이고, 그렇지 않은 경우에는 false입니다.

Example

더보기


 isPackage:Boolen - [read-only] 참조된 디렉토리가 패키지인지 여부를 나타냅니다.

 isSymbolicLink:Boolen - [read-only] 참조가 심볼 링크인지 여부를 나타냅니다.

 lineEnding:String - [static] [read-only] 호스트 운영 체제에서 사용한 행 끝 문자 시퀀스입니다.

Example

더보기



 modificationDate:Date - [read-only] 참조된 파일의 마지막 수정된 날짜입니다.

 name:String - [read-only] 참조된 파일 또는 디렉토리의 이름입니다.

 nativePath:String - 참조된 파일 또는 디렉토리의 호스트 운영 체제 표현의 전체 경로입니다.

Example

더보기



parent:File - [read-only] 참조된 파일 또는 디렉토리를 포함하는 디렉토리입니다.

Example

더보기



prototype:Object - [static] 클래스 또는 함수 객체의 프로토 타입 객체에 대한 참조입니다.

separator:String - [static] [read-only] 호스트 운영 체제의 경로 구성 요소 분리 기호 문자입니다.

Example

더보기



size:Number - [read-only] 참조된 파일의 Local disk 용량(bytes)입니다.

디렉토리의 용량은 0으로 반환합니다.

spaceAvailable:Number - [read-only] 이 File 위치에서 사용 가능한 공간(바이트)입니다.

systemCharset:String - [static] [read-only] 호스트 운영 체제에서 사용한 기본 인코딩입니다.

Example

더보기



type:String - [read-only]

url:String - 이 파일 경로의 URL입니다.

ex) file://c:\

Example

더보기



userDirectory:File - [static] [read-only] 사용자의 디렉토리입니다.

Example

더보기


저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/Event2009.08.26 23:43

이벤트리스너를 등록할때 매개변수를 전달하기 위해서는
addEventListener 의 argument로 Function 타입의 값을 넘겨 주면 된다.

private function test():void
{
	var bt:Button = new Button();

	// Event 매개 변수로 리턴값이 Function인 eventFunc을 넘겨준다.
	bt.addEventListener(MouseEvent.CLICK, eventFunc(mouseEvt,"test");
}

// ...arg : argument를 여러개 등록할 수 있음
private function eventFunc(func:Function, ...arg):Function
{
	return function(...innerArgs):void { 
		func.apply(this, innerArgs.concat(arg)); 
	}
} 

private function mouseEvt(e:MouseEvent, s:String):void
{
	trace(s);
} 
저작자 표시 비영리 변경 금지
신고

'Flex/AIR/AS3 > Event' 카테고리의 다른 글

ActionScript 3.0 - Event 전파 차단하기  (0) 2010.03.04
[Event] Event에 매개변수 전달하기  (0) 2009.08.26
Posted by 코멧'★
Flex/AIR/AS3/AIR2009.07.31 02:58

이번에는 Tree Component를 확장하여 윈도우 탐색기와 비슷한 FileSystemTree를 만드는 법에 대해서 알아보겠습니다.

말은 거창하지만 실은 여러가지 꼼수가 숨어있다는 ^^; ㅎ
(원래는 소스 공개를 할 생각이었지만 소스가 너무 난잡한 관계로 댓글이나 메일을 주시는 분들에게만 보내드리겠습니다.)

원리는 간단합니다. 트리콤포넌트를 상속받아 임의로 바탕화면과 내문서, 내컴퓨터 등을 추가하여 주면 됩니다.


소스가 정리되면 다시 리포팅 하겠습니다;;

저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/AIR2009.07.22 23:41

파일 시스템 트리는 쉽게 말해 컴퓨터의 파일 구조를 보여주는 트리형태의 Navigator 라고 생각하면 됩니다.
사용자 컴퓨터의 디렉토리 구조와 파일들을 보여주기 때문에 AIR에서만 사용이 가능합니다.
(개인적으로 웹상에서도 사용할 수 있었으면 참 좋겠지만;;)

에어에서 파일시스템 트리를 사용하기 위해서는 컴포넌트 중 FileSystemTree를 쓰기만 하면 사용이 가능합니다.
바로 아래처럼 <mx:FileSystemTree /> 이거만 써주면 파일시스템트리 완성!! 참~ 쉽죠잉~ㅋ

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:FileSystemTree />
 
</mx:WindowedApplication>


위의 코드를 실행하여 보면 좌측과 같은 실행화면을 확인할 수 있습니다.

좌측 그림에서 보다시피 에어에서 파일시스템을 사용하게 되면 우리가 윈도우에서 흔히 보는 파일시스템 트리가 아닌 단순한 형태의 파일 시스템 트리를 확인할 수 있습니다. 윈도우에 적응이되어 있는 분들이시라면 상당히 당혹스러운;; (나만 그런건가;; 쿨럭;;)

우리가 흔히 보는 윈도우 운영체제에서의 파일시스템 트리에 익숙한 우리로서는 아무래도 좌측 그림가 같은 파일시스템트리가 낯설 수 밖에 없습니다.
 물론 좀 까다로운 작업이긴 하지만 윈도우에서 사용하는 파일시스템트리처럼 보이게 만들 수는 있습니다. 하지만, 어느정도 지식도 필요하고 설명하기에는 좀 내용이 길어질 것 같아서 우선 에어에서 제공되는 기본 파일시스템 트리의 사용법을 좀 더 살펴본 후 다음기회에 윈도우 운영체제에서 사용하는 파일시스템트리 형태의 시스템트리를 만드는 방법도 정리해볼까 합니다. 겨..결코 귀찮아서가 아닙니다. ㅋ

이번글에서는 파일시스템트리의 프로퍼티 중
enumerationMode 에 대해서 정리하려고 하는데요. enumerationMode는 FileSystemTree에서 디렉토리 또는 파일의 구조가 어떻게 표시 될지를 설정할 수 있습니다.

FileSystemEnumerationMode 에는 총 5가지가 존재합니다.

DIRECTORIES_FIRST : 디렉토리를 우선 출력 후 파일출력
DIRECTORIES_ONLY : 디렉토리만 출력
FILES_AND_DIRECTORIES : 디렉토리와 파일의 구분없이 순서(파일or디렉토리명)대로 출력합니다.
FILES_FIRST : 파일을 우선 출력 후 디렉토리 출력
FILES_ONLY : 파일만 출력

위와 같은 모드가 존재하고 사용법은 다른 프로퍼티와 마찬가지로 enumerationMode에 string형태로 작성하여 주면 됩니다.

ex)

더보기


처음으로 글을 써보는데 생각처럼 쉽지도 않고 참 오래 걸리네요;; 익숙해지는데로 점더 알찬 내용으로 글을 쓰도록 노력하겠습니다 ㅋ ^^;;; 원래는 각 속성들을 자세하게 작성하려고 했는데 너무 오래걸리는 바람에;; 오늘은 이쯤에서 마무리하겠습니다~ 죄송 ^^;;
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★

티스토리 툴바