XPLATFORM 101
보통 쇼핑몰같은 곳에 가보면 특정한 값을 선택하기 위한 도구로 슬라이더를 제공합니다.
쇼핑몰 외에도 다양한 곳에 사용되고 있습니다. 사용자가 직접 값을 입력하지 않고
대략적인 수치만으로 범위를 조정할때 사용하곤 합니다.


아쉽게도 엑스플랫폼에는 기본 컴포넌트로 제공되지 않고 있는데요.
어렵지 않게 동일한 기능을 가지는 슬라이더를 만들어볼 수 있습니다.

샘플로 만들어볼 슬라이더는 가로로 펼쳐진 슬라이더입니다.
먼저 가로막대를 배치합니다. 일반적인 용어로는 트랙이라고도 합니다.

Shape 컴포넌트를 가져다가 적당히 그려놓고
스타일 속성에서 strokepen 속성을 지정합니다.
strokepen 은 선에 대한 속성을 지정하는 항목입니다.
Shape 컴포넌트는 type 속성으로 모양을 지정하는데
기본 type이 line 입니다. 그래서 선을 그리는 경우에는 따로 type을 지정하지 않아도 됩니다.

그리고 값을 조절할 막대를 하나 만들어줍니다.
이런 막대는 썸(Thumb)이라고 합니다.
여기에서는 흰색 삼각형으로 만들어보겠습니다.
역시 Shape 컴포넌트를 가져다놓고 type을 triangle로 변경합니다.

마지막으로 상태값을 표기해줄 에디트박스를 하나 배치합니다.
기본 value 는 0으로 지정합니다.
이렇게 하면 슬라이더가 완성되었습니다. ㄷㄷ


당연한 것이겠지만 이렇게만 하고 실행을 해보면 막대가 움직이지 않습니다.
값도 당연히 변경되지 않구요. 

먼저 초기 상태로 셋팅을 해야겠죠.
폼의 onload 이벤트에 초기 설정을 위한 코드를 추가해줍니다.
각 컴포넌트의 move 메소드를 사용하면 원하는 위치에 배치할 수 있습니다.
트랙은 그대로 배치하고 삼각형 막대를 꼭지점을 기준으로 배치하기 위해 아래와 같이 이동시켜줍니다.
(디자인시에 배치할 수도 있지만 나중에 초기화 등의 작업을 위해서..)
hr_thumb.move(hr_track.position.left - (hr_thumb.position.width / 2), hr_track.position.top + hr_track.position.height/2 - hr_thumb.position.height/2);
사용자의 액션은 트랙의 특정위치를 선택하는 경우입니다.
(슬라이더의 기능을 좀 더 확대하면 마우스를 누르고 막대를 끌어주는 형식이 되거나 마우스 휠 액션 등도 지원을 해야 하지만 여기서는 다루지 않습니다).

트랙을 클릭했을때에는 해당 지점으로 막대를 이동시켜주고 값을 변환시켜주는 이벤트를 처리합니다.
(정확하게는 클릭이 아니라 마우스를 눌렀을때입니다. 클릭은 마우스를 눌렀다가 떼었을때 이벤트가 발생하기 때문에
사용자에게 피드백이 가는 시점이 달라집니다).
function hr_track_onlbuttondown(obj:Shape, e:MouseEventInfo)
{
MoveThumb(hr_track, e.clientX);
}

function MoveThumb(from_obj, mouse_x)
{
hr_thumb.move(mouse_x + (hr_thumb.position.width/2), hr_thumb.position.top);
}
그리고 변경된 값을 에디트박스로 넘겨주는 코드를 추가해줍니다.
var track_val = 100*(hr_thumb.position.left+(hr_thumb.position.width/2) - hr_track.position.left)/hr_track.position.width;
track_val = Math.round(track_val);
Edit00.value = track_val;
이렇게 하면 간단하지만 슬라이더와 비슷한 효과를 내는 폼을 만들 수 있습니다.
이제 해당 폼을 UserForm으로 만들거나 Div에서 가져와서 재활용할 수 있습니다.

* 이러한 동작 원리는 게이지 차트로 적용해볼 수도 있습니다.~

http://cafe.naver.com/xplatform101/283 
XPLATFORM 101
이제 Customized Object 마지막 내용입니다.
폼 상속이라는 개념인데요.
말 그대로 폼을 만들어놓고 폼 자체를 상속하는 방식입니다.

composite component 는 단일 컴포넌트를 가져다 쓰는 개념이라면
폼 상속은 말 그대로 부모,자식의 관계를 만드는 것입니다.

일단 상속될 폼을 만드는 방식은 기존 폼을 만드는 것과 동일합니다.
대신 해당하는 폼을 TypeDefinition 에 등록해야 합니다.
Add > Type > userform 을 선택합니다.

이렇게 userform을 추가해주면 새로운 폼을 만들때 상속 기능을 사용할 수 있습니다.
아래 이미지와 같이 기존에 비활성화되었던 상속 관련 정보가 활성화되며
추가된 userform 중에서 선택할 수 있습니다.


이렇게 선택된 폼은 그대로 새로 만드는 폼에 영향을 미칩니다.
composite component 와 다른 점은
일단 크기(영역) 변경이 안됩니다. 
그리고 접근 방식이 composite component 는 컴포넌트 아이디로 접근해서 들어갔지만
폼 상속시에는 super.*** 로 접근하게 됩니다.
예를 들어 상속받은 폼의 버튼을 제어한다면 다음과 같을 겁니다.
function Button01_onclick(obj:Button,  e:ClickEventInfo)
{
super.Button00.click();
}
그리고 함수에 대해서 오버라이드 처리가 가능합니다. 이부분은 user object 와 비슷하다고 보면 됩니다.
상속받은 폼에 대한 정보는 inheritanceid 속성으로 관리됩니다.

http://cafe.naver.com/xplatform101/281 
XPLATFORM 101
User Object 가 있는데 왜 Composite Component 를 또 만드는지에 대해서는
다중 상속을 지원하지 않는데 있다고 합니다.
하나의 오브젝트만 상속받아서 처리하는 것이라면 문제가 없지만
여러개의 컴포넌트를 처리해야 한다면 어려움이 있을 수 있습니다.

User Object 는 모든 작업을 스크립트로 처리해야 하는 어려움이 있는데
Composite Component 는 특정 영역을 폼으로 구성해서
이를 재사용하는 것이므로 새로운 컴포넌트를 쉽게 구현할 수 있습니다.

예를 들어 이번달과 다음달 달력이 함께 보여지는 컴포넌트가 필요하다면
그냥 달력 2개를 배치하고 폼의 onload 이벤트에서
각 달력의 Date 만 설정해주면 됩니다.

그러면 아래 그림처럼 2개의 달력을 가지는 하나의 컴포넌트를 만들 수 있습니다.


이렇게 사용하기 위해서는 먼저 만들어진 Composite Component 를 TypeDefinition에 등록해야 합니다.
스크립트로 접근하면 복합 컴포넌트 내 개별 컴포넌트의 아이디로 접근할 수 있습니다.

소스코드상에서는 아래와 같이 표기됩니다.
    <Layout>
      <compo id="compo00" ...
    </Layout>
Composite Component 는 지정된 레이아웃, 디자인을 UX 스튜디오에서는 변경할 수 있습니다. 직접 변경할 수 없습니다.
하지만 스크립트로 각 객체에 접근하면 변경이 가능합니다.
예를 들어 위의 경우 아래와 같이 접근 가능합니다.
compo00.Calendar01.position.width = 300;