Environment
그리드 bkimage가 적용되지 않는 현상
참고사항
Enviroment 속성과 Screen Info의 속성에 있는 테마ID가 맞지 않는 경우 이미지가 표현되지 않을수 있으므로 두곳의 설정값을 확인해야 합니다.
Form(폼)
사용자가 폼의 x버튼을 눌러 닫을 경우 Dataset 변경여부를 체크하는 방법?
form의 onbeforeclose 이벤트에서 체크로직을 구현할 수 있습니다.
해결방법
this.test_onbeforeclose = function(obj:nexacro.Form,e:nexacro.CloseEventInfo) { if(this.fn_CloseSaveYn()) { return "변경된 데이터가 존재합니다. 닫으시겠습니까?"; } }; this.fn_CloseSaveYn = function() { if(true) //체크로직 구현 { return true; } else { return false; } }
참고사항
폼의 이벤트 onbeforeclose에서는 메시지 확인창을 confirm이 아닌 return "메시지" 형태로 작성해야 정상동작 합니다.
폼 스크롤이 있는 경우 마우스휠로 이동시 이동 간격이 너무 크게 움직이는데 미세하게 조절이 가능한가?
폼에서 마우스휠을 이용하여 위/아래로 이동시 일정한 간격으로 이동하여 부드럽게 이동이 되지 않습니다. 이 간격을 조절할 수 있는 방법이 있을까요?
해결방법
폼의 onmousewheel에 이벤트 걸과 간격조절 값 세팅하면 됩니다. 숫자는 고객사 사용자분들의 기존 사용프로그램 간격을 고려하여 세팅하시기 바랍니다.
this.Vscroll_onmousewheel = function(obj:nexacro.Form,e:nexacro.MouseWheelEventInfo) { if(e.amount > 0) { this.scrollBy( -5, -5); // 5 숫자를 이용하여 조절 } else { this.scrollBy( 5, 5 ); // 5 숫자를 이용하여 조절 } return true; };
참고사항
scrollBy - Form 에 표시된 스크롤을 현재 위치에서 인수로 전달된 값만큼 이동시키는 메소드 입니다.
폼에 div url로 연결되어 있는 폼에서 상위 폼을 제어하는 방법
폼에 생성되어 있는 오브젝트/컴포넌트 정보를 구하기.
var arrObj = this.all; //this.components; for(var i=0; i<arrObj.length; i++) { trace(arrObj[i] + " : " + arrObj[i].name); }
폼에 있는 컴포넌트 정보를 구하기 위해 this.all, this.componentns, this.objects 3가지 속성으로 Form에 등록된 모든 오브젝트 정보를 얻을 수 있습니다. 하지만 해당 속성은 폼에 Div, Tab 등 컨테이너 컴포넌트가 있는 경우 해당 컴포넌트의 하위 Object값을 얻을 수 없습니다 따라서 Div, Tab컴포넌트에 속한 오브젝트까지 얻고자 한다면 다음의 함수를 이용해야 합니다.
this.btn_Exe1_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.fn_compList(this); }; this.fn_compList = function(pObj) { var arrObj = pObj.all; // var arrObj = pObj.components; // var arrObj = pObj.objects; for(var i=0; i<arrObj.length; i++) { trace(pObj.parent + " : " + pObj.valueOf() + " : " + arrObj[i] + " : " + arrObj[i].name); var sType = arrObj[i].valueOf(); if(sType == "[object Div]"){ this.fn_compList(arrObj[i].form); } else if(sType == "[object Tab]"){ for(var j=0; j<arrObj[i].tabpages.length; j++){ //trace( arrObj[i].valueOf() + " : " + arrObj[i].tabpages[j].name); this.fn_compList(arrObj[i].tabpages[j].form); } } } }
transaction 호출시 application의 dataset에 담기
this.transaction("select","http://localhost:8088/xxx.jsp","","gds_temp=output","","fn_call");
Application의 Dataset은 접근이 가능하나, Div등 하위의 Dataset은 접근이 안됩니다.
참고사항
NexacroN 에서는 transaction 호출 시 div/form의 하위 컴포넌트의 dataset접근이 가능함
this.transaction("selectJSON","http://172.10.11.14:8088/edusys/nexacroN/nexacroN_Select.jsp","","Dataset00=output this.Div00.form.Dataset02=output","", "fn_call", true,3 );
transaction 통신 포멧 중 JSON포멧이 가능한가?
참고사항
넥사크로N 버전에서 제공합니다. JSON : 3 서버 : PlatformResponse pRes = new PlatformResponse(response.getOutputStream(), PlatformType.CONTENT_TYPE_JSON);
데이터셋을 필터 한상태에서 데이터를 조회 해오면 필터된 조건이 살아 있나요?
참고사항
filter() 메소드를 수행하면 DataSet 의 filterstr 속성값이 strFilterExpr 인자에 설정된 값으로 변경됩니다 참고 : loadfiltermode 속성을 사용해야 되네요 DataSet 에 데이터를 로드하거나 트랜잭션을 수행할 때 filterstr 속성값의 적용방법을 설정하는 속성입니다. this.Dataset00.set_loadfiltermode( "keep" ); this.Dataset00.set_loadfiltermode( "reset" ); loadfiltermode 속성값을 설정하지 않으면 "keep"으로 적용됩니다. filterstr 속성의 초기값은 DataSet이 생성될 때 filterstr 의 값으로 설정됩니다.
step 설정방법
Property 를 이용하는 방법
Form의 속성 중 stepindex 에 표현하고자 하는 index값을 설정하면 됩니다. 만약 생략하는 경우 0번이 됩니다.
20190731_97cad8d04aa64b2eb3bc85d9bc1d9a73
스크립트를 이용한 step변경 방법
var nStepIndex = 1; this.setStepIndex(nStepIndex);
Dataset
서버로 부터 전달받은 Dataset의 컬럼 Type이 DB에서 정의된 각 컬럼별 Type이 아닌 일방적인 STRING등으로 넘어오는 경우 대응방법
투비소프트 제품의 Dataset Layout구조는 전 제품이 비슷하게 동작하는데 고객사 프로젝트 개발시 항상 나오는 질문중 하나로 Client에서 디자인된 Dataset Layout과 서버에서 보내주는 실제 Layout이 달라 개발에 어려움을 격는 경우가 많습니다. 해결방법에는 각 개발자마다 다르겠지만 다음 사항을 참고하여 답변하시면 좋을 듯 합니다.
해결방법1)
최대한 서버에서 보내주는 컬럼 Type을 DB의 컬럼 Type과 맞추어 Client와 Sync를 맞춥니다. (권장)
해결방법2
해결방법1)번이 안된다는 전제하에 가장 쉬운방법은 Client에서 디자인된 Dataset을 사용하도록 Dataset이 옵션 중 useclientlayout를 true 설정하여 사용합니다. (해결방법1)번이 안된경우 권장사항)
해결방법1),2)번 외 방법은 권장하지 않으며,
따라서 관련 이슈는 개발시작 전 공통영역을 담당하는 분이 처리방법을 결정해주는 것이 좋습니다.
참고사항
해결방안 2)번을 하지 않고 상황에 따라 대응하고자 하는 경우가 간혹 있는데 다음 사항을 전달해 주면 이해가 쉬울듯 합니다. 1) Dataset을 이용하여 계산등을 하는 경우 예) 합계를 구하는 경우 dataset의 컬럼이 숫자 타입이 아니면 모든 case별로 수식을 넣어줘야 하는 문제가 발생합니다. dataset.getSum("nexacro.toNumber(SALARY)") String인 경우 정상적으로 계산되지 않습니다.
Project Explorer의 폼에 있는 Dataset을 드레그 하여 폼에 바인딩하려고 하면 이동불가 아이콘이 나옴
현상
데이타셋 바인딩시 이동불가 아이콘이 나옵니다.
참고사항
해당 내용은 다른 폼의 dataset을 바인딩하려고 할때 나오는 현상입니다. 해당 Dataset의 폼이 현재 열려져 있는 폼과 동일한지 확인해 보시기 바랍니다.
Dataset이벤트 처리시 e.reason 속성 이해하기
this.ds_emp_onrowposchanged = function(obj:nexacro.NormalDataset,e:nexacro.DSRowPosChangeEventInfo) { trace(e.newrow + ":" + e.oldrow); };
Test를 위해 입력한 Data는 직접 지워준다
clearData(); Method를 이용하여 삭제도 가능하지만 가능한 테스트 데이터는 직접 지워주는 것이 좋으며 인수인계를 받아 개발하는 경우 테스트 데이터 여부 인지가 어렵습니다.
컬럼값 유효성 체크 방법
컴포넌트에 바인딩된 Dataset 적용시점
Childframe Dataset공유
updatecontrol / setRowType
Filter 메소드에서 함수 호출하기
Dataset.filter([strFilterExpr]) : DataSet 의 데이터가 필터링 될 조건을 문자열로 설정합니다. 이때 문자열이 아닌 폼에 정의된 함수를 호출하는 방법입니다.
해결방법
this.matchRuleShor = function() { } 중략
폼에 정의된 함수를 dataset filter에서 호출방법
this.Dataset00.filter("this.parent.matchRuleShort(NAME,'" + obj.getColumn(e.newrow,"WILDCARD") + "') == true ");
즉 this.parent.함수명 형태로 접근해야 합니다.
Filter * Wild Card
Dataset을 이용하여 데이타 filter시 * (wild card) 기능을 이용하여 데이타를 filter하는 샘플입니다.
샘플 Data
<Dataset id="Dataset01" onrowposchanged="Dataset01_onrowposchanged"> <ColumnInfo> <Column id="WILDCARD" type="STRING" size="256"/> </ColumnInfo> <Rows> <Row> <Col id="WILDCARD">bird*</Col> </Row> <Row> <Col id="WILDCARD">*bird</Col> </Row> <Row> <Col id="WILDCARD">*bird*</Col> </Row> <Row> <Col id="WILDCARD">bird*bird</Col> </Row> <Row> <Col id="WILDCARD">*bird*bird*</Col> </Row> <Row> <Col id="WILDCARD">s[pe]c*re$ex*cha^rs</Col> </Row> <Row> <Col id="WILDCARD">should noo*oot match</Col> </Row> </Rows> </Dataset>
해결방법
//Short code this.matchRuleShort = function(str, rule) { var escapeRegex = (str) => str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); return new RegExp("^" + rule.split("*").map(escapeRegex).join(".*") + "$").test(str); } this.Button02_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { var strText = "*bird"; this.Dataset00.filter("this.parent.matchRuleShort(NAME,'" + strText + "') == true "); };
참고사항
Filter 기능에서 함수를 호출할때는 this.parent.함수명 형태로 접근해야 합니다.
Grid(그리드)
Grid속성 중 cellmovingtype의 Value 를 col,band로 설정시 동작방식이 어떻게 되나요?
참고사항
그리드는 column을 조정할 수 있는데 cellmovingtype을 col, band로 설정하게 되면 동일밴드내에서만 컬럼이동이 가능한 기능입니다. 예를들면 left밴드에서 left밴드로만 이동되며, col이면 밴드 상관없이 이동 가능합니다.
그리드 Expr 사용
그리드 expr에서 아래와 같이 접근이 가능한 이유?
예) expr:dataset.parent.ds_emp.getRowCount()
참고사항
dataset.parent.로 지정하게 되면 해당 dataset이 포함된 폼 정보를 의미합니다. 도움말 Appendix의 Dataset Expression의 Additional Global Properties 내용 참고하세요.
그리드의 Cell높이를 데이타 길이에 따라 자동으로 늘려줄 수 있는가?
해결방법
그리드 자동 줄바꿈 기능은 3가지 옵션으로 적용이 가능합니다. 1) 그리드 속성 autosizingtype = row, extendsizetype=row 그리드 cell의 wordWrap = (옵션 : char, english)
그리드 바인딩 가능한 band
바인딩은 Body영역만 가능 Head, summary는 불가
textArea 엔터 (컨트롤 + enter)
그리드 특정 cell에 일정데이타가 입력되면 다음 cell로 이동하도록 하는 방법
그리드 Tab이 아닌 Enter로 이동하는 방법 (사용성 고려)
그리드는 기본 Tab으로 이동됨
treeitemimage level별로 세팅이 가능한가?
참고사항
넥사크로14에서는 Grid속성 중 TreeItemImage속성이 있어 바인딩이 가능했으나 넥사크로17부터는 class를 level별로 만들어 class를 expr처리해야 합니다.
그리드 선택 cell정보 확인
그리드에서 선택된 cell정보 확인
expr:comp.getCellPos()
각 cell의 인텍스
expr:this.col
그리드 현재 컬럼 ID구하는 방법
그리드 expr에서 getColID(self.col) 사용하면 얻을 수 있음
그리드 엑셀/한셀 export시 주의사항
autosizing ( word wrap )
자주 사용하는 예약어
this.col
col 인덱스는 Cell 이 표시되는 위치를 나타낸다.
사용예) currow가 같고 선택된 cell의 위치에 따라 mask처리 expr:((dataset.rowposition == currow) && (this.col == this.grid.getCellPos())) ? '' : '##{####}##'
currow
그리드 수식이 계산하고 있는 행(Row) 의 인덱스.
this.Grid00.setCellProperty( "body", 0, "expr", "currow + '/' + dataset.rowcount");
피벗 그리드 셀 속성지정방법
해결방안
this.NxPivot00_00_onrender = function(obj:nexacro.NxPivot, e:nexacro.EventInfo) { var objGrid = obj.getPivotGrid(); var sConfig = obj.getConfig(); var objConfig = JSON.parse(sConfig); var nRowAxisCnt = objConfig.rowAxis.length; var nCellCnt = objGrid.getCellCount("body"); for(var i=nRowAxisCnt;i<nCellCnt;i++) { var sColumn = objGrid.getCellProperty("body", i, "text").split("_"); if(sColumn[2] == "Column5") { objGrid.setCellProperty("body", i, "displaytype", "mask"); objGrid.setCellProperty("body", i, "maskeditformat", "###,##0.00"); } } };
Static
Static및 컴포넌트 줄바꿈 처리시 줄 간격을 줄 수 있는가?
해결방안
넥사크로 17에 새롭게 기능이 추가되었습니다. font속성 중 line-hight number로 설정하고 원하는 간격을 설정하면 됩니다. 예) 1.3 해당 내용은 각 컴포넌트의 font속성에 설정하기 보다는 공통영역 즉 class에 정의해서 사용하면 일괄적으로 반영이 가능하니 참고하세요 또한 속성 중 letterSpacing 속성은 문자당 간격을 설정할 수 있습니다. worldSpacing 또한 문장의 단어와 단어 사이즈 간격을 설정할 수 있습니다.
참고사항
해당 내용은 예전 MP때 부터 계속 요청사항으로 들어왔던 내용은데 넥사14에서도 안되던 기능이 드디어 17에 반영되었습니다. 또한 모든 컴포넌트에 적용가능합니다.
Radio(라디오)
direction정렬문의
radio옵션 중 direction : Radio 에서 아이템이 표시되는 방향을 설정하는 속성입니다 첫날 교육시 바인딩 연습하는 과정에서 Gender를 이용하여 radio에 표현해 줍니다. 이때 가로, 세로 정렬을 보여주기 위해 direction을 이용하여 표현시 horizontal, vertical를 옵션을 이용하여 정렬을 보여주면 옵션과 반대로 동작하게 됩니다. 왜 그럴까요?
해결방법
direction옵션은 radio의 colcount설정값에 따라 데이타를 표현하는 방법을 의미합니다. 즉 남/녀/기타 등의 적은 데이타로는 표현하기 어려우며 다음과 같이 값을 A,B,C,D,E형태로 만들어 놓고 columncount를 2로 설정 후 변화를 확인해 보세요 columncount를 2로 설정된 경우 'horizontal' 를 설정하면 A B C D E 형태로 표현되는 것을 볼 수 있으며 ,'vertical'로 설정하면 A D B E C 로 표현되는 것을 볼수 있으니 참고하세요
radio Item의 글씨수가 많은 item이 잘리지 않고 자동 늘어나는 기능은 있는지?
해결방법
rowcount, colcount -1로 지정 raio의 크기에 맞춰서 자동 조절됩니다.
Radio의 innerdataset접근방법
this.Button00_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var rtn = this.Radio00.getInnerDataset(); var icnt = rtn.getRowCount() for(var i = 0; i<icnt;i++) { trace(rtn.getColumn(i,"codecolumn") + ":" + rtn.getColumn(i,"datacolumn") + "==" + this.Radio00.value); } } this.Button01_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var rtn = this.Radio00.getInnerDataset(); var icnt = rtn.getRowCount() for(var i = 0; i<icnt;i++) { rtn.setColumn(i,"codecolumn", "code" + i); rtn.setColumn(i,"datacolumn", "data" + i); } } this.Button02_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.Radio00.set_value("2"); }
Div, Tabpage, PopupDiv
innerform 추가된 이유를 알 수 있을까요?
넥사크로14에서는 Div, Tabpage, PopupDiv의 속성을 접근하기 위해서는 바로 접근이 Div.컴포넌트 형태로 가능했으나 넥사크로17에서는 Div.form.컴포넌트 형태로 innerform이 추가됨 그 이유가 궁금합니다.
해결방안
Div 계열과 Form 의 프로퍼티와 스타일 속성이 중첩되므로 중첩 해결을 위한 기능 제공 및 상충되는 요구사항 해결이 필요합니다. 따라서 넥사크로17에서는 innerform개념이 포함되어 Div.form.컴포넌트 형태로 접근을 해야 합니다.
폼에 div url로 연결되어 있는 폼에서 상위 폼을 제어하는 방법
// 예) 폼에 div url로 연결되어 있는 폼에서 상위 폼의 div 크기를 조절하는 방법 ths.parent.set_height(100); //즉 url 연결된 div 크기를 변경하는 방법입니다.
Div속성 중 async 설정값에 따라 동작방식을 알고 싶습니다.
참고사항
Div의 속성 async true, false에 따라 Main 폼의 onload이벤트에서 Div에 set_url를 이용하여 페이지를 열어주게 되면 폼의 loading속도가 달라짐
this.Div_Sample_onload = function(obj:nexacro.Form,e:nexacro.LoadEventInfo) { this.Div00.set_url("Base::InnerForm.xfdl"); trace("main"); }; true : main, sub false : sub, main
Div, Tab 값 참조방법
this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { var objChildlist = this.Div00.form.components; for(var i=0; i < objChildlist.length; i++){ trace(this.Div00.form.components[i] ); } }; this.Button01_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { var objChildlist = this.Tab00.Tabpage1.form.components; for(var i=0; i < objChildlist.length; i++){ trace(this.Tab00.Tabpage1.form.components[i] ); } };
TagPage의 Text align을 중간으로 표현하는 방법과, Tab크기 만큼 Tagpage의 label 크기를 변경하는 방법을 알고 싶습니다.
해결방법
1. Tabpage Label을 Tab컴포넌트 크기에 맞추는 방법은 tab속성 중 tabjustify를 true로 설정하면 됩니다. 2. Tabpage의 TextAlign은 theme파일에서 설정해 주면 됩니다.
/* 추가 start */ .Tab .tabbuttonitem .tabbuttonitemtext { -nexa-text-align : center; } /* 추가 end */ /* Tab tapgage를 round처리*/ .Tab { border-radius : 10px 10px 0px 0px / 10px 10px 0px 0px; }
Tab컴포넌트의 Tabpage label 크기를 Tab컴포넌트 크기에 맞추는 방법
Tab의 선택된 tabpage id 구하기
var nIndex = this.Tab00.tabindex; this.alert(this.Tab00.tabpages[nIndex].id);
Tab컴포넌트에 TabPage가 많은 경우 좌/우버튼 클릭시 구분방법
function Tab00_onlbuttondown(obj:Tab, e:TabMouseEventInfo) { trace(e.fromreferenceobject.name); // spindownbutton / spinupbutton 으로 찍힘 }
Tab컴포넌트의 Tabpage label 크기를 Tab컴포넌트 크기에 맞추는 방법
Tab컴포넌트의 Tabpage label 크기를 Tab컴포넌트 크기에 맞추는 방법입니다. Tab컴포넌트 속성 중 Tabjustify속성을 true로 설정하면 됩니다.
Tab 컴포넌트 사용시 주의사항
url방식으로 개발한다.
Preload 속성은 변경하지 않는다
Dataset 참조
Div/Tabpage안에 있는 Dataset참조 및 Main폼의 Dataset공유방법 등
Script
초기화 방법
destory를 해주는데 왜 또 null를 해주어야 하는지 문의 건
var objBtn = this.Div2.form.removeChild("btn_divComp"); objBtn.destroy(); objBtn = null;
해결방법
var objBtn = this.Div2.form.removeChild("btn_divComp"); objBtn.destroy(); objBtn = null; destory를 해주는데 왜 또 null를 해주어야 하는지 문의 건 자바스크립트는 메모리 관리를 위해 GC(Garbage Collector) 기능을 통해 자동으로 관리가 됩니다. 하지만 자바스크립트에서 gc 를 강제로 트리거 할 방법은 없고 브라우저가 필요한 tick 에 알아서 한다. 따라서 null를 통해 값을 초기화 해주는 것 추천합니다.
참고사항
null를 세팅했다고 하여 바로 메모리에 적용되는 것 또한 아님 했을때와 안했을때 메모리 차이도 발생한다고 합니다.
폼에서 include된 파일이 여러개 있는 경우 동일함수가 각 include된 js에 여러곳 있을 경우 어떤 함수가 실행되는가?
해결방안
폼에 include된 js중 순서가 맨 마지막에 include(포함)된 함수가 실행됩니다. (맨 마지막 것만 실행)
참고사항
* 자바스크립트 엔진은 일단 incude에서 지정한 파일 순서대로 하나의 메모리에 올린 후에 * 호이스팅 룰을 이용해서 파싱을 한 다음에 * 실행 들어갑니다. (요약) 가장 나중에 선언한게 유효합니다. 참고로 X플랫폼은 넥사크로와 같으며, 마이플랫폼은 맨 마지막에 링크한 함수부터 위로 찾아가며 갯수만큼 실행됩니다.
스크립트를 통해 Arrangement를 적용할 수 있는가?
스크립트를 통해 Arrangement를 적용할 수 있는가? 즉 사용자 권한에 따라 보여주는 컴포넌트가 다른 경우 사용
해결방안
가능합니다. Arrangement는 position기능을 세팅하여 사용이 가능하므로, 기본 Properties 설정을 해주면 됩니다.
this.Button03.set_left("Button00:30");
넥사크로17은 FitToContents를 지원하는데 넥사14는 어떻게 해야 하나요?
해결방안
넥사14는 아쉽게도 코딩으로 풀어야 합니다.
trace(this.stc_accunt.currentstyle.font); objSize = nexacro.getTextSize(this.stc_accunt.text, this.stc_accunt.currentstyle.font); this.stc_accunt.set_width(objSize.nx); this.stc_accunt.set_height(objSize.ny);
자바스크립트 맨 마지막 끝에 ;를 붙이지 않아도 실행이 됩니다.
참고사항
this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { trace("trace") alert("alert") }; //위와 같이 하면 동작은 잘 됩니다. 하지만 자바스크립트의 문장의 끝은 ; 입니다. 만약 위의 스크립트를 다음과 같이 바꾼다면? this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { trace("trace") alert("alert") }; //위와 같이 한줄로 기술하게 되면 오류가 납니다. 그러나 this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { trace("trace"); alert("alert"); }; //;으로 문장의 끝을 명확히 기술해 주면 오류없이 잘 됩니다.
폼 변수 선언시 서버로 부터 값을 넘겨받는 변수는 만드시 초기화가 되어 있어야 하나요?
서비스 호출 후 서버로 부터 넘겨받는 callback변수는 ErrorCode, ErrorMsg 두개를 넘겨 받을 수 있으며, 추가로 변수를 넘겨받기 위해서는 폼 변수를 정의하여 값을 받을 수 있습니다. 이때 폼 변수로정의하는 변수 정의시 초기값이 필요한듯 합니다. 꼭 정의를 해주어야 하나요?
참고사항
서버로 부터 변수값을 전달받기 위해서는 폼의 멤버변수(this)로 선언해야 하며 반드시 초기 값을 세팅해 주어야 합니다.
this.rowCount; (x) this.rowCount=0; (0); this.rowCount=""; (0);
WebBrowser
웹브라우저 컴포넌트에 NRE환경에서 innerHTML시 오류발생
오류 메시지
소스예) var strHtml = this.txtHead.value; var objWeb = this.WebBrowser01.getProperty("document").getProperty("head"); objWeb.setProperty("innerHTML", strHtml); 단) WRE환경에서는 정상동작 오류메시지) TypeError: Cannot read property 'setProperty' of undefined
해결방법
해당 오류의 원인은 NRE환경의 경우 기본 WebBrowser 버전이 IE7로 동작하여 발생하는 것으로 최신 버전으로 정보를 변경해 주면 해결이 가능합니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\ FeatureControl\FEATURE_BROWSER_EMULATION
Graphics
Graphics 컴포넌트를 이용하여 화살표를 그릴 수 있나요?
해당 내용은 추가된 기능으로 TypeDefinition의 Modules에서 Graphics.json 추가로 등록하고, Objects를 등록하여 사용이 가능합니다.
해결방법
예) var objGLine = new nexacro.GraphicsLine(); this.Graphics00.addChild( "GraphicsLine00", objGLine ); objGLine.set_x(10); objGLine.set_y(10); objGLine.set_x2(50); objGLine.set_y2(50); objGLine.set_strokepen('1px solid red'); this.Graphics00.redraw();
DataObjects
DataObject에서 호출하는 서비스 경로는 CORS와 무관한가?
참고사항
HTTP통신상에서 호출되는 서비스URL 경로는 프론트단과, 백엔드 단의 경소가 다르면 CORS 제약을 받음 즉 XMLHTTPRequest와 DataObjects에서 호출하는 서비스 경로 모두 해당됩니다.
XMLHttpRequest
XMLHttpRequest 기능을 사용하여 데이타를 조회하는 경우 CORS Access-Control-Allow-Origin 정책과 무관하게 사용이 가능한가?
참고사항
해당 내용은 CORS Access-Control-Allow-Origin 위배되는 경우 호출이 되지 않으므로 별도의 CORS 소스 작업이 더 필요합니다. (즉 CORS정책에 위배되는 경우 사용불가)
nexacroAPI
setPrivateProfile 저장위치
NRE,WRE환경별 setPrivatePofile 저장시 저장위치가 어떻게 되나요?
참고사항
LocalStorage는 각 브라우저별로 저장되며, NRE환경은 nexacro.xml파일에 저장됨 개인화 데이터는 어플리케이션이 구동될 때 설정한 Key 값 별로 따로 관리되며 "nexacro.xml" 파일에 저장됩니다. - "nexacro.xml" 파일은 사용자별로 정보를 관리하기 위해 사용하는 XML 형식의 파일입니다. Windows Vista 이상의 경우 "C:\Users\[사용자 계정]\AppData\LocalLow\nexacro\17" 위치에 파일이 생성됩니다. Windows Vista 미만의 경우 "C:\Documents and Settings\[사용자 계정]\Local Settings\Application Data\nexacro\17" 위치에 파일이 생성됩니다. - 웹브라우저 환경일 경우 브라우저의 Local Storage 영역에 개인화 데이터를 저장합니다.
파일 업/다운로드
파일업로드(FileDialog)창에서 파일종류를 Filter할수 있는가?
참고사항
Safari, IE8이;하에서 해당 기능을 사용할 수 없어 해당 기능은 런타임만 제공되며, HTML5는 지원하지 않습니다.
예) this.btnUpload_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { var filelist = ""; if(this.fileupload.filelist.length > 0) { for(var i=0;i<this.fileupload.filelist.length;i++) { filelist += this.fileupload.filelist[i].filename+"\n"; //nexacro.exe 형태로 나옴 즉 오른쪽 3자리를 파싱하여 체크 } alert(filelist); this.fileupload.upload("http://localhost"); } else { alert("NO SELECTED FILES"); } };
대안으로는 파일업로드시 filelist를 파싱하여 확장자를 체크하도록 구현은 할수 있을 것으로 보이나, 처음부서 파일을 선택못하도록 하는 것은 불가
엑설 업/다운로드
엑셀업로드시 clinet에서 데이타를 처리하지 않고 서버로 업로드 하여 처리하는 이유가 있는가?
해결방안
넥사크로플랫폼 HTML5 제품과 전용브라우저 동시에 제공하는 제품의로 HTML5의 경우 브라우저가 엘셀파일을 파싱할 수 있는 기능이 불가능하여 엑셀파일을 서버로 업로드 한 후 서버 Jar(POI) Lib를 이용하여 엑셀을 파싱 후 client에 내려주는 형태로 처리를 합니다.
참고사항
전용브라우저만 지원한다면 client에서 처리도 가능하겠지만 두 실행환경을 모두 대응해야 하므로 서버에서 처리하는 방법을 되어 있음 따라서 client에는 엑셀뷰어 정도만 있어도 엑셀파일을 볼 수 있습니다.
마이플랫폼, XPLATFORM의 경우 그리드 내용을 Excel로 출력할때 Client방식으로 처리가 가능했는데 NP에서도 가능한가요?(HTML5)
참고사항
nexacro platform17(HTML5) 및 Nexacro Browser에서는 Client방식이 아닌 서버(자바 Poi.jar)모듈을 사용하여 엑셀 Import/Export를 구현합니다. 이유는 웹브라우저가 Client에 설치되어 있는 Excel모듈을 제어할 수 없습니다. 따라서 nexacro platform으로 변경되면서 방식이 바뀝니다.
서버 방식으로 바뀜으로서 장점이 하나 발생하는데 기존 Client방식의 경우 사용자 PC excel 정품이 설치되어 있어야만 엑셀출력이 가능했다면 이제는 파일생성을 서버에서 하기 때문에 client 즉 사용자 Pc에는 엑셀 Viewer만 있어도 됩니다.