Form

Collection

this.components, this.all 를 이용하여 폼에서 생성된 오브젝트에 접근할 수 있는 방법을 기술합니다.

Form_Collection_0

components 를 이용한 컴포넌트의 리스트 확인

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var i;
 var components = this.components;
 var icnt = components.length;
 this.Dataset00.set_enableevent(false);
 for( i = 0 ; i < icnt ; i++ )
 {
     var nRow = this.Dataset00.addRow();
     this.Dataset00.setColumn(nRow,0,components[i].id);
     this.Dataset00.setColumn(nRow,1,components[i].name);
     this.Dataset00.setColumn(nRow,2,components[i].valueOf());
     this.Dataset00.setColumn(nRow,3,components[i].text);
     this.Dataset00.setColumn(nRow,4,this.valueOf());
     this.Dataset00.setColumn(nRow,5,this.get_url(components[i],""));
      
    if(components[i].valueOf() == "[object Div]"){
     var divcomponents = components[i].components;
     var subcnt = divcomponents.length;
     for( j = 0 ; j < subcnt ; j++ )
     {
    var nRow = this.Dataset00.addRow();
    this.Dataset00.setColumn(nRow,0,divcomponents[j].id);
    this.Dataset00.setColumn(nRow,1,divcomponents[j].name);
    this.Dataset00.setColumn(nRow,2,divcomponents[j].valueOf());
    this.Dataset00.setColumn(nRow,3,divcomponents[j].text);
    this.Dataset00.setColumn(nRow,4,this.parent.valueOf());
    this.Dataset00.setColumn(nRow,5,this.get_url(divcomponents[j],""));
   }
    }
 }
 this.Dataset00.set_enableevent(true);
 
}

all를 이용한 모든 오브젝트에 리스트 확인

this.Button01_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
    var i;
 var allobjects  = this.all;
 var icnt = allobjects.length;
 this.Dataset00.set_enableevent(false);
 for( i = 0 ; i < icnt ; i++ )
 {
     var nRow = this.Dataset00.addRow();
     this.Dataset00.setColumn(nRow,0,allobjects[i].id);
     this.Dataset00.setColumn(nRow,1,allobjects[i].name);
     this.Dataset00.setColumn(nRow,2,allobjects[i].valueOf());
     this.Dataset00.setColumn(nRow,3,allobjects[i].text);
     this.Dataset00.setColumn(nRow,4,this.valueOf());
     this.Dataset00.setColumn(nRow,5,this.get_url(allobjects[i],""));
     
    if(allobjects[i].valueOf() == "[object Div]"){
     var divcomponents = allobjects[i].components;
     var subcnt = divcomponents.length;
     for( j = 0 ; j < subcnt ; j++ )
     {
    var nRow = this.Dataset00.addRow();
    this.Dataset00.setColumn(nRow,0,divcomponents[j].id);
    this.Dataset00.setColumn(nRow,1,divcomponents[j].name);
    this.Dataset00.setColumn(nRow,2,divcomponents[j].valueOf());
    this.Dataset00.setColumn(nRow,3,divcomponents[j].text);
    this.Dataset00.setColumn(nRow,4,this.parent.valueOf());
    this.Dataset00.setColumn(nRow,5,this.get_url(divcomponents[j],""));
   }
    }
 }   
 this.Dataset00.set_enableevent(true);
}
this.get_url = function(obj, str)
{
 if(obj == "[object Form]"){var s = "form";}else{var s = obj.name;}
 if(str != ""){s += "."+str}
 if(obj ==  "[object MainFrame]"){return "application.mainframe." + str;}
 return this.get_url(obj.parent, s);
}

폼에 있는 컴포넌트, Object리스트 확인방법을 알고 싶습니다.

소스 위치

Sample\Form\np_Form_Collection.xfdl

Obj정보와 Event 확인

넥사크로플랫폼(nexacro platform) 의 컴포넌트를 사용하여 코딩을 하는 경우 function에 포함되어 있는
obj와 e의 값을 확인해 보고 싶은 경우가 있습니다. 
이 경우 아래와 같은 방법으로 확인이 가능합니다.

Form_ObjectEventList_0

Object List 구현방법

this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
 var x;
 var objList;
    
 for (x in obj)   
 {
  this.objList = this.objList + (x + " : " + obj[x] + "\n");
 }         
 
 this.TextArea00.set_value("");
 this.TextArea00.set_value(this.objList);
}

Event List 구현방법

this.Button01_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var y;
 var eList;
    
 for (y in e)   
 {
  this.eList = this.eList + (y + " : " + e[y] + "\n");
 }         
 this.TextArea01.set_value("");
 this.TextArea01.set_value(this.eList);
}

넥사크로플랫폼(nexacro platform) 기본컴포넌트 이외에 외부 컴포넌트(ActiveX)를 사용하는

경우에도 해당 컴포넌트의 obj, e값을 확인 시에도 유용합니다.

외부 모듈의 경우 넥사크로플랫폼(nexacro platform)에서 기본적으로 값을 확인 할 수 없습니다.

ActiveX를 사용하려고 하는데 이벤트 사용시 obj, e에 포함된 값을 확인할 수 있나요?

컴포넌트 function의 obj, e의 값을 확인해 볼 수 있나요?

소스 위치

Sample\Form\np_Form_ObjectEventList.xfdl

go Method를 이용한 페이지 이동

현재 실행중인 화면에서 특정 화면으로 이동을 하고자 하는 경우 go Method를 통해 화면 전환이 가능합니다.

Form_go_0

Example)
this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
 //이동하고자 하는 폼 정보를 기술합니다.
 this.go("Sample_Form::Form_go_1.xfdl"); 
}

go Method를 이용하여 화면을 전화하는 경우 파라미터 값은 전달할 수 없습니다.

Script를 이용하여 특정 폼 화면으로 이동할 수 있나요?

소스 위치

Sample\Form\np_Form_go.xfdl, Sample\Form\np_Form_go_target.xfdl

overlaycolor 속성을 이용한 배경색 바꾸기

넥사크로플랫폼(nexacro platform)에서 showModal은 내부적으로 Div를 이용하여 표현이 됩니다.
Div 형태로 화면이 오픈되는 경우 전체적인 배경색은 회색에 가까우며 이는 화면을 띄우기 전에 설정이 
가능합니다.

Form_overlaycolor_0

newChild.style.set_overlaycolor("#ff000039");

관련 소스

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
    var newChild = null;
    var objParentFrame = this.getOwnerFrame();   
    var nRight = 0;
    var nBottom = 0;
    newChild = new nexacro.ChildFrame;    
    newChild.init("frmop01", "absolute", 0 , 0, 500 , 500 ,null ,null, 
                   "Sample_Form::Form_OverlaycolorDiv.xfdl");
    
    //overlaycolor setting 
    newChild.style.set_overlaycolor(this.edOverlaycolor.text);
    newChild.autosize = true; 
    newChild.showModal(objParentFrame, "", this, "f_pop_callback");
}   

this.f_pop_callback = function (sFormId, arg)
{
}

IE8 에서는 제약이 있습니다.

showModal로 오픈시 Parent의 배경색을 변경할 수 있나요?

소스 위치

Sample\Form\np_Form_OverlaycolorMain.xfdl, Sample\Form\np_Form_OverlaycolorDiv.xfdl

Timer

form의 이벤트 중 ontimer 이벤트를 사용하는 방법에 대해 기술합니다.

Form_timer_0

setTimer

setTimer 메소드로 생성한 타이머는 ontimer 이벤트를 발생시킵니다.
this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
 this.setTimer(1, 1000); //Timer구동
}
this.comp_timer_ontimer = function (obj:Form, e:TimerEventInfo)
{
 this.Static_clock.set_text(this.Clock()); //시계표시용 Static Component에 시간표시
}

killTimer

setTimer에 의해 설정된 타이머를 제거하는 메소드입니다.
this.Button01_onclick = function (obj:Button, e:ClickEventInfo)
{
 this.killTimer(1); //Timer해제
}

setTimer(nTimerID,nElapse)시 사용하게 되는 nTimerID는 Application에서 유일한 값을 가져야 합니다.

소스 위치

Sample\Form\Form_Timer_0.xfdl

활성화된 화면이름(ID) 얻기

getActiveForm 메소드를 이용하여 활성화된 화면의 이름을 얻을 수 있습니다.

Form_getActivForm_0

주요 소스 내용

this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var objForm = application.getActiveForm();
 
 this.edt_output0.set_value(objForm.name);
 this.edt_output1.set_value(application.getActiveForm().titletext);
}

이 샘플에서는 하나의 화면을 실행 했기 때문에 자기 자신의 이름을 얻지만 MDI 환경에서 여러

개의 화면이 있을 경우에는 그 중 하나인 활성화된 화면의 이름을 얻게 됩니다.

ActiveForm, 활성화된 화면

소스 위치

Sample\Form\np_Form_getActiveForm.xfdl

Layout 크기에 따른 적합한 화면 보기 - MLM

여러 개의 화면 Layout을 미리 만들어 놓고 사용자의 모니터 크기나 가로 세로 보기에 따라 적합한
화면 Layout을 보여줄 수 있습니다.

MLM_0

ADL의 ScreenInfo 생성

MLM_5

MLM기능에서 사용할 기본 Screen 정보를 등록관리합니다.

Layout List정의

화면 사이즈별 screen정보를 설정할 수 있습니다.
생성 된 화면 Default 탭에 우클릭 하여 "Layout List"를 클릭합니다.

MLM_4

MLM_1

Layout List에서 사용하는 screenid는 ADL의 ScreenInfo에서 정의한 내용을 사용합니다.

Layout 사이즈별 그리드 Format 정의

MLM은 컴포너튼에 대한 위치정보만을 가지고 있습니다. 
따라서 각 Layout별로 보여주고자 하는 그리드 표현내용이 다른 경우 스크립트 또는 그리드 Format등을 이용하여 변경작업을 해 주어야 합니다.

MLM_6

Layout변경시 그리드 Format변경

this.np_Form_MLM_onlayoutchanged = function(obj:Form, e:nexacro.LayoutChangeEventInfo)
{
 if(e.newlayout == 'default')
 {
  this.Grid00.set_formatid("default");
 } else if(e.newlayout == 'Layout1')
 {
  this.Grid00.set_formatid("format1");
 } else if(e.newlayout == 'Layout2')
 {
  this.Grid00.set_formatid("format2");
 } 
}

화면 리사이즈를 통한 Layout크기 확인 - MLM

화면의 크기를 변경 또는 마우스를 이용하여 폼의 사이즈를 변경하게 되면 해당 사이즈에 
가장 가까운 Layout정보를 이용하여 화면에 보여줍니다.

MLM_2

참고사항

MLM(Multi Layout Manager)

MLM이란 사용자가 개발 시 한 화면에 대해 Script 코딩은 변경하지 않고 여러 개의 화면 Layout을 미리 만들어 놓으면 사용자의 모니터 크기나 가로/세로 보기에 따라 적합한 화면 Layout을 보여주는 기능이다. 모니터 사이즈가 다른 데스크톱이나 모바일 기기 등의 적용에 유용합니다.
소스 위치

Sample\Form\np_Form_MLM.xfdl

Step를 이용한 화면내 구간보기

stepcount 속성을 이용하여 화면전환을 하지 않고 화면 내에서
구간을 볼 수 있습니다.

Step_0

stepcount 설정

Step_2

폼의 속성 중 stepcount 를 지정하게 되면 지정된 숫자만큼 아래와 같이 화면이 표시가 됩니다.
step한 페이지마다 각각의 디자인이 가능합니다.

Step_1

timer기능을 이용하여 step화면 표현

timer기능을 이용하여 각 step에 디자인된 화면을 보여줍니다. 
해당 샘플에서는 step에 이미지를 표현하도록 구성하였습니다.

주요 소스 내용

this.nIndex = 0;
this.np_Form_Step_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 this.setTimer(1, 2000);  
}
this.np_Form_Step_ontimer = function(obj:Form, e:nexacro.TimerEventInfo)
{
 if(e.timerid == 1){
    
  var StepCtrl = this.stepcontrol;
  StepCtrl.set_stepindex(this.nIndex);
  this.nIndex++;
  if(this.nIndex == 3){
   this.nIndex = 0;
  }  
 }
}

참고사항

step

작은 크기의 모바일 기기 등에서 많은 정보를 보여주고자 할 때. 화면 전환을 하지 않고 화면 내에서 구간보기를 할 수 있는 기능이다.

소스 위치

Sample\Form\np_Form_Step.xfdl

TitleBar 변경하기

스크립트나 CSS를 이용하여 타이틀바의 디자인과 속성을 변경할 수 있습니다.

TitleBar_1

스크립트를 이용한 방법

주요 소스 내용

var objParentFrame = null;
this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
  this.objParentFrame.titlebar.minbutton.set_visible(false);
  this.objParentFrame.titlebar.maxbutton.set_visible(false);
  this.objParentFrame.titlebar.closebutton.set_visible(true);
}
  
this.Form_TitleBar_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
    this.objParentFrame = this.getOwnerFrame();   
}
this.Button01_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.objParentFrame.set_titletext("title changed");
 
}
this.Button02_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.objParentFrame.style.set_titlebarheight(25); 
}  
this.Button03_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.objParentFrame.titlebar.style.set_background("@gradation");
 this.objParentFrame.titlebar.style.set_gradation("linear 0,0 #7ebdb2 0,100 #256e6d");
}

테마(CSS)를 이용한 방법

TitleBar_2

스크립트를 이용해서 위와 같이 사용하기도 하지만 실제로는 CSS를 이용하여 사용합니다.

위의 같은 경로를 통해 있는 CSS의 위치에서 TitlebarForm이라는 속성을 제어하여 사용할 수 있습니다.

소스 위치

Sample\Form\np_Form_TitleBar.xfdl

onbeforeclose 이벤트 사용시 주의사항

onbeforeclose 에 “창을 닫으시겠 습니까?” 문구를 띄워 주려는 의도로 만들었는데. 
Div 개수 만큼 경고창에 문자열이 여러 개 붙는 경우가 있습니다. 
이를 해결 하기 위한 방법에 대하여 알아봅니다.

현상

bouble1

원인

onbeforeclose 이벤트는 상위로 버블 처리 되는 이벤트로 하위 오브젝트와 
상위 오브젝트의 모든 onbeforeclose 가 발생 한 후 지정된 모든 return 메지시 값을 중첩하여 
Confirm 창을 띄워 종료 여부를 사용자에게 선택하도록 합니다.
this.close_test2_onbeforeclose = function(obj:Form, e:nexacro.CloseEventInfo)
{
 return "창을 닫으시겠 습니까?" ;
}

해결방법

this.close_test2_onbeforeclose = function(obj:Form, e:nexacro.CloseEventInfo)
{
 if(e.fromobject == obj)
 {
  return "창을 닫으시겠 습니까?" ;
 }
}

onbeforeclose 사용시 메시지가 두번 출력됩니다.

onbeforeclose 이벤트가 2번 발생하는 문제가 있음