본문 바로가기

따라해보자/엑스플랫폼

이벤트 개요 - Object

반응형
엑스플랫폼이 EDA를 기본으로 만들어졌다고 해서 모든 Object가 이벤트 처리대상은 아닙니다.
앞에서도 이야기했듯이 이벤트는 '주목할할만한 상태의 변화'를 가지고 있어야 합니다.

엑스플랫폼에서 이벤트를 처리대상이 되는 Object 들은 주로 동적으로 상태가 변하는 것들입니다.
UX스튜디오에서 이벤트를 등록할 수 있는 Object 는 다음과 같습니다.

* ADL
ADL(Application) - 애플리케이션의 로딩/시작/종료 등에 대한 이벤트
- onload, onloadingglobalvariables, onloadtypedefinition, onbeforeexit, onexit 등
Frame - Frame Object 에서 발생하는 이벤트. Frame 이벤트는 ChildFrame과 Form과 긴밀한 연관성을 가지고 있습니다.
- onclose, onactivate 등
Tray - Tray 에서 발생하는 이벤트
- ondbclick, onlbuttonup, onrbuttonup
Application Menu - Application Menu 에서 발생하는 이벤트
- 많군요. ㄷㄷ

* Global Variable
Datasets
- cancolumnchange, canrowposchange, oncolumnchanged, onload, onrowposchanged, onrowsetchanged, onvaluechanged

* Service
Form, Component, Invisible Object 
- 이 정도면 거의 전부인것 같은데요. ㅠㅠ

이벤트를 고려할때 실수하는 부분 중 하나가 전이에 대한 부분입니다.
부모-자식 관계를 가지는 object 들이 배열되어 있는 경우에
이벤트가 차례로 발생하는 내용을 이해하고 있지 않으면
오류로 인지할 수 있습니다.

다음과 같은 간단한 폼이 있다고 합시다.


폼 안에 Div 가 있고 그 안에 버튼이 올려져 있습니다. 
옆에 있는 것은 이벤트 로그를 찍어줄 TextArea 입니다.

버튼을 클릭하게 되면 이벤트가 어떻게 흘러갈까요?
일단 이벤트마다 다릅니다.
엑스플랫폼의 경우 모든 이벤트가 부모에게 전이되지 않습니다.

같은 버튼의 이벤트라도 onrbuttondown 같은 경우에는 전이가 되는데 onclick 같은 경우에는 전이가 되지 않습니다.
전이가 되는 경우에는 기본값이 전이가 되도록 설정되어 있습니다.
물론 이벤트를 받아서 처리를 하지 않으면 문제가 없지만 버튼과 Div 에서 다른 형식으로 처리를 해주어야 하는 경우에는
버튼의 이벤트가 부모로 전이되지 않도록 해야 합니다.

function Div00_Button00_onrbuttondown(obj:Button, e:MouseEventInfo)
{
TextArea00.value += "button"+" from:"+e.fromobject;
}

일반적으로 버튼에서 이벤트를 생성하면 위와 같이 생성이 되는데요.
리턴값을 달지 않아도 오류로 처리되지 않습니다. 기본값이 있으니깐요.
이런 경우에는 이벤트가 Button > Div > Form 으로 흘러가게 되고
각 컴포넌트에 이벤트를 처리하는 프로세스가 있는 경우 해당 프로세스를 처리하게 됩니다.

하지만 여기서 부모로 전이되지 않도록 하려면 리턴값을 정의하려 합니다.

function Div00_Button00_onrbuttondown(obj:Button, e:MouseEventInfo)
{
TextArea00.value += "button"+" from:"+e.fromobject;
return true;
}

이렇게 해주면 상위 컴포넌트에서 이벤트가 발생하지 않습니다.
이벤트 발생시 넘어오는 이벤트 Object 에도 쓸만한 정보를 많이 찾을 수 있습니다.
예를 들어 MouseEventInfo 안에는 fromobject 라는 것이 있는데 실제 이벤트가 어디서 발생했는지
추적할 수 있습니다.

이벤트를 처리할때 또 하나 주의할점은 데이터를 변경시키는 경우입니다.
달력에서 날짜를 변경할때 spin 을 사용하는 경우 위,아래 버튼을 클릭할때마다 
onspin 이벤트가 발생합니다. 이때 화면 상으로는 데이터가 업데이트되었기 때문에
그냥 쓰면 되겠지 하고 컴포넌트의 value를 그냥 가져다 쓰면 안됩니다.
이벤트가 발생하는 순간 해당 함수내에서는 아직 value가 업데이트되지 않았기 때문이죠.
그래서 이벤트 처리 이후 변경될 값을 사용하고자 한다면 넘어오는 CalendarSpinEventInfo 이벤트 정보에서
postvalue 속성값을 사용합니다.
설명을 보면 Event 발생 이후 Component가 가질 value Property 라고 하네요. 
728x90