[ Nexacro-FrameWork1. step9. 주요 소스]

 

 

1. FarmerMDIFrame.xadl 소스 

   

 

2. globalvars.xml

    

 

3. loginFrame.xfdl

   

 

4. leftMenuFrame.xfdl 소스

  

 

5. tabFrame.xfdl

   

 

6. topFrame.xfdl

   

 

7. workMain.xfdl

   
Posted by 농부지기
,

 

 

[ Nexacro-FrameWork1. step5.업무중 Frame hidden처리 ]

 

1. 정의
   . 업무도중 업무화면을 최대한 크게 보기 위해서 top frame, bottom Frame등을
     hidden처리 하고 싶은 경우가 존재 한다.

2. 개발방법
   . topFrame, bottomFrame hidden 처리
   . topFrame만 개발하고, bottomFrame은 과제

3. ADL applicaiton  script 수정
   1. application 변수 추가
this.av_topFrame;
  
   2. this.application_onloadingglobalvariables 에 한줄 추가
this.av_topFrame    = this.av_mainFrame.vStartFrameSet.vMainFrameSet.topFrame;


4. topFrame.xfdl 수정
   1. 버튼 하나 추가, Event하나 추가
      . id    : btn_control
      . Event : fn_control
      . Text  : 숨기기
      . position : 맨 오른쪽 하단
     
   2. script

this.fn_control = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var sText = this.btn_control.text;
 
 if (sText == "숨기기"){
  //(topFrame, 업무FrameSet, bottomFrame)
  //topFrame(11)을 한 이유는 '보여주기'버튼이 보이도록 하기 위함.
  //현재 개발은 일반button이지만 실 프로젝트에서는 'image'를 이용해서  숨기기/보여주기를 해야 됨
  application.av_allFrame.set_separatesize("11,*,50");
  this.btn_control.set_top(0);
  this.btn_control.set_text("보여주기");
 }else{
  application.av_allFrame.set_separatesize("50,*,50");
  this.btn_control.set_top(28);
  this.btn_control.set_text("숨기기");
 }
}

 

Posted by 농부지기
,

 

[ Nexacro-FrameWork1. step4.Frame에서 업무화면 함수호출 ]

 

1. 정의
   1. frame단에서 업무화면의 함수를 호출 하는 경우가 존재 한다.
      좋은 예로,  tabpage에서 [x]를 눌러 화면을 닫을 수 있는데
      만약, 화면에서 변경된 자료가 존재 할 경우는 닫지 않는 경우가 발생한다.
      이때 tabpage를 먼저 delete하고 화면을 받으려 하다고  자료 변경건으로
      화면을 닫지 못할 경우에 tabpage는 삭제 되고, 화면이 닫혀진 문제가 발생한다.
     
   2. 이런경우 개발방법은 화면에 존재하는 함수를 호출하여 화면을 닫을 수 있는지 검사하고
      닫을 수 있는 경우에만 tabpage도 삭제 한다.
     
2. tab.xfdl
   1. 업무화면.함수 호출
   2. button 1개, Event 1개 생성
      . id    : btn_fnCall
      . Event : btn_fnCall_onclick1
   3. btn_fnCall_onclick1 script
this.btn_fnCall_onclick1 = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 application.afn_callFormFunction("fn_setOutEditBox", "top에서 호출");
}

3. ADL application script
   1. function 1개 생성
   2. script
this.afn_callFormFunction = function(sFuncNm, sArg){
 this.av_mdiFrameSet[application.gv_activeMenuId].form.fn_callFormFunction(sFuncNm, sArg);
}

4. workMain.xfdl 화면
   1. function 1개 생성
   2. 화면 호출함수가
   2. script
//application(frame)에서 업무화면의 함수를 호출하고 싶을 경우에 사용되는 function
this.fn_callFormFunction = function(sFuncNm, sArg){
 return eval("this.div_work." + sFuncNm).call(this.div_work, sArg);
}

5. commonCode.xfdl 화면
   1. edit box 1개, function 1개 추가
   2. Edit box
      . id : edt_out
      Funciton : fn_setOutEditBox()
   3. script
this.fn_setOutEditBox = function(args){
 this.edt_out.set_value(args);
 return true;
}

 

Posted by 농부지기
,

[ Nexacro-FrameWork1. step3.메뉴와 업무화면간 parameter 연동 ]

 

 

1. tabFrame.xfdl 화면
   1. 정의 : 화면을 open시 gds_menu.param 컬럼에 존재 하는 값을 업무화면에서 받아 사용하기
   2. 기존 fn_menuOpen() 함수 변경 (이미 존재)
      . 추가 script
        newChild.biz_param    = sParam;
      . 추가 위치
        newChild.biz_menuId   = sMenuId; -> script의 다음줄
2. workMain.xfdl 화면
   1. 기존 fn_onload()함수 변경 (이미 존재)
      . 추가 script
        this.fv_param  = this.getOwnerFrame().biz_param;
      . 추가 위치
        this.fv_menuId = this.getOwnerFrame().biz_menuId; -> script의 다음줄
   2. 2개 함수 생성
      . fn_getParam()  : 업무화면에서 호출되어 param 값을 넘겨줄 function
      . fn_getMenuId() : 업무화면에서 호출되어 menuId값을 넘겨줄 function
   3. script
  
//업무화면에서 parameter값을 얻고 싶을 경우 호출되는 function
this.fn_getParam = function(){
 return this.fv_param;
}
//업무화면에서 menuid를 얻고 싶을 경우 호출되는 function
this.fn_getMenuId = function(){
 return this.fv_menuId;
}

3. commonCode.xfdl 화면
   1. 정의 : 업무화면에서 menu에서 넘겨준 param값을 확인하기
   2. Event 1개 생성
      . fn_onload
   3. script

this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 trace(this.parent.fn_getParam());
}

Posted by 농부지기
,

[ Nexacro-FrameWork1. step2.메뉴연결 및 업무화면생성 ]

1. menu dataset생성
   - id      : gds_menu
   - Columns : level, menuId, menuNm, formUrl, param
   - Rows    : 메뉴 data row 추가 및 data추가 (잘)

2. 열려진 menu dataset생성
   - id      : gds_openMenu
   - Columns : level, menuId, menuNm, formUrl

3. 왼쪽 Frame에  메뉴 목록 조회
   - leftMenu.xfdl
   - grid 생성 : id : grd_menu,     binddataset : gds_menu
   - grd_menu에 : gds_menu연결 및 메뉴를 tree로 보여주도록 Grid (잘)설정
   - grid 속성
     . autofittype     : col
     . treeinitstatus  : expand,all
     . treeusecheckbox : false
    
4. workMain.xfdl - div생성
   - 정의 : 업무 화면을 보여줄(연결할) div생성
   - id : div_work

5. 업무화면(form)용 Services 하나 추가
    - Service ID : busi
    - Service Type : form
    - Service Url : ./busi/

6. 업무화면 추가
    - busi::commonCode.xfdl  (공통코드) (width:784,  height:608)
    - busi::subsidiary.xfdl (법인코드)  (width:784,  height:608)
    - busi::proforma.xfdl (견적서관리)  (width:784,  height:608)
    - busi::unitPrice.xfdl (단가관리)   (width:784,  height:608)
    - busi::bid.xfdl   (입찰관리)       (width:784,  height:608)

7. 업무화면 id와 gds_menu의 url 등 연결
    - 잘...

8. leftMenu.xfdl
   1. 정의 : Grid에서 menu douclick시 화면 조회 script개발

//메뉴클릭 시 > 업무화면 open
this.grd_menu_oncelldblclick = function(obj:Grid, e:nexacro.GridClickEventInfo)
{
 var nChildCnt = obj.getTreeChildCount(e.row);
 if (nChildCnt == 0){
  var sMenuId = application.gds_menu.getColumn(e.row, "menuId");
  application.afn_menuOpen(sMenuId);
 }
}

8. application script 개발
   1. 정의 :  메뉴 클릭 시 화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
   2. event1개, function1개 추가
      . application_onloadingglobalvariables : Event추가 (application관점에서 변수관리)
      . afn_menuOpen() : function추가 (메뉴 open interface용)
   3. script
this.av_mainFrame;
this.av_tapFrame;
this.av_mdiFrameSet;

this.application_onloadingglobalvariables = function(obj:Application, e:nexacro.LoadEventInfo)
{
 this.av_mainFrame   = application.mainframe;
 this.av_tapFrame    = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.tabFrame;
 this.av_mdiFrameSet = this.av_mainFrame.vStartFrameSet.vMainFrameSet.hMiddleFrameSet.vWorkFrameSet.mdiFrameSet;
}

//메뉴클릭 시 > 업무화면 open(interface용. tabFrame에 fn_menuOpen() 호출)
this.afn_menuOpen = function(sMenuId){
 var nRow = application.gds_menu.findRow("menuId", sMenuId);
 if (nRow < 0) return;
 
 this.av_tapFrame.form.fn_menuOpen(nRow);  //이때 중간에 form object명을 넣어야 됨 (왜, 몰러??)
}

9. tapFrame.xfdl
   1. 정의 : 클릭한 메뉴를 tab에 보여주고, workFrame에 화면 보여주기
   2. tab component 추가
      . id : tabMenu
      . 초기 생성 시 : tabpage가 2개 생성됨. 이때 하나는 삭제
                       (하나는 남겨두는 이유는 개발자 눈에 보이기 위해서.
                        차후 onload event에서 결국 삭제 함)
   3. Event 3개 와 function1개 생성
      . form.fn_onload     : 화면 onload시 tab 초기화
      . fn_menuOpen        : workMain Frame에 MDI로 업무화면 open 
      . tabMenu.onchanged  : menu클릭 시 클릭한 메뉴 tab에 추가 및 화면 open
      . tabMenu.onextrabuttonclick : tabpage에서 [x]를 클릭하면 화면 close
       
   4. fn_onload  script
/*
* desc : form onload
*/
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 this.tabMenu.removeTabpage(0);
}

   5. fn_menuOpen script
/*
* desc : menu 클릭 시 클릭한 메뉴 open
*/
var fv_maxMenu = 20;
this.fn_menuOpen = function(nMenuRow){
 var objTab = this.tabMenu;
 
 var objDsMenu = application.gds_menu;
 var sMenuId   = objDsMenu.getColumn(nMenuRow, "menuId");
 var sMenuNm   = objDsMenu.getColumn(nMenuRow, "menuNm");
 var sFormUrl  = objDsMenu.getColumn(nMenuRow, "formUrl");
 var sFormUrl  = objDsMenu.getColumn(nMenuRow, "formUrl");
 var sParam    = objDsMenu.getColumn(nMenuRow, "param");
 
 if (this.gfn_isNull(sFormUrl)) return;
 
 //1. 현재 메뉴가 이미 open되어 있으면 해당화면 활성화
 var nFind = application.gds_openMenu.findRow("menuId", sMenuId)
 if (nFind >= 0){
  var nPageCnt = this.tabMenu.getTabpageCount();
  var objPages = this.tabMenu.tabpages;
  for(var idx=0; idx<nPageCnt; idx++){
   if (sMenuId == objPages[idx].name){
    this.tabMenu.set_tabindex(idx);
   }
  }
  return;
 }
 
 //2. open가능 메뉴 수 체크
 var nOpenMenuCnt = this.tabMenu.getTabpageCount();
 if (nOpenMenuCnt >= fv_maxMenu){
  alert("최대수 " + fv_maxMenu + "개를 넘었습니다");
  return;
 }
 
 //4. openmenu dataset에 추가
 var objOpenMenu = application.gds_openMenu;
 var nAddRow = objOpenMenu.addRow();
 objOpenMenu.setColumn(nAddRow, "level"  , objDsMenu.getColumn(nMenuRow, "level"));
 objOpenMenu.setColumn(nAddRow, "menuId" , sMenuId);
 objOpenMenu.setColumn(nAddRow, "menuNm" , sMenuNm);
 objOpenMenu.setColumn(nAddRow, "formUrl", sFormUrl);

 //5. 화면 MDI로 form생성 및 조회
 var newChild = new nexacro.ChildFrame;
  //업무화면을 workMain Form과 div를 이용해서 업무화면 open하는 방식
  newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, "frame::workMain.xfdl");
  //업무화면을 직접 open하는 방식
  //newChild.init(sMenuId,"absolute",10, 10, 10, 10, null, null, sFormUrl);
  
  application.av_mdiFrameSet.addChild(sMenuId, newChild);

  newChild.set_showtitlebar(false);
  newChild.set_autosize(true);
  newChild.set_resizable(true);
  newChild.set_titletext("");
  newChild.set_showstatusbar(false);
  newChild.set_openalign("left top");
  newChild.set_openstatus("maximize");
  newChild.style.set_border("0px solid blue");
 
  newChild.show();
  
  newChild.biz_url      = sFormUrl;
  newChild.biz_menuText = sMenuNm;
  newChild.biz_menuId   = sMenuId;
  newChild.biz_param    = sParam;
  
  newChild.setFocus();
  application.gv_activeMenuId = sMenuId;
  
 //3. page 추가(이때 바로 'tabMenu_onchanged' event가 발생됨)
 //
 //   참고, 아래 script가 'application.av_mdiFrameSet.addChild(sMenuId, newChild);' 위쪽으로 올라 가면
 //          tabMenu_onchanged() Event쪽에서 오류가 발생한다.
 //   이유, 1. tabMenu.insertTabpage()로 page추가
 //          2. tabMenu_onchanged() Event 발생
 //          3. application.av_mdiFrameSet[sMenuId].setFocus(); -> 이때 아직 mdi화면생성이 안되어 있기에 오류 발생
 //          4. application.av_mdiFrameSet.addChild(sMenuId, newChild); -> tabMenu_onchanged() Event 발생 종료 후 mdi화면 추가 및 조회
 objTab.insertTabpage(sMenuId, objTab.getTabpageCount(), "", sMenuNm);
}


   5. tabMenu.onchanged  script
//page변경 시  해당화면 활성화
this.tabMenu_onchanged = function(obj:Tab, e:nexacro.TabIndexChangeEventInfo)
{
 var objPages = obj.tabpages;
 
 //e.postindex                : 현재 click한 page index
 //objPages[e.postindex].name : Tab.insertTabpage()함수로 설정한 page Id (즉, 메뉴id)
 var sMenuId = objPages[e.postindex].name;
 application.av_mdiFrameSet[sMenuId].setFocus();
 application.gv_activeMenuId = sMenuId;
}
  
  
   6. tabMenu.onextrabuttonclick  script
//page닫기 버튼 클릭 시 (page 삭제하고, 열려있는 화면 닫기)
this.tabMenu_onextrabuttonclick = function(obj:Tab, e:nexacro.TabMouseEventInfo)
{
 var objPages = obj.tabpages;
 var sMenuId  = objPages[e.index].name;
 
 //1. MDI Close
 application.av_mdiFrameSet[sMenuId].form.close();
 
 //2. Page Close
 obj.removeTabpage(e.index);
 application.gv_activeMenuId = '';
 
 //3. openMenu Delete
 var nFindRow = application.gds_openMenu.findRow("menuId", sMenuId);
 application.gds_openMenu.deleteRow(nFindRow);
 if (application.gds_openMenu.rowcount <= 0){
  //intro 화면 open하기
 }
 
 //4. 참고
 //   page를 삭제 하면 자동으로 tab onchanged() Event가 발생 됨
 //   그래서 다음 tabpage의 화면이 활성화 됨
}

//isNull검사
this.gfn_isNull = function(sValue)
{
    if (new String(sValue).valueOf().toUpperCase() == "UNDEFINED") return true;
    if (sValue == null) return true;
    var v_ChkStr = new String(sValue);

    if (v_ChkStr == null) return true;

    if (v_ChkStr.toString().length == 0 ) return true;

    return false;
}

  
   7. workMain script개발
      1. 정의 : tabFrame에서 workMain을 MDI로생성 시 onload Event에서   workMain.div_work에  업무화면 URL을 연동시킨다.
      2. script개발
         . event 1개
         . fn_onload Event : tabFrame에서 workMain을 생성시 연결시켜준 argument를 이용해서 업무화면을 연동시킨다.
      3.fn_onload Event Script
     
this.fv_param;
this.fv_menuId;
this.fn_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
 var sBizUrl    = this.getOwnerFrame().biz_url;
 var sMenuNm    = this.getOwnerFrame().biz_menuText;
 this.fv_menuId = this.getOwnerFrame().biz_menuId;
 this.fv_param  = this.getOwnerFrame().biz_param;
 
 this.div_work.set_url(sBizUrl);
 //this.setZoom(80);
}
  
  
  


 

Posted by 농부지기
,

[ Nexacro-FrameWork1. step1.MDI Frame 생성 ]

 

** 현재 회사에서 화면을 upload할 수 가 없네요.

     아쉽지만 소스만 참조 하세요.

 

-----------------------------------------------------------------------------------------
1. Project 생성
-----------------------------------------------------------------------------------------
   1. New Project
   2. 'Frame Template' Tab - Default
      'Create a new Project'
      Name : FarmerMDIFrame
      > [Next]
   3. Type Definition
      'Create new TypeDefinition from default'
      default_typedef.xml
      > [Next] > [Finish]

-----------------------------------------------------------------------------------------
2. Services 삭제 및 추가
-----------------------------------------------------------------------------------------
   1. 초기 Base는 삭제
      TypeDefinition > double click
      [Services] tab 클릭
      Base 선택 후 [Delete]
   2. [Add]
      Service id:frame,  Service type:form,  Service url:./frame/
      [OK]

-----------------------------------------------------------------------------------------
3. 초기생성된 frame삭제
-----------------------------------------------------------------------------------------
   1. ADL > MainFrame > childframe 선택 후 [Delete]버튼 클릭
  
-----------------------------------------------------------------------------------------
4. frame 구성
-----------------------------------------------------------------------------------------
    ----------------------------------------
    |      top frame                       |
    ----------------------------------------
    | m |           tab frame              |
    | e |-----------------------------------
    | n |                                  |
    | u |                                  |
    |   |          busi frame              |
    |   |                                  |
    |   |                                  |
    |   |                                  |
    |   |                                  |
    ----------------------------------------
    |      bottom frame                    |
    ----------------------------------------
   
-----------------------------------------------------------------------------------------
5. frame 추가
-----------------------------------------------------------------------------------------
   1. MainFrame 밑으로 Frame들 추가
   2. VFrameSet 추가 :  id - vStartFrameSet
      (정의 : login frame과 전체화면 frame 추가용
   3. vStartFrameSet 에 2개 Frame 추가
      - childFrame 추가 : id - loginFrame
      - VFrameSet  추가 : id - vMainFrameSet
        (정의 : top, middle, bottom 추가용)
   4. vMainFrameSet에  3개의 frame 추가
      - childFrame 추가 : id - topFrame
      - HFrameSet 추가 : id - hMiddleFrameSet
            (정의 : menu, menu 오른쪽 추가용)
      - childFrame 추가 : id - bottomFrame
   5. hMiddleFrameSet에 2개의 frame추가
      - childFrame 추가 : id - menuFrame
      - VFrameSet 추가 : id - vWorkFrameSet
   6. vWorkFrameSet에 2개의 frame추가
      - childFrame 추가 : id - tabFrame
      - FrameSet 추가 : id - mdiFrameSet

-----------------------------------------------------------------------------------------
6. 추가한 frame에  기본 속성 정의
-----------------------------------------------------------------------------------------
   1. MainFrame 속성
      - id : mainframe
      - mainframe.속성.width  = 1024
      - mainframe.속성.height = 768
        (정의 : 이 size가 존재 해야  project start 시  초기 화면의 size가 된다)
      - mainframe.속성.showcascadestatustext = false
      - mainframe.속성.showcascadetitletext  = false
      - mainframe.속성.showstatusbar = false
        (정의 : 전체Frame화면 맨 하단에 Status Bar 조회 여부)
   2. loginFrame 속성
      - loginFrame.속성.dragmovetype = none
        (login창을 마우스로 drag 하여 다른 frame에 이동할 수 없도록 조정)
      - loginFrame.속성.showtitlebar = false
        (login창의 title을 안보여주도록 설정)
   3. vStartFrameSet 속성
      - 속성.separatesize : *,0
         (정의 : 이 속성값으로 프로젝트를 start하면 login화면만 보인다)
          * : login frame을 보여주기
          0 : login frame을 보여줄때는 vMainFrameSet은 숨기기 [즉, login이전 이므로 업무화면은 안보여줌] )

-----------------------------------------------------------------------------------------
7. login화면 생성 및 연동
-----------------------------------------------------------------------------------------
   1. id : frame::loginFrame.xfdl
   2. [login]버튼 추가
      - 버튼 클릭 시 서버 접속 후 login이 되었다고 판단.
      - click event  - script :
this.btn_login_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 //login은 성공했다고 생각하면 main화면 open
 application.afn_loginPass();
}

   3. applicaiton단 script 추가
      - ADL 에서 오른쪽 마우스 > Edit Script
//login frame을 0 으로 하고 업무 frame(vMainFrameSet)을 보여줌
 this.afn_loginPass = function()
{
 application.mainframe.vStartFrameSet.set_separatesize("0,*");
}
   4. login관련 login frame 속성 변경
      - loginFrame.속성.formurl : frame::loginFrame.xfdl
  
-----------------------------------------------------------------------------------------
8. top, leftMenu, bottom, tab, workMain 화면 만들기
-----------------------------------------------------------------------------------------
   1. topFrame.xfdl 만들기
      - width : 1024, height : 50
      - backgrond : antiquewhite
   2. leftMenuFrame.xfdl 만들기
      - width : 240, height : 668(768 - 50 - 50) (project총 height - top.height - bottom.height)
      - backgrond : aquamarine
   3. bottomFrame.xfdl 만들기
      - width : 1024, height : 50
      - backgrond : antiquewhite
   4. tabFrame.xfdl 만들기
      - width : 784(1024 - 240) (project총 width-leftMenu.width) , height : 60
      - backgrond : goldenrod
   5. workMain.xfdl만들기
      - width  : 784(1024 - 240) (project총 width-leftMenu.width)
        height : 608(768 - 50 - 60 - 50)  (project총 height - top.height - tab.height - bottom.height)

-----------------------------------------------------------------------------------------
9. top, leftMenu, bottom, tab, workMain 화면에 맞게 frame 속성 변경
-----------------------------------------------------------------------------------------
    1. vMainFrameSet 속성
       - separatesize : 50,*,50  (top:50, *:leftMenu,workMain,  50:bottom)
    2. topFrame 속성
       - formurl : frame::topFrame.xfdl
       - showtitlebar : false
       - dragmovetype : none
    3. hMiddleFrameSet 속성
       - separatesize : 240,*  (loftMenu:240, *:workMain)
    4. menuFrame 속성
       - formurl : frame::leftMenuFrame.xfdl
       - showtitlebar : false
       - dragmovetype : none
    5. vWorkFrameSet 속성
       - separatesize : 60,* (tab:60, *:workMain)
    6. tabFrame 속성
       - formurl : frame::tabFrame.xfdl
       - showtitlebar : false
       - dragmovetype : none
    7. mdiFrameSet 속성
       - 없음
    8. bottomFrame 속성
       - formurl : frame::bottomFrame.xfdl
       - showtitlebar : false
       - dragmovetype : none
      
** 1단계 완료
   여기까지 하면 기본 Frame은 구성은 완료

 

Posted by 농부지기
,