XPLATFORM 101
- Grid > Grid Basic

말은 기본이라고 해놓고 처음부터 동적인 데이터 생성 등 복잡한 내용이 처리되고 있네요. ㅠㅠ
역시 소스를 따라가보는 식으로 진행합니다.

function gfn_InitDataset(oDs, bFlag, bCheck)
- 기본 데이터셋을 만들어놓고
추가적인 컬럼을 생성하고 데이터를 추가하는 부분이 있습니다.

oDs.enableevent = false;
if(bFlag) oDs.addColumn("S_FLAG", "String", 1);
if(bCheck) oDs.addColumn("CHK", "String", 1);

for(var i=0; i<oDs.getRowCount(); i++)
{
if(bFlag) oDs.setColumn(i, "S_FLAG", "N");
if(bCheck) oDs.setColumn(i, "CHK", "0");
}

oDs.enableevent = true;
addColumn() 이나 setColumn()은 그렇다치고
enableevent 을 처리 영역 앞뒤에서 감싸주는 것이 특이하네요.
enableevent 은 Dataset의 이벤트 발생여부를 설정하는 속성입니다.
일반적으로 많은 양의 데이터가 변환되는 경우 데이터 변경하는 건마다 이벤트가 처리되어 화면이 깜빡이는 현상이 있는데
이를 막기 위해 enableevent 속성을 false로 설정하면 화면의 깜빡임 현상을 막아주고
성능을 개선할 수 있습니다.


NO 숫자 대신 화살표 표기하기
- 특별한 기능은 아니지만 참고할만한 팁입니다.
간단하게 해당 셀에 정규표현식을 추가해서 처리했더군요.
해당 그리드 body에서 다음과 같이 처리를 하였습니다.

<font class="Apple-style-span" color="#666666"></font>
<Band id="body">
<Cell/>
<Cell col="1" text="expr:(Grid00.selecttype == &quot;currow&quot;) &amp;&amp; (rowposition == currow) ? &quot;▶&quot; : currow +1"/>
<Cell col="2" displaytype="checkbox" edittype="checkbox" text="bind:CHK"/>
<Cell col="3" text="bind:Column0"/>
<Cell col="4" text="bind:Column1"/>
<Cell col="5" displaytype="normal" edittype="none" text="bind:Column2"/>
<Cell col="6" displaytype="date" edittype="date" text="bind:Column3"/>
<Cell col="7" text="bind:Column4"/>
<Cell col="8" text="bind:Column5"/>
<Cell col="9" text="bind:Column6"/>
</Band>
UX 스튜디오 디자인 모드에서 그리드를 클릭하고 Grid Contents Editor 에서
해당 cell 의 text 속성을 수정해도 됩니다.
expr:(Grid00.selecttype == "currow") && (rowposition == currow) ? "▶" : currow +1
그리고 기본적으로 선택된 열은 반전된 색이 표시되는데 이를 사용하지 않고자 한다면
그리드에서 useselcolor 속성을 false 로 설정해주면 됩니다.

행추가와 행삽입
- 추가는 가장 뒷쪽 인덱스에 추가되는 것이고 삽입은 선택된 위치에 추가되는 차이가 있습니다.

function Button00_onclick(obj:Button,  e:ClickEventInfo)
{
var nRow = Dataset00.addRow();
Dataset00.setColumn(nRow, "CHK", "0");
Dataset00.setColumn(nRow, "S_FLAG", "I");
}

function Button01_onclick(obj:Button,  e:ClickEventInfo)
{
var nRow = Dataset00.insertRow(Dataset00.rowposition);
Dataset00.setColumn(nRow, "CHK", "0");
Dataset00.setColumn(nRow, "S_FLAG", "I");
}
insertRow는 지정된 숫자가 전체 데이터보다 큰 경우에는 addRow 처럼 마지막 위치에 추가됩니다.

데이터 삭제 처리
- 삭제 처리하는 함수에 흥미로운 기능이 있네요.
체크박스가 선택되어있는지 여부를 다음과 같이 체크하고 있습니다.
if(Dataset00.getSum("parseInt(CHK)") > 0)
체크된 셀의 값은 1이기 때문에 전체 합을 내어 0보다 크다면 선택한 것이 있다는 이야기겠죠.
Dataset.getSum(strExpr[,nStart[,nEnd]]) 에서는 계산식이나 컬럼을 사용할 수 있습니다.

http://cafe.naver.com/xplatform101/156 
XPLATFORM 101
Application > Calculator

따로 계산기 기능을 엑스플랫폼에서 제공하는 것은 아니고
버튼과 이벤트 처리로 계산기 기능을 구현한 내용입니다.
쇼케이스에서 전체 소스를 제공하기 때문에 내용을 보실 수 있습니다.

스크립트만 빼면 주석까지 500라인 정도가 되네요.
이번 내용에서는 주요 스크립트를 살펴보도록 하겠습니다.


function btn_OnClick(obj)
- 모든 버튼이 btn_OnClick 하나의 이벤트로 연결됩니다.
원래 onclick 이벤트는 클릭된 오브젝트와 ClickEventInfo를 같이 넘기는데 ClickEventInfo 는 처리하지 않고 있네요.
오브젝트에 넘어온 텍스트값을 받아서 switch 문에서 각 작업별로 분기를 해줍니다.

function CorPopup_onkeydown
- 화면에서 키 입력시에도 처리를 해줍니다.
폼에서 onkeydown 이벤트를 사용하고 KeyEventInfo 로 넘어오는 keycode값을 가지고 분기하여 처리합니다.
KeyEventInfo를 처리할때는 alt, ctrl, shift 키에 대해서는 별도로 속성을 체크하네요.

변수
- 다음과 같은 변수를 체크합니다.
var fv_PushNum      = 0;    // 숫자를 누른 상태
var fv_PushOperator = 1;    // 연산자를(+,-,*,/) 누른 상태
var fv_PushEqual    = 2;    // '='를 누른 상태
var fv_IsDecimalPoint;      // 소수점여부
var fv_Number;              // 출력장체 표시된 숫자
var fv_Result;              // 연산 결과
var fv_Memory;              // 메모리 저장 변수
var fv_IdxDecimalPoint;     // 소수점 Index
var fv_PreOperator;         // 이전에 누른 연산자
var fv_ChkStatus;           // 숫자,'=',연산자 상태 변수
var fv_FlagMemory;          // 메모리 사용 상태
var fv_IsPushDot;           // 소수점를 누른 상태

http://cafe.naver.com/xplatform101/152 
XPLATFORM 101
Application > Collection

제목은 Collection 이지만 특별한 내용은 아니고
애플리케이션 내에 포함된 자원들의 집합을 어떻게 다루는지에 대한 내용입니다.


components
- Form 의 속성입니다. Form 안에 속해있는 컴포넌트 목록을 접근하는 속성입니다.
도움말을 보면 collection 방식으로 접근한다고 나와있네요.
일반적인 collection 의 속성은 length 를 가지고 해당 index 값으로 접근이 가능합니다.
보통의 Form 에서는 this.components 로 접근할 수 있습니다.

all
- Application 오브젝트를 비롯한 여러 오브젝트의 속성이며
Application의 경우에는 메인프레임, 트레이, 위젯, 전역 변수, 전역 객체에 접근하는 속성입니다.
일단 기본적으로 메인프레임은 잡히겠고
GlobalVariables 에 있는 변수나 Dataset이 잡히게 됩니다.

popupframes
- 팝업된 윈도우의 집합입니다. 단 Modeless 로 올려진 윈도우만을 체크합니다.
Modal일 경우에는 하위 프로세스가 어짜피 진행이 되지 않으니 체크할 수 없겠죠.

open()
- Application.open() 은 ChildFrame.showModeless와 동일한 동작을 하게 됩니다.
Modeless 대화상자 (창)를 띄우기 위한 메소드라고 합니다.
collection과는 상관없지만 목록에 있어서..^^
[application.]open(strName,strFormURL,objParentFrame,{objArgumentList},strOpenStyle,nLeft,nTop[,nRight,nBottom[,objOpener]])

move()
- 대부분의 보여지는 컴포넌트는 move() 메소드를 가집니다. 프레임도 마찬가지구요.
단 고정된 형태의 프레임에 포함되는 경우 FrameSet 의 경우에는 지원되지 않습니다.
ChildFrame.move(nLeft,nTop[,nRight,nBottm])

* Collection 반환 객체는 누가 호출하는지에 따라 달라집니다.
메뉴얼을 보면 각 메소드의 반환 객체가 정리되어 있으니 참고하셔야 합니다.