'Nexacro-Framework'에 해당되는 글 12건

  1. 2017.08.17 Nexacro-FrameWork1. step2.메뉴연결 및 업무화면생성
  2. 2017.08.17 Nexacro-FrameWork1. step1.MDI Frame 생성 4

[ 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 농부지기
,