2.컴포넌트

마이플랫폼 컴폰너트를 사용시 개발자 분들이 자주묻는 유형별로 해결방법을 가이드 합니다.

2.1Basic API

2.1.1날짜계산 방법

마이플랫폼을 이용하여 날짜를 계산하는 방법에 대하여 기술합니다.

DateTime을 이용한 시간계산 (1시간 추가)

<?xml version="1.0" encoding="euc-kr"?>
<Window>
   <Form Height="768" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="1024" WorkArea="true">
    <Button Height="31" Id="Button3" Left="28" OnClick="Button3_OnClick" TabOrder="1" Text="초" Top="59" Width="64"></Button>
    <Edit Height="21" Id="Edit1" Left="127" Number="TRUE" TabOrder="2" Top="28" Width="121"></Edit>
    <Edit Height="31" Id="Edit2" Left="129" TabOrder="3" Top="58" Width="289"></Edit>
    <Button Height="31" Id="Button4" Left="29" OnClick="Button4_OnClick" TabOrder="4" Text="시간" Top="97" Width="64"></Button>
    <Edit Height="31" Id="Edit3" Left="128" TabOrder="5" Top="98" Width="289"></Edit>
    <Static Height="36" Id="Static0" Left="429" TabOrder="6" Text="초로&#32;환산" Top="62" Width="153"></Static>
    <Static Height="22" Id="Static1" Left="32" TabOrder="7" Text="시간,초" Top="28" Width="72"></Static>
    </Form>
<Script><![CDATA[
function Button3_OnClick(obj)
{
    //lf_getSecond("20061031120000","20061031120030");
    var aa = lf_getTimeM("20080125140000");
    Edit2.Text = lf_getDateTime(aa,1000 * parseInt(Edit1.Text));
}
function Button4_OnClick(obj)
{
    var aa = lf_getTimeM("20080125140000");
    Edit3.Text = lf_getDateTime(aa,(1000 * 3600 * parseInt(Edit1.Text)));
}
function lf_getTimeM(dt)
{
    var yy = parseInt(mid(dt,0,4));
    var mm = parseInt(mid(dt,4,2));
    var dd = parseInt(mid(dt,6,2));
    var hh = parseInt(mid(dt,8,2))-1;
    var mi = parseInt(mid(dt,10,2));
    var ss = parseInt(mid(dt,12,2));
    return (Tonumber(datetime(yy,mm,dd,hh,mi,ss)) - tonumber(datetime(1970,01,01,00,00,00))) * 24 * 3600 * 1000;
}
function lf_getDateTime(tval,ival)
{
    var time_stamp = tval + ival;
    time_stamp += toNumber(60*60*1000); // GMT기준으로 9시간 빠름
    time_stamp = truncate(time_stamp/1000,0);  //
    var s_day = time_stamp/(3600*24);
    var cur_time = time_stamp%(3600*24);
    var dayVal = adddate("19700101",s_day);
    var tot_min = cur_time/60;
    var s_sec = cur_time%60;
    var s_min = tot_min/60;
    var c_min = tot_min%60;
    return dayVal + " " + lpad(Truncate(s_min,0),0,2) + lpad(c_min,0,2) + lpad(s_sec,0,2); 
}
]]></Script>
</Window>

DateTime을 이용한 시간계산

DateTime함수를 이용하여 계산하는 샘플입니다
<?xml version="1.0" encoding="utf-8"?>
<Window>
    <Form Height="768" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="1024" WorkArea="true">
    <Edit Height="31" Id="Edit3" Left="130" TabOrder="1" Top="102" Width="176"></Edit>
    <Button Height="46" Id="Button1" Left="24" OnClick="Button1_OnClick" TabOrder="2" Text="현재시간&#32;+&#32;5분" Top="96" Width="89"></Button>
    </Form>
<Script><![CDATA[function Button1_OnClick(obj)
{
    //alert("today::"+today());
    //var aa = lf_getTimeM(today()+"140000"); // 20080125 140000
    var aa = lf_getTimeM(getDate()); // 20080125 140000
    //alert("aa ::"+ 1000 * (60 + parseInt(Edit1.Text)) );
    Edit3.Text = lf_getDateTime(aa,(1000 * (60*5) )); // 60*5 는 5분 추가
}
function lf_getTimeM(dt)
{
    var yy = parseInt(mid(dt,0,4));
    var mm = parseInt(mid(dt,4,2));
    var dd = parseInt(mid(dt,6,2));
    var hh = parseInt(mid(dt,8,2))-1;
    var mi = parseInt(mid(dt,10,2));
    var ss = parseInt(mid(dt,12,2));
    return (Tonumber(datetime(yy,mm,dd,hh,mi,ss)) - tonumber(datetime(1970,01,01,00,00,00))) * 24 * 3600 * 1000;
}
function lf_getDateTime(tval,ival)
{
    var time_stamp = tval + ival;
    time_stamp += toNumber(60*60*1000); // GMT기준으로 9시간 빠름
    time_stamp = truncate(time_stamp/1000,0);  //
    var s_day = time_stamp/(3600*24);
    var cur_time = time_stamp%(3600*24);
    var dayVal = adddate("19700101",s_day);
    var tot_min = cur_time/60;
    var s_sec = cur_time%60;
    var s_min = tot_min/60;
    var c_min = tot_min%60;
    return dayVal + " " + lpad(Truncate(s_min,0),0,2) + lpad(c_min,0,2) + lpad(s_sec,0,2); 
}
]]></Script>
</Window>

ParseDateTime을 이용한 날짜 일수계산

alert(ParseDateTime("20090301") - ParseDateTime("20090201"));

현재 날짜 시간을 구하는 함수

GetDate를 이용하여 yyyyMMddhhmmss 형태의 날짜시간을 구할 수 있습니다
GetDate();
GetDate() 결과는 사용자 PC 날짜를 리턴합니다. (서버 날짜를 리턴하지 않습니다.)
DateTime 을 이용한 시간계산
날짜 일수계산 방법
현재날자, 시간 구하는 함수가 있나요?
DateTime으로 시간계산방법

2.1.2특정문자열 치환

특정문자열을 치환 하는 함수는 기본제공이 되지 않으므로 별도의 사용자 함수를 만들어 처리해야합니다.

setAt() 함수

문자열의 길이와 substr함수를 이용하여 처리하시면 됩니다. 아래 소스 코드 입니다.

그림 2-120120625_144129888_fn_set

문자열 치환..

2.1.3Round사용하여 정수형 반올림

기본 제공하는 round는 실수형 데이터 반올림만 가능하며 정수형 반올림이 가능하도록 처리하는 방법입니다.

Math.round 처리시 정수 처리

그림 2-220120625_144602937_round

반올림을 소수점이 아니고 천단위로 하고 싶습니다.
정수값 반올림에 대해서 문의드립니다.

2.1.4String 데이타의 Codepage 변환방법

TextToBin을 이용하면 codepage 지정이 가능하며 변경한 binary데이타를 binToText를 이용하여 다시 원하는 codepage의 String으로 변경할 수 있습니다.

BinToText / TextToBin

var aa = TextToBin("투비", "utf-8");
var bb = binToText(aa, "utf-8");
alert(bb);
String형 변수를 특정 Encoding로 변환하는 방법

2.2DataSet

2.2.1기본기능 설명

데이터를 Table형태로 저장하는 기본 컴포넌트
MiPlatform Client와 서버간의 데이터 통신 기본 단위 
DataSet의 컬럼 및 레코드를 추가,삭제, 수정하는 Method,레코드, Groupping, Sort, Filter 기능, 
통계 Method(Sum, Min, Avg,count)를 지원합니다. 또한 DataSet Merge, Append, Copy하는 기능을 지원합니다. ( Help 도움말 참고)

2.2.2DataSet의 Filter(like) 사용방법

마이플랫폼의 DataSet 정보를 이용하여 Filter를 통해 원하는 값 정보를 추출할 수 있습니다. 
이때 SQL문의 Like기능을 구현하는 방법에 대해 기술합니다.

DataSet Filter Method 설명

표 2-1관련API

Method

간략설명

Syntax

Filter

DataSet의 조건식에 해당하는 Record만 선택하여 출력하는 Record

Filter(strFilterExpr);

예) 조건에 만족하는 기본 Filter 
ds_code.Filter("code!='1' && name!='1'");
예) 조건에 만족하는 Like Filter 
Edit 컴포넌트를 만들었을 경우 해당 컴폰너트에 값이 입력시 Filter 되는 샘플
 
function Edit0_OnCharChanged(obj,strPreText,strPostText)
{
    if(length(strPostText) > 0)
    {
       var rtn =ds_code.Filter("pos(code," + "'" + replace(strPostText,"'","\\'") + "') >= 0");
    } else {
        ds_code.UnFilter();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<Window>
   <Form Height="768" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="1024" WorkArea="true">
   <Datasets>
       <Dataset DataSetType="Dataset" Id="ds_code">
       <Contents>
           <colinfo id="code" size="256" summ="default" type="STRING"/>
           <colinfo id="name" size="256" summ="default" type="STRING"/>
           <record>
               <code>공동주택11</code>
               <name>22</name>
           </record>
           <record>
               <code>공동주택21</code>
               <name>3</name>
           </record>
           <record>
               <code>공동주택22</code>
               <name>3</name>
           </record>
           <record>
               <code>가</code>
               <name>11111</name>
           </record>
           <record>
               <code>가나다</code>
               <name>22222</name>
           </record>
           <record>
               <code>가나다라마</code>
               <name>444</name>
           </record>
       </Contents>
   </Dataset>
   </Datasets>
   <Grid BindDataset="ds_code" BkColor2="default" BoldHead="true" Bottom="363" Enable="true" EndLineColor="default" Height="267" Id="Grid0" InputPanel="FALSE" Left="32" LineColor="default" Right="446" TabOrder="1" TabStop="true" Top="96" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="414">
   <Contents>
       <columns>
           <col Width="80"/>
           <col Width="80"/>
       </columns>
       <head>
           <cell col="0" Text="code"/>
           <cell col="1" Text="name"/>
       </head>
       <body>
           <cell col="0" colid="code"/>
           <cell col="1" colid="name"/>
       </body>
   </Contents>
   </Grid>
   <Edit Height="42" Id="Edit0" Left="32" OnCharChanged="Edit0_OnCharChanged" TabOrder="2" Top="32" Width="107"></Edit>
   </Form>
   <Script><![CDATA[
function Edit0_OnCharChanged(obj,strPreText,strPostText)
{
  if(length(strPostText) > 0)
  {
     var rtn =ds_code.Filter("pos(code," + "'" + replace(strPostText,"'","\\'") + "') >= 0"); 
  } else {
      ds_code.UnFilter();
  }
}
  ]]></Script>
</Window>
Filter의 Like 기능에 대해..
Filter된 Row를 리턴 시키는 함수
Filter 를 like 처럼 할 수 있나요

2.2.3DataSet의 OrginBuffer에 기록되는 시점

OrginBuffer에는 이미 데이타를 서비스를 통해서 조회가 된 상태이거나 초기데이타가 Row에 있는 경우에 한하여 수정, 삭제시 OrginBuffer에 기록이 됩니다.
스트립트를 이용한 AddRow된 정보에 대해서는 OrginBuffer에 기록되지 않습니다.
DataSet의 OrginBuffer에 기록되는 시점은?

2.2.4DataSet의 onLoadComplaged 사용시 주의사항

서비스를 통해 데이터를 받게 되면 onLoadComplated 이벤트가 발생하게 됩니다. 
이때 파라메터 값 중 nReason 파라메터 값에 유의해야 한다.
function Dataset0_OnLoadCompleted(obj,nErrorCode,strErrorMsg,nReason)
{
//onLoadComplaged에서 nReason을 체크하지 않으면 DataSet의 변경이 일어날 경우 원하지 않는 이벤트가 발생할 수 있음 
    If(nReason == 0) 
    {
        Alert(“데이터 조회 성공”)
    }          
}
DataSet의 onLoadComplated이벤트가 의도하지 않게 발생합니다.

2.2.5DataSet의 이벤트를 잠시 멈추고자 할 경우 (FireEvent사용)

DataSet은 바인드된 컴포넌트 즉 Grid, EditBox, MaseEdit등 Bind된 컴포넌트에 변경이 일어나는 경우 DataSet의 이벤트가 발생합니다. 
그러나 이벤트를 잠시 멈추고자 한다면 다음과 같이 처리가 가능합니다.
//일반적인 예) Trace가 3번 출력됨 
function Dataset0_OnColumnChanged(obj,nRow,strColumnID,varOldValue,varNewValue,nPivotIndex)
{
      Trace(“OnColumnChanged”);
      if(strColumnID == "GUBUN")   
      {
                  Dataset0.setcolumn(nRow,"A","A값");
                  Dataset0.setcolumn(nRow,"B","B값");
      }          
}
//FireEvent 사용 : DataSet의 Event를 발생할지 여부를 설정하는 Property
//FireEvent를 이용한 이벤트 멈춤기능 적용  예) Trace가 1번 출력됨 
function Dataset0_OnColumnChanged(obj,nRow,strColumnID,varOldValue,varNewValue,nPivotIndex)
{
       Trace(“OnColumnChanged”);
       if(strColumnID == "GUBUN")   
       {
          Dataset0.fireEvent = false;   //false 적용  잠시이벤트를 종료시킴
          Dataset0.setcolumn(nRow,"A","A값");
          Dataset0.setcolumn(nRow,"B","B값");
          Dataset0.fireEvent = true;   // true적용 다시 이벤트를 연겨시킴 
      }
}
FireEvent를 false를 하면 True로 반드시 이벤트를 연결시켜주어야 MiPlatform엔진 이벤트가 정상동작합니다.
DataSet의 이벤트가 의도하지 않게 발생합니다.

2.2.6DataSet의 CanColumnChange 이벤트 사용방법

Dataset의 Column 값이 변경되기 전에 발생하는 Event 입니다.
(해당 이벤트는 특정 컬럼의 값이 정상적으로 입력된 경우에만 적용하고 그렇지 않는 경우 이전값을 유지하고자 할 경우 자주 사용되는 내용입니다.)
function Dataset0_CanColumnChange(obj,nRow,strColumnID,varOldValue,varNewValue,nPivotIndex)
{   
      if(strColumnID == "GUBUN")
      {
                  if(length(varNewValue) != 5)
                  {
                                  alert("구분은 5자리로 입력해주세요.")
                                   return false;   
                                  // return false시에는 값이 적용되지 않고 이전에 입력한 값으로 돌아갑니다.
                  }                                  
      }
}
DataSet의 컬럼의 조건이 맞는 경우에만 값을 입력하고 조건에 맞지 않는 경우 이전값을 유지하고 싶습니다.

2.2.7DataSet의 Sort시 참고사항

마이플랫폼의 DataSet 정보를 이용하여 Sort시 참고사항에 대해 기술합니다

표 2-2Sort Method

Method

간략설명

Syntax

Sort

Dataset의 Record들을 내림차순이나 오름차순으로 정렬하는 Method 입니다.

Sort(strColList);

예) DataSet0.Sort("컬럼명");
DataSet의 Sort는 컬럼의 Type을 이용하여 정렬이 됩니다.
예를들어 그리드의 Display Type이 number형이라고 하더라도 DataSet의 컬럼이 String인 경우 문자정렬이 됩니다.
반드시 DataSet의 컬럼 Type이 숫자형인 경우에만 정상 Sort 됩니다.
DataSet Sort시 소수점 Sort가 되지 않아요?
DataSet Sort가 문자로 Sort가 됩니다

2.2.8DataSet의 중복된 ROW를 제거방법

Dataset의 특정 컬럼의 중복을 제거하여 Filter 한다.

관련 Method (filter, SearchRow)

var sExpr = "rowidx==SearchRow(\"code=='\" + code + \"' && code2=='\" + code2 + \"'\")";
Dataset0.filter(sExpr);
중복데이타 정보를 알 수 있나요?

소스 예)

<?xml version="1.0" encoding="euc-kr"?>
<Window>
 <Form Height="480" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="640" WorkArea="false">
  <Datasets>
   <Dataset DataSetType="Dataset" Id="Dataset0">
    <Contents>
     <colinfo id="index" size="256" summ="default" type="STRING"/>
     <colinfo id="code" size="256" summ="default" type="STRING"/>
     <colinfo id="name" size="256" summ="default" type="STRING"/>
     <colinfo id="code2" size="256" summ="default" type="STRING"/>
     <record>
      <code>1</code>
      <code2>1</code2>
      <index>0</index>
      <name>가</name>
     </record>
     <record>
      <code>1</code>
      <code2>1</code2>
      <index>1</index>
      <name>가</name>
     </record>
     <record>
      <code>1</code>
      <code2>1</code2>
      <index>2</index>
      <name>가</name>
     </record>
     <record>
      <code>2</code>
      <code2>2</code2>
      <index>3</index>
      <name>나</name>
     </record>
     <record>
      <code>2</code>
      <code2>2</code2>
      <index>4</index>
      <name>나</name>
     </record>
     <record>
      <code>2</code>
      <code2>3</code2>
      <index>5</index>
      <name>나</name>
     </record>
     <record>
      <code>2</code>
      <code2>3</code2>
      <index>6</index>
      <name>나</name>
     </record>
     <record>
      <code>3</code>
      <code2>4</code2>
      <index>7</index>
      <name>다</name>
     </record>
     <record>
      <code>3</code>
      <code2>5</code2>
      <index>8</index>
      <name>다</name>
     </record>
     <record>
      <code>4</code>
      <code2>6</code2>
      <index>9</index>
      <name>라</name>
     </record>
     <record>
      <code>4</code>
      <code2>6</code2>
      <index>10</index>
      <name>라</name>
     </record>
     <record>
      <code>1</code>
      <code2>1</code2>
      <index>11</index>
      <name>마</name>
     </record>
    </Contents>
   </Dataset>
  </Datasets>
  <Button Height="50" Id="Button0" Left="440" OnClick="Button0_OnClick" TabOrder="1" Text="필터..." Top="57" Width="133"></Button>
  <Button Height="50" Id="Button1" Left="440" OnClick="Button1_OnClick" TabOrder="2" Text="code,&#32;name" Top="120" Width="131"></Button>
  <Button Height="50" Id="Button2" Left="440" OnClick="Button2_OnClick" TabOrder="3" Text="code,&#32;name,&#32;code2" Top="184" Width="131"></Button>
  <Grid BindDataset="Dataset0" BkColor2="default" BoldHead="true" Bottom="289" Enable="true" EndLineColor="default" Height="253" Id="Grid0" InputPanel="FALSE" Left="22" LineColor="default" Right="416" TabOrder="4" TabStop="true" Top="36" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="394">
   <contents>
    <columns>
     <col width="80"/>
     <col width="80"/>
     <col width="80"/>
     <col width="80"/>
    </columns>
    <head>
     <cell col="0" display="text" text="index"/>
     <cell col="1" display="text" text="code"/>
     <cell col="2" display="text" text="name"/>
     <cell col="3" display="text" text="code2"/>
    </head>
    <body>
     <cell col="0" colid="index" display="text"/>
     <cell col="1" colid="code" display="text"/>
     <cell col="2" colid="name" display="text"/>
     <cell col="3" colid="code2" display="text"/>
    </body>
   </contents>
  </Grid>
 </Form>
 <Script><![CDATA[function Button0_OnClick(obj)
{
 var sExpr = "rowidx==SearchRow(\"code=='\" + code + \"' && code2=='\" + code2 + \"'\")";
 Dataset0.filter(sExpr);
}

function Button1_OnClick(obj)
{
 gf_distincDsFilter(Dataset0, "code,name");
}
function Button2_OnClick(obj)
{
 gf_distincDsFilter(Dataset0, "code,name,code2");
}
/*****************************************************************************************
 * 함  수  명 :   gf_distincDsFilter 
 * 입      력 :   1. objDs Dataset Object
                    2. sColID Column List (여러 항목일 경우 ',' 로 구분)
 * 반      환 :  없음
 * 기      능 :  Dataset의 특정 컬럼의 중복을 제거하여 Filter 한다.
 *****************************************************************************************/
function gf_distincDsFilter(objDs, sColID)
{
 var arrArgs = split(gf_Trim(sColID), ",");
 var sFilterExpr  = "";
 var sFindRowExpr = "";
 var sLog = "";
 for (var i=0; i<arrArgs.length; i++)
 {
  if (objDs.GetColIndex(arrArgs[i]) == -1) continue;  
  sFindRowExpr += sLog + arrArgs[i] + "=='\" + " + arrArgs[i] + " + \"'";
  sLog = " && ";
 }
 
 if (gf_IsNull(sFindRowExpr) == false) {
  sFilterExpr = "rowidx==SearchRow(\"" + sFindRowExpr + "\")";
 }
 objDs.filter(sFilterExpr);
}
function gf_Trim(sValue)
{
    if (sValue == null) return "";
    
    var retVal = replace(sValue, " ", "");
    return retVal;
}
function gf_IsNull(sValue)
{
    if (sValue == null) return true;
    
    var v_ChkStr = sValue;
    if (v_ChkStr == null) return true;
    if (length(v_ChkStr) == 0 ) return true;
    return false;
}
]]></Script>
</Window>

2.3Grid

2.3.1그리드 내용을 Excel로 출력하는 방법

MiPlatform의 그리드 정보를 Export기능을 통해 엑셀로 표현하는 방법에 대해 알아보고 자주 묻는 유형별 처리방법에 대해 기술합니다.
표 2-3관련 API

Method

간략설명

Syntax

ExcelExportEx

Grid의 내용을 Microsoft Excel의 WorkSheet로 Export 하는 Method 입니다.

ExportExcelEx(strDocName);

ExcelExport

Grid의 내용을 Microsoft Excel의 WorkSheet로 Export 하는 Method 입니다.

ExportExcel(strDocName);

SaveExcelEx

Grid의 내용을 Microsoft Excel의 WorkSheet로 Export 하는 Method 입니다.

SaveExcelEx(strFileName,strDocName);

SaveExcelEx

Grid의 내용을 Microsoft Excel의 WorkSheet로 Export 하는 Method 입니다.

SaveExcel(strFileName,strDocName);

Grid의 내용을 Microsoft Excel의 WorkSheet로 Export하는 메소드 설명

ExportExcel

//strdocname - sheet명
//strCell    - 시작셀을 지정 : 생략가능(default a1)
//bSelOnly   - 선택된 범위만 : 생략가능(default false)
//baddhead   - 헤더표시여부  :생략가능(default true)
Grid0.ExportExcel("sheet1","B1",false,true);

ExportExcelEx

//strdocname - sheet명
//strCell    - 시작셀을 지정 : 생략가능(default a1)
//bSelOnly   - 선택된 범위만 : 생략가능(default false)
//baddhead   - 헤더표시여부  :생략가능(default true)
//basync       - sync여부
//bmerge     - suppress한걸 merge여부
Grid0.ExportExcelEx("sheet1","B1",false,true,true,false);

SaveExcel

//strFilename - file명
//strdocname - sheet명
//strCell    - 시작셀을 지정 : 생략가능(default a1)
//bSelOnly   - 선택된 범위만 : 생략가능(default false)
//baddhead   - 헤더표시여부  :생략가능(default true)
Grid0.SaveExcel("c:\\temp\\sample.xls","sheet1");

SaveExcelEx

//strFilename - file명
//strdocname - sheet명
//strCell    - 시작셀을 지정 : 생략가능(default a1)
//bSelOnly   - 선택된 범위만 : 생략가능(default false)
//baddhead   - 헤더표시여부  :생략가능(default true)
Grid0.SaveExcelEx("c:\\temp\\sample.xls","sheet1");

ExportObject

ExportObject1 = CreateExportObject();
ExportObject1.ExportType  = "Excel";
ExportObject1.ExportFileName = FileDialog0.FilePath + "\\" + FileDialog0.FileName;
ExportObject1.ActiveSheetName   = "test1";
ExportObject1.MakeEmptyFileWhenNotExist = true;  
ExportObject1.AddExportGrid("test1" + "!" + "A1", Grid0, true, false);
ExportObject1.AddExportGrid("test1" + "!" + "A2", Grid1, true, false);
ExportObject1.Export(CheckBox0.Value, CheckBox1.Value);  
ExportObject1.save();
ExportObject1.Close();
ExportObject1 = null;

제품구분

메소드명

실행여부

진행바표시

Clipboard

사용

파일생성

특징

MiPlatform

ExportExcel

O

X

X

X

가장느림

ExportExcelEx

O

O

O

X


saveExcel

X

O

X

O


saveExcelEx

O

O

O

O


ExportObject

O

O

O

O


Excel Export시 진행창을 없앨 수 있는가?

2008년12월18일자 기준으로 그리드 속성 ShowProgressUsingExcel 기능이 추가되었습니다
Grid2.ShowProgressUsingExcel=false;
Grid2.ExportExcelEx("sheet");
ExportExcelEx, SaveExcel, SaveExcelEx에서 제공되는 기능압니다.
Excel Export시 진행창을 없앨 수 있는가?
그리드에서 ExportExcelEx. SaveExcel,SaveExcelEx사용시 프로그래스바를 Hidden기능

2.3.2Grid상에서 decode, iif사용방법

Grid의 특정 Cell에서 decode문과 iif사용방법에 대해 기술합니다.

decode 문 사용방법

DataSet의컬럼AGE의값에따른표현방법 

사용 예) 
decode(AGE, 10, '10대', 20, '20대', 30,'30대', 40, '40대', 50, '50대','기타')
DataSet의 컬럼 GUBUN의 값에 그리드 Cell Edit/Display 변경방법
(Edit/Display의 Expr 작성부분 참고)

사용 예)
decode(Gubun,'1','checkbox','none')

iif 문 사용방법

DataSet의 컬럼 GUBUN의 값에 따른 표현방법 
 
(Grid에서 iif 사용 소스)
<?xml version="1.0" encoding="utf-8"?>
<Window>
 <Form Height="711" Id="ScriptAPI_Method_Decode" Left="8" PidAttrib="7" Title="ScriptAPI&#32;Method&#32;Decode" Top="8" Ver="1.0" Width="1024" WorkArea="true">
  <Datasets>
   <Dataset DataSetType="Dataset" Id="Dataset0">
    <Contents>
     <colinfo id="AGE" size="256" summ="default" type="STRING"/>
     <colinfo id="GUBUN" size="256" summ="default" type="STRING"/>
     <record>
      <AGE>10</AGE>
      <GUBUN>M</GUBUN>
     </record>
     <record>
      <AGE>20</AGE>
      <GUBUN>M</GUBUN>
     </record>
     <record>
      <AGE>30</AGE>
      <GUBUN>F</GUBUN>
     </record>
     <record>
      <AGE>40</AGE>
      <GUBUN>F</GUBUN>
     </record>
     <record>
      <AGE>50</AGE>
      <GUBUN>F</GUBUN>
     </record>
     <record>
      <AGE>60</AGE>
      <GUBUN>M</GUBUN>
     </record>
    </Contents>
   </Dataset>
  </Datasets>
  <Grid BindDataset="Dataset0" BkColor2="default" BoldHead="true" Bottom="403" Enable="true" EndLineColor="default" Height="395" Id="Grid0" InputPanel="FALSE" Left="11" LineColor="default" Right="480" TabOrder="1" TabStop="true" Top="8" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="469">
   <contents>
    <format id="Default">
     <columns>
      <col width="80"/>
      <col width="90"/>
      <col width="80"/>
     </columns>
     <head>
      <cell col="0" display="text" text="AGE"/>
      <cell col="1" display="text" text="성별"/>
      <cell col="2" display="text" text="iif표현"/>
     </head>
     <body>
      <cell col="0" colid="AGE" display="text"/>
      <cell col="1" colid="GUBUN" display="text"/>
      <cell col="2" display="text" expr="iif(GUBUN==&apos;M&apos;,&apos;남성&apos;,&apos;여성&apos;)" text="iif"/>
     </body>
    </format>
   </contents>
  </Grid>
 </Form>
 <Script></Script>
</Window>
Grid에서 decode문과 iif문을 사용하는 것은 그리드 화면 속도(스크롤) 및 화면 깜박임 현상이 발생할수 있으므로 가능한 최소 사용을 권장합니다
decode, iif관련 사용방법

2.3.3피벗그리드

피벗그리드를 이용하는 방법

피벗 그리드를 만들기 위해서는 피벗 데이터셋 양식이 필요합니다. 
피벗 데이터셋은 원본의데이타셋의 groupkey,pivotkey를 지정하여 이용가능합니다.
피벗 데이터셋을 만들기 위해서는  피벗데이타 구조가 될 수 있도록 원본 데이터가 필요합니다.

원본데이타셋을 피벗데이타 구조로 만들기

그림 2-320120618_141012641_pivot_1

groupKey = name (Group으로 묶을 Column ID, 아래로 증가되는column)

pivotKey = date (PivotTable을 구성하기 위한 PivotColumn, 오른쪽으로 증기되는 column)

그림 2-420120618_141059419_pivot_2

그림 2-520120618_141152979_pivot_3

groupKey = column0:column1(그룹키를 설정)
pivotKey = column3 (PivotTable을 구성하기 위한 PivotColumn, 오른쪽으로 증기되는 column)

그림 2-620120618_141918238_pivot_9

groupKey = column0,column1(그룹키를 , 로 줌/ 소계가 나옴)
pivotKey = column3 (PivotTable을 구성하기 위한 PivotColumn, 오른쪽으로 증기되는 column)

그림 2-720120618_141957552_pivot_10

피벗그리드에서 groupKey로 지정한 값에 대해서 원하는 순서대로 정렬하는 방법
피벗그리드에서 그룹키로 지정을 한 값에 대해서 자동으로 오름차순 정렬이 됩니다.
그룹키로 지정한 값에 대해서 원하는 순서대로 보여주기 위해서는 알파벳(A.B.C …) 순서대로 붙여서 오름차순 정렬이 되도록 처리 한 후 보여줄때는 알파벳 앞은 자른 후 보여줄 수 있습니다.

그림 2-820120618_141448068_pivot_6

<?xml version="1.0" encoding="utf-8"?>
<Window>
   <Form Height="543" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="800" WorkArea="true">
      <Datasets>
                 <Dataset DataSetType="Dataset" Id="dsOrgKind_0">
                       <Contents>
                                    <colinfo id="name" size="256" summ="default" type="STRING"/>
                                    <colinfo id="won" size="256" summ="default" type="INT"/>
                                    <colinfo id="date" size="256" summ="default" type="STRING"/>
                                    <record>
                                                  <date>1월</date>
                                                  <name>감자</name>
                                                  <won>1000</won>
                                    </record>
                                    <record>
                                                  <date>2월</date>
                                                  <name>감자</name>
                                                  <won>2000</won>
                                    </record>
                                    <record>
                                                  <date>3월</date>
                                                  <name>감자</name>
                                                  <won>3000</won>
                                    </record>
                                    <record>
                                                  <date>1월</date>
                                                  <name>오이</name>
                                                  <won>2000</won>
                                    </record>
                                    <record>
                                                  <date>2월</date>
                                                  <name>오이</name>
                                                  <won>1000</won>
                                    </record>
                                    <record>
                                                  <date>3월</date>
                                                  <name>오이</name>
                                                  <won>3000</won>
                                    </record>
                                    <record>
                                                  <date>1월</date>
                                                  <name>상추</name>
                                                  <won>2300</won>
                                    </record>
                                    <record>
                                                  <date>2월</date>
                                                  <name>상추</name>
                                                  <won>1300</won>
                                    </record>
                                    <record>
                                                  <date>3월</date>
                                                  <name>상추</name>
                                                  <won>1000</won>
                                    </record>
                       </Contents>
                  </Dataset>
                  <Dataset DataObject="dsOrgKind_0" DataSetType="Pivot" GroupKey="name" Id="dsOrgKind_0Pivot0" PivotKey="date"></Dataset>
     </Datasets>
     <Grid AutoEnter="TRUE" BindDataset="dsOrgKind_0Pivot0" BkColor2="default" BoldHead="FALSE" Border="Flat" Bottom="352" ColSizing="TRUE" Editable="TRUE" Enable="true" EndLineColor="default" HeadBorder="Flat" HeadHeight="20" Height="120" Id="Grid1" InputPanel="FALSE" Left="24" LineColor="default" Right="352" RowHeight="21" Style="Grd_Com" TabOrder="1" TabStop="FALSE" Top="232" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="328">
                  <contents>
                       <format id="Default">
                                    <columns>
                                                  <col fix="left" width="74"/>
                                                  <col width="74"/>
                                    </columns>
                                    <head>
                                                  <cell bkcolor="silver" col="0" display="text" text="Title"/>
                                                  <cell bkcolor="silver" col="0" display="text" text="date"/>
                                                  <cell bkcolor="silver" col="0" display="text" row="1" text="name"/>
                                                  <cell col="1" colid="date" display="normal"/>
                                                  <cell col="1" display="text" row="1" text="won"/>
                                    </head>
                                    <body>
                                                  <cell celltype="head" col="0" colid="name" display="text" subsumtext="Subtotal"/>
                                                  <cell bkcolor="expr:iif(rowlevel&gt;0,&apos;honeydew&apos;,&apos;default&apos;)" col="1" colid="won" display="normal"/>
                                    </body>
                       </format>
                  </contents>
     </Grid>
     <Grid BindDataset="dsOrgKind_0" BkColor2="default" BoldHead="true" Bottom="216" Enable="true" EndLineColor="default" Height="192" Id="Grid2" InputPanel="FALSE" Left="24" LineColor="default" Right="288" TabOrder="2" TabStop="true" Top="24" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="264">
        <contents>
             <format id="Default">
                  <columns>
                                <col width="80"/>
                                <col width="80"/>
                                <col width="80"/>
                  </columns>
                  <head>
                                <cell col="0" display="text" text="name"/>
                                <cell col="1" display="text" text="won"/>
                                <cell col="2" display="text" text="date"/>
                  </head>
                  <body>
                                <cell col="0" colid="name" display="text"/>
                                <cell col="1" colid="won" display="text"/>
                                <cell col="2" colid="date" display="text"/>
                  </body>
             </format>
        </contents>
     </Grid>
     <Button Height="29" Id="Button0" Left="32" OnClick="Button0_OnClick" TabOrder="3" Text="Button0" Top="376" Width="105"></Button>
     <Static Height="21" Id="Static0" Left="296" TabOrder="4" Text="원본그리드" Top="24" Width="102"></Static>
     <Static Height="25" Id="Static1" Left="376" TabOrder="5" Text="피벗그리드" Top="232" Width="100"></Static>
     <Static Height="65" Id="Static2" Left="32" TabOrder="6" Text="처음에&#32;피벗&#32;그리드에&#13;&#10;&#13;&#10;감자,상추,오이&#32;순으로&#32;정렬&#32;되어&#32;있다가&#13;&#10;버튼&#32;클릭&#32;후&#32;오이,감자,상추&#32;순으로&#32;정렬됩니다." Top="440" Width="362"></Static>
</Form>
<Script><![CDATA[
function Button0_OnClick(obj)
{  
  for(var i = 0; i<dsOrgKind_0.GetRowCount(); i++)
  {
        switch(dsOrgKind_0.GetColumn(i,"name"))     //원하는 순서대로 알파벳을 붙여준다.
       { 
       case "오이" :
        dsOrgKind_0.SetColumn(i,"name","A오이");
                  break;
       case "감자" :
        dsOrgKind_0.SetColumn(i,"name","B감자");
                  break;
       case "상추" :
        dsOrgKind_0.SetColumn(i,"name","C상추");
                  break;
        }
  }  
  dsOrgKind_0Pivot0.RecalcPivot();    //피벗을 다시 그린 후 
  Grid1.SetCellProp("body","name","Expr","substr(name,1,length(name))");  //화면에서는 알파벳은 자르고 오이,감자,상추만  보여준다.
}    
]]></Script>
</Window>

2.3.4피벗 그리드에서 각각의pivot컬럼에 따라 bkColor설정

피벗그리드에서 pivotKey로 지정한 pivot컬럼의 cell별로 bkColor색상지정하는 방법
pivotIndex를 이용하여 나타낼 수 있습니다
pivotIndex 란 PivotDataset에서 PivotColumn의 index를 뜻합니다.

그림 2-920120618_141417232_pivot_7

pivot그리드 이용하는방법
pivot그리드에서 groupKey로 지정된 값을 오름차순 또는 내림차순 정렬하는방법
pivot의 피벗컬럼 색상변경방법

2.3.5그리드 체크박스에 체크가 되지 않을 경우 확인사항

MiPlatform 구현된 그리드 중 체크항목을 만들기 위해 맨앞이나, 특정 위치에 체크박스를 구현하는 경우가 있습니다. 
그러나 디자인시에는 정상적으로 동작을 하나, 서비스(JSP,JAVA, ASP 등)을 연결 후 체크박스가 선택이 안되는 문제에 대한 해결방법입니다.

체크사항

그리드에 바인드한 DataSet명이 존재하는지 확인한다.

trace(Dataset0.SaveXML());
그리드의 속성 Enable이 true로 설정되어 있는지 확인합니다. 
그리드 체크박스 컬럼의 Display, Edit 속성이 모두 CheckBox로 되어 있는지 확인합니다.
그리드 체크박스가 선택이 안됩니다.

2.3.6피벗 사용시 컬럼의 Sort문제

피벗그리드는 피벗을 표현시 Query순서대로 나오지 않고 자동 Sort가 됩니다. 
즉,  가, 나, 라, 마 등으로 조회가 되는데 
QuickView로 표현을 하여 실해하면, 가,나,다,라,마 순으로 표현됩니다.
피벗은 자동으로 Sort를 하게 됩니다.
따라서 즉 가나다 순으로 자동 정렬이 되므로 만약 Query순서대로 표현을 하고자 한다면
앞에 순서를 의마할 수 값으로 조회를 해야 합니다.
예) 1가, 2나, 3라, 4마 등
또한 그리드에서 표현시에는 왼쪽 1자리를 뺀 나머지를 표현해 주도록 구현을 하셔야 합니다.
피벗 구현시 자동으로 Sort가 되는문제가 있습니다.

2.3.7피벗 그리드 사용시 Groupkey로 설정된 Column에 대해 Sizing을 하고 싶은 경우

피벗그리드의 경우 GroupKey로 설정된 Column(Cell)은 ColSizing을 true로 하여도 이동이 되지 않습니다. 
그러나 그리드 옵션 중 FixedColSizing를 true로 설정하시면 가능합니다.
피벗이 설정했는데.. 지정된 컬럼 폭 조정이 안됩니다.

2.3.8그리드 페이지 구현

Grid에서 페이지 기능 제공여부

MiPlatform 그리드는 기본적으로 페이지 처리를 제공하지 않습니다. 
MiPlatform 그리드는 일반 웹페이지와 달리 대량의 데이타 표현이 가능하므로 스크롤을 기능을 사용합니다.

페이지 처리 구현방법

그리드 하단에 페이징 기능은 별도 Static, Button등으로 페이지를 스크립트를 이용하여 구현할 수 있습니다. 
그리드 데이타 표현을 맨 하단까지 내려갔을때 데이타를 재 조회하고자 한다면 Grid의 이벤트 OnTrackLast에서 추가적으로 데이타를 가져올 수 있도록 구현할 수 있습니다.
그리드에서 페이지 처리가 가능한가요?

2.4Form

2.4.1마이플랫폼 Resize기능

마이플랫폼에서 화면에 대한 Resize기능을 제공하지 않으나, 스크립트를 이용한 처리방법을 기술합니다.

Script를 이용한 Resize 처리

마이플랫폼의 Form(폼)이벤트 중 onSize이벤트를 통해 Resize를 처리할 수 있습니다.

IE Embed시 브라우저에서 키보드와 휠마우스를 이용할 경우 Resize 함수호출

웹브라우저에서 Ctrl + 휠마우스를 이용하여 사이즈가 변경이 되면 HTML문서의 OnResize이벤트가 발생합니다.  
이 이벤트에서 마이플랫폼 사이즈를 변경하는 작업을 할 수 있습니다.
<body topMargin="2" onload="fn_load()" scroll="auto"  onResize="fn_resize()">
//자바스트립트 구현 
function fn_resize()
{
     Alert(“이곳에서 마이플랫폼에 CallScript를 통해서 사이즈 변경하도록 이벤트 구현);
}
마이플랫폼에서 화면 resize가 가능한가

2.4.2폼(Open)에 값 전달시 길이제한

Open/Dialog시 값(parameter)전달시 길이 제한사항입니다.

변수 Type이stirng으로 넘기는 경우는 제한이 없음
숫자형일 경우 int일 경우 -2147483648 ~ 2147483647 내에서 값 전달 가능하면 범위에 벗어나면 오버플로우되어 값이 틀려집니다.
String전달방법 : aa=quote(전달값)
int일 경우 aa=전달값 과 같이 quote로 감싸주면 String으로 인식합니다.
Open/Dialog시 값 전달시 길이 제약사항

2.4.3마이플랫폼에서 Timer 사용방법

마이플랫폼을 이용하여 프로그램을 구현시 폼 화면 또는 Application에서 주기적으로 Event를 발생하여 서비스 또는 화면에 이벤트를 발생하고자 하는 Form API로 사용방법 및 주의사항에 대해 기술합니다.
표 2-4관련 API

Method

간략설명

Syntax

SetTimer

주기적으로 Event를 발생

SetTimer(nEventID,nElapse);

KillTimer

Timer로 설정된 Timer를 제거

KillTimer(nEventID);

Form의 OnLoadEvent 에서 SetTimer 3초 후이벤트 발생 
function person_entry_OnLoadCompleted(obj) 
{
     SetTimer(1,3000);
}
function person_entry_OnTimer(obj,nEventID)
{
      KillTimer(1); // 동작 중인 Timer를 종료시킨다. 
}
SetTimer시 파라메터 nEventID는 Form화면에서는 유일한 Key값을 설정해야 합니다.
만약 같은 폼에서 동일한 nEventID를 여러 개 부여한다면 정상동작되지 않습니다.

단 Form이 다른 경우에는 nEventID가 중복이 가능합니다.
SetTimer는 KillTimer에 의해 종료되거나, 폼이 닫히면 실행이 종료됩니다
SetTimer 사용방법
SetTimer 사용시 해제 방법
timer 사용시 에러 발생 대처 방법
Sleep기능처럼 원하는 시간만큼 지연시킬 수 있나요?

2.4.4MiPlatform 폼(form)의 Div에 연결된 폼에 include파일이 있는 경우 onload에서 띄우는 Alert의 순서의 이상동작

MiPlatform에서 디버깅 작업을 하기 위하여 Alert를 사용하는 경우가 있으나 include시 alert를 사용하는 경우 문제점과 해결방법을 기술합니다.

폼의Div에 연결된 폼에 include파일이 있는 경우 onLoad에서 띄우는 alert 메시지 창 실행순서가 이상함

참고사항

1)  이벤트는 정상적으로 발생합니다.  
     즉 자식 OnloadCompleted가 모두 발생한 후에 부모 OnloadCompleted가 발생합니다.  
     trace를 찍어서 확인할 수 있습니다.

 2) 1)번항에도 불구하고 alert를 찍었을 때 alert순서가 부모와 꼬이는 현상은 다음과 같은 원인에 의합니다.

*  js파일을 include하면 OnloadCompleted를 체크하는 로직에서 한번 더 쓰레드를 돌려 js파일을 
   모두 다운받아 처리한 후 OnloadCompleted 매커니즘을 완료하게 됩니다.
    (부모는 자식이 모두 끝나야만 OnloadCompleted가 발생되는 매커니즘)

*  한편 alert라는 함수는 MFC 내부적으로 메시지큐에 메시지를 전달하는 방식이며 큐에 담긴 메시지는 자기순서가 되어서야 메시지 박스로 표시가 되게 되고 확인버튼이 눌려져야만 그 다음  명령으로 진행하게 됩니다.

*  따라서 자식 폼에(div) js파일이 포함된 경우 OnloadCompleted를 체크하기 위해 한번 더 쓰레드가 생성되어 진행되고 js파일 처리를 마치면 그때 OnloadCompleted 스크립트가 처리됩니다.  이때 스크립트 내부에 alert 함수가  있는 부분까지 스크립트가 수행되고  alert가 메시지큐에 담긴 후 처리(확인버튼)를 대기하고 있는 상태가 됩니다.  이런식으로 자식들 OnloadCompleted 는 모두 진행이 되며 마지막으로 끝난 자식 OnloadCompleted가 되어서야 위의 메시지큐에 담긴 alert 메시지가 하나 하나 꺼내지면서 확인 버튼 눌러지면 나머지 스크립트가 진행되는 방식으로 모든 OnloadCompleted는 마쳐지게 됩니다.
2)번의 내용을 종합해보면 다음과 같은 주의점이 유추됩니다.
자식폼 OnloadCompleted 내부에서 alert함수를 사용하게 되면 alert 이후의 스크립트 들은 js 파일이 모두 include된 시점에 따라 수행시점이 달라질 수 있으니 순서를 지켜야 하는 작업일 경우 alert함수는 피해야 합니다.
이후의 trace는 부모와 자식이 서로 순서가 섞이게 됩니다.
폼의 Div에 연결된 폼에 include파일이 있는 경우 onload에서 띄우는 alert의 뜨는 순서가 이상함

2.4.5부모창에서 Dialog, Open을 이용하여 팝업창 띄우기

부모창에서 Dialog 또는 Open을 이용하여 팝업창을 띄울 수 있습니다.
//사용예
function Button0_OnClick(obj)   //버튼 클릭시 팝업
{  
      Dialog("DefApp::Dialog_pop.xml","", 710,930,"title=true border=true Resize=true");
      Open("DefApp::Dialog_pop.xml","", 710,930,"title=true border=true Resize=true");
}
Dialog 또는 Open 팝업창을 띄우는 방법

2.4.6부모창에서 팝업창으로 파라메터 전달

부모창에서 Dialog 또는 Open을 이용하여 팝업창을 띄울 때 부모창에서 팝업창으로 파라메터 전달이 가능합니다.
//사용예)  부모창
//Dialog(strURL,strInArgument,nWidth,nHeight,strOpenStyle,nLeft,nTop)의 두번째 파라메터인 strInArgument를 이용하는 방법입니다.

function Button0_OnClick(obj)
{
    Var a ="테스트1";
    Var b ="테스트2";
    Var c ="테스트3";
    var args ="";
    args += "para1=" + a;
    args += " para2=" + b;    //para2 앞에 공백 있어야 합니다.
    args += " para3=" + c;    //para3 앞에 공백 있어야 합니다.
    Dialog("DefApp::Dialog_pop.xml",args, 710,930,"title=true border=true Resize=true ",-1,-1);
}
//부모창의 edit0.text 값, edit1.text값, edit2.text 값을 args 라는 변수에 담습니다.
//팝업창
var para1="";
var para2="";
var para3="";
function form_OnLoadCompleted(obj)
{
    trace(para1);   //테스트1
    trace(para2);   //테스트2
    trace(para3);   //테스트3
}

팝업창에서 전역변수로 선언 하면 부모창에서 보낸 값이 저장됩니다.

부모창에서 팝업창으로 변수전달방법

2.4.7부모창에서 팝업창으로 데이터셋 또는 컴포넌트 값 전달

부모창의 Dataset을 팝업창에서 이용가능합니다. 굳이 파라메터로 보낼 필요 없이, 팝업창에서(자식창)에서 부모창의 Dataset 뿐만 아니라 부모창의 컴포넌트의 값도 이용가능합니다.
부모창에 Dataset0 이라는 데이터셋이 있을경우 
팝업창에서 Parent.Dataset0;
부모창에 Edit0 이라는 에디트 컴포넌트가 있을경우
팝업창에서 parent.Edit0.value 으로 접근 가능하며, 부모창의 모든 데이터셋, component 값을 이용할 수 있습니다.
부모창에서 팝업창으로 부모창의 데이터셋을 보낼수 있나요?

2.4.8팝업창 style

부모창에서 팝업창을 열 때 팝업창의 스타일을 지정 할 수 있습니다.
타이틀바를 없앨수 있고, border를 없앨수도 있으며, 상태표시줄 및 resize 속성도  줄 수 있습니다.
스타일속성은 도움말에 open, dialog로 검색시 더 많은정보가 있습니다.
Dialog("DefApp::Dialog_pop.xml",args, 710,930,"titlebar=false border=false Resize=false",-1,-1);
 
//,"titlebar=false border=false Resize=false”  속성값 주면 아래 화면처럼 팝업이 띄워집니다.

그림 2-1020120501_151238395_form_1

팝업창의 타이틀바를 없앨수 있나요?

2.4.9자식창 폼 Handle을 이용한 DataSet 참조방법

GetFormFromHandle() 메세드를 이용하여 자식창의 Dataset 를 사용

자식창 오픈 시 아래와 같이 오픈

예) hHan = Open("CS_TEST::Parameter_Dialog_pop.xml","", 710,930,"title=true border=true Resize=true strInArgument",-1,-1);

GetFormFromHandle(hHan).ds_popup.saveXML() 와 같이 DataSet 이용

사용예)
function Button1_OnClick(obj)
{
    var getDataPop = GetFormFromHandle(hHan).ds_popup.saveXML();
    trace(getDataPop);
}
function Button2_OnClick(obj)
{
    hHan = Open("CS_TEST::Parameter_Dialog_pop.xml","", 710,930,"title=true border=true Resize=true strInArgument",-1,-1);
}

2.5Calendar

2.5.1달력(Calendar) 표현 방법

달력의 표현은 Language에 설정에 따라 한/영 또는 각 나라별 포멧으로 표현이 됩니다. 
Language의 참조 순서는 다음과 같습니다.
순서 1) 해당 폼의 AppGroup Language설정

그림 2-1120120430_161117420_calendar_1

순서2) Global의 Language 설정

그림 2-1220120430_161133832_calendar_2

AppGroup에 language가 설정되어 있는 경우에는 상위 설정값을 참조하지 않고 AppGroup에 있는 값을 사용합니다.
즉 최상위 ProjectManager의 Language를 사용하려면 AppGroup의 설정을 지워야 합니다.
Calendar를 특정화면에서만 영문으로 사용하고 나머지는 한글로 사용하는 방법

2.5.2사용자 PC에 따라 Calendar표현이 상이한 경우 해결방법

Calendar 컴포넌트를 이용하여 개발 후 실 운영환경에서 사용자에 따라 Calendar표현이 다르게 표현되는  현상을 발견할 수 있습니다.

원인

Calendar 컴포넌트의 DateFormat을 지정하지 않은 경우 
즉 디폴트 포멧 “SHORTDATE”을 사용하여 발생하는 문제입니다. 
해당 포멧은 사용자 환경의 국가별 환경설정값을 이용하여 표현을 하게 되는데 국가별 또는 사용자별 사용옵션이 달라 발생하게 됩니다.

그림 2-1320120430_161655317_calendar_3

해결방법

Calendar 컴포넌트의 Date표현 방법을 하나로 통일하기 위해서는 DateFormat를 지정하면 됩니다. 
예) yyyy-MM-dd   : 이 경우 사용자 환경의 날짜 포멧이 변경이 되어도 “yyyy-MM-dd”로 사용이 가능합니다

그림 2-1420120430_161811569_calendar_4

사용자 PC환경에 따라 Calendar표현이 상이한 경우

2.6TextArea

2.6.1TextArea에서 null 데이터 입력되는 오류

MiPlatform 컴포넌트중 TextArea에서 Space Bar(공백)을 3개 이상 입력시 null로 변경되는 문제에 대해 알아보고 해결방법을 기술합니다.

증상

TextArea에서 Space 3개가 연달어 입력시 null로 변경되는 문제가 있습니다
즉(데이터 입력 후 조회시 TextArea입력한 부분이 화면에 표현이 되지 않음)

원인

현재 space 3개가 연달어 들어가는 경우 db저장시 null로 처리가 되어 문제가 발생합니다.
(해당 사항은 MiPlatform을 사용하는 전체 환경에서 발생하는 것이 아닌 일버 JDK버전과 WAS환경에 따라 발생하는 사항으로 MiPlatform 제품과는 무관한 사항이나 해결방법은 아래를 참고하세요.)

해결방법

서버작업내용

현재 space 3개가 연달어 들어가는 경우 db저장시 null로 처리가 되어 문제가 발생합니다.
서버에서 Select시 null처리를 한 수 데이타를 보여줘야 합니다. 
서버작업 사항  //이 부분은 이미 null로 들어간 데이타를 사용해야 함으로 
null을 space로 변경하는 작업을 해야 합니다.
String str = "abc\0def";
for (int i = 0; i < str.length(); i++) 
{ 
    in_var2 = in_var2 + "===" + Integer.toHexString(str.charAt( i )); 
}

마이플랫폼 작업내용

아래 부분은 마이플랫폼에서 서버로 데이타를 보낼때 변경사항입니다.  
(아래 부분을 설정을 해 주어야 스페이스가 null로 변경되지 않습니다.)

이부분 처럼 CompressMethod부분과, XmlFormat부분 , Compress부분을 추가하세요.
<protocol Compress="True" CompressMethod="ZLIB" id="http" name="cyHttpAdp" Version="1000" XmlFormat="False"/>

위의 내용은 모든 서버에서 발생하는 것이 아니며, 특정 환경에서만 발생합니다. 
프로젝트 운영시에는 http 통신설정을 아래처럼 사용할 것을 권장합니다.
<protocol Compress="True" CompressMethod="ZLIB" id="http" name="cyHttpAdp" Version="1000" XmlFormat="False"/>
TextArea에서 특정값이 들어가는 경우 데이터가 조회되지 않습니다.
데이터 조회시 일부 컬럼은 보이나 특정컬럼부터는 값이 표현되지 않습니다.

2.7Excel

2.7.1엑셀(excel) 사양 및 출력제한

마이플랫폼에서 그리드의 내용과 DataSet등의 내용을 엑셀로 출력할 수 있습니다. 
이때 엑셀버전에 따른 제약사항을 위주로 기술합니다
표 2-5엑셀버전

버전

출력가능 건수

비고

2007이전

65,563 건, 256열 가능


2007이상

13만건, 256열 가능


참고사항

Excel 사용시 그리드에서 또는 데이타셋에서 ExportExcel시 65,536건 이상 저장되지 않습니다.
Excel에서는 아래처럼 사양 및 제한을 두고 있습니다.
2007버전에서는 13만건 까지 처리됩니다.

 
[ Excel 사양 및 제한 ]
열 수 있는 통합 문서 개수 사용 가능한 메모리와 시스템 리소스에 의해 제한됨
워크시트 크기 65,536행/256열
열 너비 255자
행 높이 409포인트
페이지 나누기 가로/세로 1000개
셀 내용의 길이(텍스트) 32,767자. 셀에는 1,024자만 표시되며 수식 입력줄에는 32,767자가 모두 표시됩니다.
통합 문서의 시트 수 사용 가능한 메모리에 의해 제한됨(기본값은 3개)
통합 문서의 색 56가지 통합 문서의 셀 스타일 4,000 통합 문서에서 이름이 지정된 보기
(보기: 이름을 지정하고 통합 문서에 적용할 수 있는 화면 표시 및 인쇄 설정 집합입니다. 통합 문서의 복사본을 별도로 저장하지 않고도 동일한 통합 문서의 보기를 여러 개 만들 수 있습니다.) 사용 가능한 메모리에 의해 제한됨
사용자 지정 숫자 서식 설치된 Excel 언어 버전에 따라 200~250개
통합 문서의 이름 수 사용 가능한 메모리에 의해 제한됨
통합 문서의 창 개수 시스템 리소스에 의해 제한됨
창의 틀 개수 4
연결된 시트 개수 사용 가능한 메모리에 의해 제한됨
시나리오 (시나리오: 워크시트 모델에서 대체할 수 있는 명명된 입력 값 집합입니다.) 사용 가능한 메모리에 의해 제한됨(요약 보고서에는 처음 251개의 시나리오만 표시)
시나리오의 값을 바꿀 셀 개수 32
해 찾기의 값을 바꿀 셀 개수 200
사용자 지정 함수 개수 사용 가능한 메모리에 의해 제한됨
범위 확대/축소 10% - 400%
보고서 개수 사용 가능한 메모리에 의해 제한됨
정렬 참조 개수 단일 정렬에서는 3개, 연속되는 정렬에서는 제한 없음
실행 취소 수준 개수 16
데이터 폼의 필드 개수 32
통합 문서의 사용자 지정 도구 모음 개수 사용 가능한 메모리에 의해 제한됨
사용자 지정 도구 모음 단추 개수 사용 가능한 메모리에 의해 제한됨
65,536행/256열
엑셀(Excel)의 제약사항에 대해서는 마이플랫폼에서 제어할 수 없습니다.
Excel 사양 및 제한

2.7.2ExportObject(엘셀출력) 관련

마이플랫폼 그리드 또는 DataSet정보를 엘셀로 출력하는 방법과, 자주 묻는 내용을 위주로 기술합니다.
(기본적으로 제공되는 ExportExcelEx, ExportExcel과는 별도의 기능입니다.)

ExportObject 기능

Export Object는 사용자가 스크립트 상에서 Export와 관련된 기능을 제어합니다. 현재 Export Object가 할 수 있는 대상은 Excel로 한정되어있습니다.

ExportObject 사용시 Excel를 실행하지 않고 파일로 생성하는 방법

Export Object는 기본적으로 Excel를 실행하여 Export 해주는 방법이나, Excel를 실행하지 않고 파일로 저장하고자 하는 경우 아래와 같은 작업을 통해 제어가 가능합니다.
ExportObject1 = CreateExportObject();
ExportObject1.ExportType  = "Excel";
ExportObject1.ExportFileName = "c:\\TestExport2.xls";
ExportObject1.ActiveSheetName   = "test";
ExportObject1.MakeEmptyFileWhenNotExist = true;   
ExportObject1.AddExportGrid("test1" + "!" + "C15", Grid0, true, false);
ExportObject1.AddExportGrid("test2" + "!" + "C10", Grid0, true, true);
ExportObject1.AddExportGrid("test2" + "!" + "C20", Grid0, false, false);
ExportObject1.AddExportGrid("test2" + "!" + "C30", Grid0, false, true);
ExportObject1.Export(false, false); // 첫번째 progress, 두번째 excel
ExportObject1.Save();  // <---------  이 부분 추가해주세요 .
ExportObject1.CloseWorkbook(); // <---------  이 부분 추가해주세요  
ExportObject1.Close();
ExportObject1 = null;
ExportObject 기능은 기존데이타가 있을 경우 삭제 후 출력되지 않고 추가되는 방식입니다.
(즉 10건의 데이터 출력 후 다음 작업이 5건을 출력하는 경우 5건은 나중에 보낸정보가 변경이 되나, 나머지 5건이 기존 데이터가 보여집니다.)
ExportObject를 사용시 엘셀을 실행하지 않고 파일로 저장하는 방법이 가능한가요?

2.7.3엑셀 sheet의 자리수 제한으로 export 시 주의점

엑셀 sheet의 자릿 수 제한으로 export 시 마이플랫폼에서 sheet의 자리 수를 고려하지 않으면 정상 출력되지 않고 프로세스에 excel 프로세스가 남아있는 경우가 있습니다.
 
이러한 경우 개발 시 엑셀사양에 대한 확인이 필요하겠습니다.
excel 2007인 경우 sheet의 최대자리수가 31자입니다.
32자를 스크립트에서 넣어 처리할 경우 위와 같은 문제가 발생하게 됩니다.
엑셀 출력 시 프로세스가 남아있습니다.

2.7.4사용자 계정 컨트롤을 가장 높음으로 설정 시 엑셀이 C드라이브에 생성 안됨

확인방법

c:\에 기존에 작성된 엑셀파일을 다른 이름으로 저장하면 관리자 권한이 필요하다는 경고창이 나옵니다.

사용자 계정컨트롤을 낮게 설정하면 정상적으로 엑셀파일이 생성됩니다.

그림 2-1520120628_142354804_pc_control

Win7에서 엑셀 출력이 안됩니다.

2.7.5엑셀Export

그리드를 엑셀로 Export시 참고사항을 위주로 정리하였습니다.

ExportExcelEx 사용

예)
Grid0.ExportExcelEx("test","A1",false,true,true,true);
test - worksheet명
A1-  Export 될때 Excel의 시작위치

SaveExcelEx 사용

예)
FileDialog.Type = "SAVE";
FileDialog.FileName = "sample.xls";
FileDialog.Filter = "Excel 97 - 2003 통합문서 (*.xls)|*.xls|Excel 통합문서 (*.xlsx)|*.xlsx";
if (!FileDialog.open()){            //파일다이얼로그 이용
    return;
}
strFileName = FileDialog.FilePath + "\\" + FileDialog.FileName;
Grid0.SaveExcelEx( strFileName,"sheet1");

CreateExportObject 사용

var ExpObj;
FileDialog0.Type = "SAVE";
FileDialog0.FileName = "sample.xlsx";
FileDialog0.Filter = "Excel 97 - 2003 통합문서 (*.xls)|*.xls|Excel 통합문서 (*.xlsx)|*.xlsx";
if (!FileDialog0.open()){
    return;
}
var strFileName = FileDialog0.FilePath + "\\" + FileDialog0.FileName;
ExpObj  = CreateExportObject(); // ExportObject를 생성합니다.
ExpObj.ExportType       = "Excel";       // 현재 Excel만 가능합니다.
ExpObj.ExportFileName   = strFileName;
ExpObj.ActiveSheetName  = "sheet1";      
// Active Sheet지정ExpObj.MakeEmptyFileWhenNotExist = true;                  
// File이 없으면 새로 생성
/*그리드를 시트의 몇번째부터 내릴지 지정*/                 
ExpObj.AddExportGrid("sheet1!A5", grid_export, true, false );      
ExpObj.AddExportGrid("sheet1!G5", Grid1, true, false );    
ExpObj.AddExportGrid("sheet1!C3", Grid0, false, false );   
ExpObj.AddExportGrid("sheet2!C3", Grid1, true, false );   
ExpObj.Export(true, true);
// 첫번째 파라메터는 progress유무, 두번째 excel export 된 엑셀창을 띄울지 안띄울지
//ExpObj.Save();  // Excel을 저장 
//ExpObj.CloseWorkbook();  
빨간부분 위아래 주석을 풀고, Exoprt의 두번째 파라메터를 false로 하면 export된 엑셀창이 뜨지 않고 저장만 됩니다.
ExpObj.Close();        // Excel을 내부적으로 Close
ExpObj = null;

대용량파일 Export (데이터 누락이 발생되는 경우)

예)
var str_FileName;
function btn_Excel_OnClick(obj)
{
    if (fdg_excel.Open()) {
        FileName = fdg_excel.FilePath + "\\" + fdg_excel.FileName;
        var file = split(fdg_excel.FileName, ".");
        var filepath = fdg_excel.FilePath +"\\";
        if(G_isNull(file[1])) {
            file[1] += ".bin"; //확장자를 임의로 변경하여 저장합니다. 
        } else {
            file[0] += ".";
        }
        str_FileName = filepath+file[0] + file[1];
        grd_ChangeListChild.SaveExcel(str_FileName, "sheet1");
        setTimer(1,1000); //임의변경한 확장자를 다시 엑셀포맷으로 변경합니다.
  }                
}
function G_isNull(as_source)
{
    if (length(toString(as_source)) == 0 || as_source == null) {
        return true;
    } else {
        return false;
    }
}
saveExcelEx 이용하여 저장 시 경로를 선택하여 저장할 수 있나요?
엑셀 Export 시 여러 그리드를 하나의 엑셀 시트에 함께 export 할수 있나요?
엑셀 Export 시에 여러 그리드를 여러 시트에 나누어 export 할 수 있나요?
CreateExportObject이용하여 엑셀 Export 시 엑셀이 열리지 않고 바로 파일로 저장이 가능한가요?
데이터가 많은 그리드(대용량) Export 시 빈 컬럼으로 나오는 현상이 발생합니다 .데이터 누락되는 현상이 발생합니다

2.7.6그리드를 export시 엑셀이 실행 되지 않는 경우

그림 2-1620081218152125_excel_sheet

해당 내용은 MiPlatform, XPLATFORM 모두 동일하게 적용됩니다
특정 화면에서 엑셀출력이 안됩니다.

2.8Applet

Miplatform 330 버전에서 AppletCtrl.dll과 CyAppletStub.jar가 추가되었습니다. 
Miplatform에서 Java Applet을 사용하기 위한 Components 입니다.

2.8.1자바애플릿 사용

폼에서 AppletCtrl.dll과 CyAppletStub.jar를 사용하기 위해 project manager에서 컴퍼넌트를 추가해주어야 합니다. 추가 방법은 다음과 같습니다.

그림 2-1720120618_104119584_appl_1

그림 2-1820120618_104156070_appl_2

그림 2-1920120618_104254276_appl_3

그림 2-2020120618_104332335_appl_4

그림 2-2120120618_104427073_appl_5

그림 2-2220120618_104521807_app_6

2.8.2자바애플릿 컴퍼넌트 배포

예)
버전정보 확인
Manifest-Version: 1.0
Created-By: 1.5.0_20 (Sun Microsystems Inc.)
배포시 작성방법
<record><FILENAME>CyAppletStub.jar</FILENAME><VERSION>system::1.5.0_20</VERSION></record>
CyAppletStub.jar 무슨 역활은 하는 파일인지?
CyAppletStub.jar 파일은 버젼정보에 어떤 정보를 넣어야 하나요?
마이플랫폼에 Applet이나, swing을 붙일 수 있나요?

2.9TreeView

2.9.1트리뷰에서 텍스트변경

그림 2-2320120618_143316738_treeview_3

function Button0_OnClick(obj)
{
    Treeview0.Redraw = false;
    Dataset0.SetColumn(Dataset0.currow,"name",Edit1.Text);
    Treeview0.Redraw = true;      
}
<?xml version="1.0" encoding="utf-8"?>
<Window>
    <Form Height="543" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="800" WorkArea="true">
    <Datasets>
        <Dataset DataSetType="Dataset" Id="Dataset0">
        <Contents>
             <colinfo id="level" size="256" summ="default" type="STRING"/>
             <colinfo id="name" size="256" summ="default" type="STRING"/>
             <record>
                 <level>0</level>
                 <name>가</name>
             </record>
             <record>
                 <level>1</level>
                 <name>가가</name>
             </record>
             <record>
                 <level>2</level>
                 <name>가가1</name>
             </record>
             <record>
                 <level>2</level>
                 <name>가가2</name>
             </record>
             <record>
                  <level>2</level>
                  <name>가가3</name>
             </record>
             <record>
                  <level>1</level>
                  <name>나나</name>
             </record>
             <record>
                  <level>2</level>
                  <name>나나1</name>
              </record>
              <record>
                   <level>2</level>
                   <name>나나2</name>
              </record>
              <record>
                    <level>2</level>
                    <name>나나3</name>
              </record>
              <record>
                    <level>2</level>
                    <name>나나4</name>
              </record>
          </Contents>
        </Dataset>
    </Datasets>
    <TreeView BindDataset="Dataset0" Height="203" Id="TreeView0" Left="32" LevelColumn="level" TabOrder="1" TEXTColumn="name" Top="24" Width="195"></TreeView>
    <Edit Height="25" Id="Edit1" Left="240" TabOrder="2" Top="48" Width="99"></Edit>
    <Button Height="30" Id="Button0" Left="360" OnClick="Button0_OnClick" TabOrder="3" Text="변경" Top="45" Width="56"></Button>
    <Static Height="20" Id="Static1" Left="240" TabOrder="4" Text="text" Top="32" Width="59"></Static>
</Form>
<Script><![CDATA[
function Button0_OnClick(obj)
{
    Treeview0.Redraw = false;
    Dataset0.SetColumn(Dataset0.currow,"name",Edit1.Text);
    Treeview0.Redraw = true;      
}
]]></Script>
</Window>

2.9.2TreeView에서 선택한 row color변경

그림 2-2420120618_142930806_treeview_2

function TreeView0_OnClick(obj,nOldRow,nNewRow)
{
   for(var i =0;i<nNewRow; i++)
   {
      ds_bind.SetColumn(i,"color","");
   }
   ds_bind.SetColumn(nNewRow,"color","#ff0000");
   for(var i = nNewRow+1;i<ds_bind.GetRowCount(); i++)
   {
      ds_bind.SetColumn(i,"color","");
   }  
}
<?xml version="1.0" encoding="utf-8"?>
<Window>
    <Form Height="543" Id="form" Left="8" PidAttrib="7" Title="New&#32;Form" Top="8" Ver="1.0" Width="800" WorkArea="true">
    <Datasets>
        <Dataset DataSetType="Dataset" Id="Dataset0"></Dataset>
        <Dataset Auto="false" DataSetType="Dataset" Id="ds_bind">
        <Contents>
              <colinfo id="level" size="255" summ="default" type="STRING"/>
              <colinfo id="text" size="255" summ="default" type="STRING"/>
              <colinfo id="color" size="256" summ="default" type="STRING"/>
              <record>
                    <color></color>
                    <level>0</level>
                    <text>aa</text>
              </record>
              <record>
                    <color></color>
                    <level>1</level>
                    <text>aa_11</text>
              </record>
              <record>
                    <color></color>
                    <level>2</level>
                    <text>aa_12</text>
              </record>
              <record>
                    <color></color>
                    <level>0</level>
                    <text>bb</text>
              </record>
                    <record>
                    <color></color>
                    <level>0</level>
                    <text>cc</text>
              </record>
              <record>
                    <color></color>
                    <level>1</level>
                    <text>cc_11</text>
              </record>
        </Contents>
        </Dataset>
    </Datasets>
    <TreeView BindDataset="ds_bind" ColorColumn="color" HasButtons="FALSE" Height="216" Id="TreeView0" Left="24" LevelColumn="level" OnClick="TreeView0_OnClick" TabOrder="1" TEXTColumn="text" Top="16" Width="168"></TreeView>
    <Grid BindDataset="ds_bind" BkColor2="default" BoldHead="true" Bottom="223" Enable="true" EndLineColor="default" Height="167" Id="Grid0" InputPanel="FALSE" Left="224" LineColor="default" Right="534" TabOrder="2" TabStop="true" Top="56" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="310">
        <contents>
             <columns>
                 <col width="80"/>
                 <col width="80"/>
                 <col width="80"/>
             </columns>
             <head>
                  <cell col="0" display="text" text="level"/>
                  <cell col="1" display="text" text="text"/>
                  <cell col="2" display="text" text="color"/>
             </head>
             <body>
                  <cell col="0" colid="level" display="text"/>
                  <cell col="1" colid="text" display="text"/>
                  <cell col="2" colid="color" display="text"/>
             </body>
         </contents>
    </Grid>
    <Static Height="84" Id="Static0" Left="439" TabOrder="3" Text="colorColumn&#32;&#32;:&#32;color&#13;&#10;levelColumn&#32;:&#32;level&#13;&#10;textColumn&#32;:text" Top="284" Width="226"></Static>
    <Button Height="41" Id="Button0" Left="454" OnClick="Button0_OnClick" TabOrder="4" Text="Button0" Top="376" Width="110"></Button>
    <Static Height="26" Id="Static1" Left="232" TabOrder="5" Text="원본데이타" Top="24" Width="112"></Static>
</Form>
<Script><![CDATA[
function TreeView0_OnClick(obj,nOldRow,nNewRow)
{
   for(var i =0;i<nNewRow; i++)
   {
      ds_bind.SetColumn(i,"color","");
   }
   ds_bind.SetColumn(nNewRow,"color","#ff0000");
   for(var i = nNewRow+1;i<ds_bind.GetRowCount(); i++)
   {
      ds_bind.SetColumn(i,"color","");
   }
}
function Button0_OnClick(obj)
{
    TreeView0_OnClick();
}
]]></Script>
</Window>
TreeView의 Label컬러를 변경할 수 있나요?

2.9.3상위레벨클릭시 하위레벨까지 함께 선택되어지는 방법

그림 2-2520120618_142601784_treeview_1

<?xml version="1.0" encoding="utf-8"?>
<Window>
  <Form Height="768" Id="TreeViewTest" Left="8" PidAttrib="7" Title="TreeViewTest" ToolTipFont="Default,0" Top="8" Ver="1.0" Width="1024" WorkArea="true">
   <Datasets>
           <Dataset DataSetType="Dataset" Id="Dataset0" OnColumnChanged="Dataset0_OnColumnChanged">
                  <Contents>
                          <colinfo id="level" size="2" summ="default" type="INT"/>
                          <colinfo id="name" size="256" summ="default" type="STRING"/>
                          <colinfo id="code" size="256" summ="default" type="STRING"/>
                          <colinfo id="__chk" size="1" summ="default" type="INT"/>
                          <colinfo id="p_code" size="256" summ="default" type="STRING"/>
                          <record>
                                 <__chk/>
                                 <code>ab</code>
                                 <level>1</level>
                                 <name>ab</name>
                                 <p_code>1</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>abc</code>
                                 <level>2</level>
                                 <name>abc</name>
                                 <p_code>1</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>abcd</code>
                                 <level>3</level>
                                 <name>abcd</name>
                                 <p_code>1</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>abcde</code>
                                 <level>4</level>
                                 <name>abcde</name>
                                 <p_code>1</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>abcdef</code>
                                 <level>5</level>
                                 <name>abcdef</name>
                                 <p_code>1</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>ba</code>
                                 <level>1</level>
                                 <name>ba</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code>cba</code>
                                 <level>2</level>
                                 <name>cba</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>3</level>
                                 <name>뮤직</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>lb무직</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>ab</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abc</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abcd</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abcdef</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>ag</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>aef</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abe</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abef</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>3</level>
                                 <name>뮤직2</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>lb무직</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>ab</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abc</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                 <level>4</level>
                                 <name>abcd</name>
                                 <p_code>2</p_code>
                          </record>
                          <record>
                                 <__chk/>
                                 <code></code>
                                  <level>4</level>
                                 <name>abcdef</name>
                                 <p_code>2</p_code>
                          </record>
                  </Contents>
           </Dataset>
         </Datasets>
         <TreeView BindDataset="Dataset0" Border="None" CheckColumn="__chk" CollapseImageIndex="2" ExpandImageIndex="2" Height="480" Id="tv_tab" ImageID="i_treefolder" InnerImageCount="3" Left="16" LevelColumn="LEVEL" Style="Tree_text" TabOrder="1" TEXTColumn="name" Top="16" UseCheckBox="TRUE" Width="416"></TreeView>
         <Grid BindDataset="Dataset0" BkColor2="default" BoldHead="true" Bottom="504" ColSizing="TRUE" Editable="TRUE" Enable="true" EndLineColor="default" Height="448" Id="Grid0" InputPanel="FALSE" Left="456" LineColor="default" Right="704" TabOrder="2" TabStop="true" Top="56" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="248">
                 <contents>
                        <format id="Default">
                                <columns>
                                       <col fix="left" width="80"/>
                                       <col fix="left" width="80"/>
                                       <col width="80"/>
                                </columns>
                                <head>
                                       <cell col="0" display="text" text="level"/>
                                       <cell col="1" display="text" text="name"/>
                                       <cell col="2" display="text" text="__chk"/>
                                </head>
                                <body>
                                       <cell col="0" colid="level" display="text"/>
                                       <cell col="1" colid="name" display="text"/>
                                       <cell col="2" colid="__chk" display="checkbox" edit="checkbox"/>
                                </body>
                        </format>
                 </contents>
         </Grid>
         <Static Height="16" Id="Static0" Left="456" TabOrder="3" Text="원본그리드" Top="32" Width="96"></Static>
  </Form>
  <Script><![CDATA[
function Dataset0_OnColumnChanged(obj,nRow,strColumnID,varOldValue,varNewValue)
{

var strLevel = DataSet0.getColumn(nRow,"level");
trace("strLevel=="+strLevel);
var strChk = DataSet0.getColumn(nRow,"__Chk");
trace("strChk=="+strChk);
  Dataset0.FireEvent  = false;
  for(var i=(nRow+1);i<Dataset0.RowCount();i++)
  {
     trace(Dataset0.getColumn(i ,"level"));
  
         if(toInteger(Dataset0.getColumn(i ,"level")) > toInteger(strLevel))
         {
                 if(toInteger(strChk) == 1)
                 {
                        Dataset0.SetColumn(i,"__Chk", 1);
                 } else {
                        Dataset0.SetColumn(i,"__Chk", 0);
                 }       
         } else {
                 break;
         }              
  }
  Dataset0.FireEvent  = true;
}
]]></Script>
</Window>

2.9.4TreeView 이미지를 변경하는 방법

준비사항

TreeView 이미지로 사용할 이미지를 작성합니다. 
이미지 크기 : 세로 16 pixels 가로 표현하고자 하는 아이콘 갯수 
 * 가로 사이즈는 표현하고자 하는 아이콘갯수 * 16 pixels로 작성이 되어야 합니다. 
실제 아이콘 표현시 TreeView의 속성 InnerImageCount 지정 갯수로 나누어 표현이 됩니다.

이미지 예시

그림 2-2620120703_165556735_tree_icon

TreeView 컴포넌트 이미지 연결

그림 2-2720120703_165645766_tree_view

Image컴포넌트에 Image지정방법

2.10Image

2.10.1Button과 Image사용시 투명처리 방법

Button과 Image의 Transparent에 관한 제약사항입니다

1) Image의 File 직접연결에 대한 Transparent
 - 현재 File을 직접 연결하는 Image의 Transparent는 File Format에서 직접 Transparent를  지원하는 GIF 파일에서만 기능이 작동됩니다
 - BMP, JPG 파일은 Transparent를 지원하지 않으며, BMP는 Resource에 삽입하여야 Transparent가 지원됩니다.
 2) Transparent 속성이 주어진 Image/Button의 혼합사용시
 - 투명한 Image 배경위에 투명한 Button이나 Image를 올려 사용할때에는 배경이 되는 Image를 Static=TRUE로 사용해야 합니다.
 - Static=FALSE 이며 Transparent=TRUE 인 Image가 다른 Transparent=TRUE인 Imaeg나 Button  아래에 놓일경우 정상적으로 출력되지 않습니다.

참고사항

Image0.Redraw = false;
Image0.Redraw = true;
이런식으로 해주시면 이미지를 다시 덧그리게 되어 깔려진 콘트를위에 다시 투명 이미지가 그려집니다.
Button에서 투명처리를 할 수 있나요?
이미지 투명처리 방법

2.10.2Button과 Image사용시 투명처리 방법

Static 속성

마이플랫폼의 Image속성 중 Static을 False로 설정하면 이벤트가 정상동작합니다. 
 (디폴트 속성은 true로 되어 있어 이벤트가 동작하지 않습니다.)
또한 Cursor 속성값의 경우에도 False인 경우에는 적용되지 않습니다.

Transparent 속성

투명 이미지를 설정 후 transparent속성을 true로 설정해 주어야 합니다

참고사항

이미지 컴포넌트의 이벤트가 발생하지 않습니다.
속성 Cursor 설정이 적용되지 않습니다.

2.10.3이미지를 비율로 표현하는 방법

현재 마이플랫폼의 이미지 컴포넌트는 이미지 사이트에 맞추어서 크기가 결정이 됩니다.

또한 속성중에 FillType을 STRETCH를 사용할 경우 이미지가 작아도 해당 이미지 컴포넌트에 맞도록 자동으로 사이즈가 변경이 되지만 이 기능은 비율로 맞추어 주는 것이아니가 강제로 가로 세로가 정해진  임의의 사이즈 입니다. 

즉 요청하신 기능은 마이플랫폼에서 제공하는 이미지로는 구현이 어려우며 웹브라우저 컴포넌트(MSIE)를 이용하려 만들 수 있습니다.

MSIE(웹브라우저) 컴포넌트를 이용한 표현방법

<?xml version="1.0" encoding="utf-8"?>
<Window>
 <Form Height="543" Id="html_Viewer" Left="8" OnLoadCompleted="html_Viewer_OnLoadCompleted" PidAttrib="7" Title="html_Viewer" Top="8" Ver="1.0" Width="800" WorkArea="true">
           <Datasets>
                      <Dataset Auto="false" DataSetType="Dataset" Id="dsMain">
                                <Contents>
                                           <colinfo id="name" size="256" summ="default" type="STRING"/>
                                           <colinfo id="content" size="256" summ="default" type="STRING"/>
                                           <record>
                                                      <content>http://blogthumb2.naver.net/data44/2008/12/28/67/a4b7_sinimint_my_ej.jpg?type=r2</content>
                                                      <name>싸이월드메인</name>
                                           </record>
                                           <record>
                                                      <content>http://blogthumb2.naver.net/data44/2008/12/14/19/17_llllllean.jpg?type=r2</content>
                                                      <name>도마</name>
                                           </record>
                                           <record>
                                                      <content>http://cafethumb2.naver.net/data38/2008/12/19/275/%BB%E7%C1%F8_347_apdlemqhdl.jpg?type=r2</content>
                                                      <name>감성사진</name>
                                           </record>
                                </Contents>
                      </Dataset>
           </Datasets>
           <Grid BindDataset="dsMain" BoldHead="true" Bottom="230" Enable="true" EndLineColor="default" Height="182" Id="Grid0" InputPanel="FALSE" Left="8" LineColor="default" OnCellDBLClick="Grid0_OnCellDblClick" Right="327" TabOrder="1" TabStop="true" Top="48" UseDBuff="true" UsePopupMenu="true" UseSelColor="true" Visible="true" VLineColor="default" WheelScrollRow="1" Width="319">
                      <contents>
                                <format id="Default">
                                           <columns>
                                                      <col width="147"/>
                                                      <col width="164"/>
                                           </columns>
                                           <head>
                                                      <cell col="0" display="text" text="name"/>
                                                      <cell col="1" display="text" text="content"/>
                                           </head>
                                           <body>
                                                      <cell col="0" colid="name" display="text"/>
                                                      <cell col="1" colid="content" display="text"/>
                                           </body>
                                </format>
                      </contents>
           </Grid>
           <AxMsie Bottom="438" DocumentComplete="AxMsie0_DocumentComplete" Height="190" Id="AxMsie0" Left="16" Right="417" Top="248" Width="401"></AxMsie>
           <Edit Height="25" Id="Edit0" Left="78" TabOrder="3" Text="100" Top="14" Width="78"></Edit>
           <Button Height="27" Id="Button0" Left="11" TabOrder="4" Text="사진크기" Top="12" Width="57"></Button>
 </Form>
 <Script><![CDATA[
 
 
function html_Viewer_OnLoadCompleted(obj)
{
           AxMsie0.Navigate2("about:blank", ,"_self", "", "");  //반드시 필요
 
}
function Grid0_OnCellDblClick(obj,nRow,nCell,nX,nY,nPivotIndex)
{
 
     AxMsie0.Document.body.innerHTML = '<img src="' +  dsMain.getColumn(nRow,"content") + '" width="' + Edit0.text + '">';   
}
 
function AxMsie0_DocumentComplete(obj,pDisp,URL)
{
     AxMsie0.Document.body.Scroll = "no";    //msie의 속성을 지정하는 scrollbar 
     AxMsie0.Document.body.leftmargin = "0"; //msie의 속성을 지정하는  leftmargin
     AxMsie0.Document.body.topmargin = "0";   //msie의 속성을 지정하는 topmargin
}
]]></Script>
</Window>
이미지 비율로 표현할 수 있나요?

2.10.4Image컴포넌트의 ImageID 지정시 참고사항

Image컴포넌트에 Image지정방법

2.10.5Image(이미지)컴포넌트에 연결된 URL주소 이미지 존재여부 체크

프로그램을 구성하다 보면  서버에 있는 이미지(사진)정보들을 표현할 수 있습니다. 

예를 들어 인사시스템을 구현시 사정정보를 표현할 수 있는데 이때 입력된 정보에 따라 사진이 존재할 경우에는 문제가 되지 않으나 파일이 없을 경우 Image에는 표현이 되지 않고 (Log창오 해당 주소가 오류가 발생합니다.) 
 
이때 사용할 수 있는 샘플을 첨부합니다. 

ImageCheck.jsp 서버에 요청한 파일 존재여부에 따라 파일이 존재할 경우 해당 이미지를 없을 경우 디폴트 이미지를 표현하는 샘플입니다.
<%@ page contentType="application; charset=MS949"%><%@ page language="java" import="java.util.*,java.io.*" %><%
String filename     = "";
String filepath     = "C:\\TEMP\\";
String filegubun    = "";
int intTemp = 0;
try{
    filename    = request.getParameter("filename");
    filepath = filepath + filename;
    File   file = new File(filepath);
    byte b[] = new byte[4096];
    response.setHeader("Content-Disposition", "attachment;filename=" + filename + ";");
             
    if (file.isFile())
    { 
        BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
        int read = 0;
        try {
           while ((read = fin.read(b)) != -1){
             outs.write(b,0,read);
       }
         outs.close();
         fin.close();
       } catch (Exception e) {
       } finally {
         if(outs!=null) outs.close();
         if(fin!=null) fin.close();
       }                        
    } else {
       filepath = "C:\\TEMP\\" + "default.jpg";   //디폴트 이미지를 표현 
       File   file2 = new File(filepath);
       BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file2));
       BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
       int read = 0;
       try {
         while ((read = fin.read(b)) != -1){
             outs.write(b,0,read);
         }
         outs.close();
         fin.close();
        } catch (Exception e) {
        } finally {
         if(outs!=null) outs.close();
         if(fin!=null) fin.close();
        }                        
    }    
}catch (Exception e){
}finally{
}
%>

PID에서 호출시 예

Image0.ImageID = 'http://localhost:8080/MiAPI/ImageCheck.jsp?filename=2011-12-09 23.07.18.jpg';
프로그램을 구성하다 보면 서버에 있는 이미지(사진)정보들을 표현할 수 있습니다.

2.11ExtCommonApi

ExtCommonApi 모듈은 MiPlatform에서 기본제공되지 않는 기능 중 프로젝트에서 
자주 사용되는 기능에 대해 확장컴포넌트 형태로 제공되는 모듈입니다. 
 
해당 내용에 대해서는 별도의 Doc문서를 참고하시고 작성된 기능 중 자주 묻는 기능에 대해서만
정리합니다.
ExtCommonAPI에 대한 최산 파일은
Support->Tip">www.miplatform.co.kr->Support->Tip게시판을 통해 다운로드 및 패치파일이 제공됩니다.
별도의 사용방법에 대해서는 해당 파일제공시 DOC가 함께 배포됩니다.

2.11.1ext_NullToBin

마이플랫폼에서 mscomm컴포넌트를 통해 시리얼통신시 null 데이타 전송이 
입력 된 스트링 데이터를 바이너리로 변환하여 전송이 되지 않기 때문에 
 
ExtCommonAPI에서 제공되는 기능을 사용해야 합니다.
mscomm 시리얼 통신시 chr(10) 즉 null데이타 전송이 되지 않습니다.

2.12VsReport

2.12.1VS Report 에서 특정 PC만 인쇄 미리보기 화면에서 데이터가 정상적으로 나오지 않는 증상

원인

VS Report 의 경우 vbscript.dll 과 urlmon.dll 파일을 사용

해결방법

조치방법은 vbcript.dll 파일을 레지스트리등록 후 확인 시 정상동작하였습니다. 
참고 : OS 정보는 Windows XP
특정 PC에서 VsReport가 데이타 값이 보이지 않고 바인딩한 컬럼정보가 표현됩니다.

2.12.2특정 PC에서 VsRepor 화면 출력이 글자크기가 커지는 경우

원인

VsReport의 경우 폰트사용에 제약이 있습니다.

해별방법

VsReport 개발시 폰트는 정각폰트를 사용하시면 해결이 가능합니다. 
예) 굴림->굴림체, 바탕->바탕체로 변경하시면 됩니다.
특정 PC에서 VsRepor 화면 출력이 글자크기가 커지는 경우가 발생합니다.

2.12.3VsReport에서 컬럼의 길이가 길경우 AutoHeigt기능

VsReport에서 컬럼의 길이가 길경우 AutoHeigt기능을 사용하기 위한 옵션

Band에서 CanGrow를 True로 설정하고
각 컬럼에서는 : Align : 0
                        AnChor : 0번
                       Cangrow : true로 설정하면 됩니다
컬럼의 정보가 긴경우 자동으로 줄바꿈이 가능한가요?

2.133party

2.13.1MiPlatform에서 ActiveX 사용시 주의사항

ActiveX(DHTML) 연결시 Div, TabPage에 url 형태로 페이지 호출시 이벤트가 동작하지 않는 문제

해결방안

function form_OnLoadCompleted(obj)
{
    Div0.Url = "DefApp::form_00.xml";
}

참고사항

일반 DHTML사용 및 데브피아(웹에디터) 사용시 발생할 수 있으므로 작업하는 폼에 Div나 TabPage가 있는 경우 폼의 onLoadComplated에서 연결을 시켜줘야 합니다.
ActiveX(DHTML) 연결시 Div, TabPage에 url형태로 페이지 호출시 이벤트가 동작하지 않는 문제

2.13.2연동가능한 웹에디터

MiPlatform 웹에디터 지원여부

MiPlatform에서는 별도의 웹에디터 기능을 컴포넌트 형태로 지원하지 않습니다.

연동가능한 제품(기술지원팀에서 확인된 제품)

MiPlatform은 ActiveX형태의 웹에디터는 직접연동하여 사용이 가능합니다.
가장 많이 고객사에서 사용하는 제품정보에 대한 정보를 기술합니다.
(확인되지 않는 제품에 대해서도 고객사 별로 사용한 정보는 기술하지 않습니다.) 
 
1) 나모6 (라이센스 관련 매핑작업 필요 : 투비소프트 지원)
2) 나모7 (해당 버전의 경우 고객사별로 사용) 
3) 테크프리 
4) DexWebEditorPro
MiPlatform에 연동하여 사용하는 타사 제품에 대한 기술지원은 하지 않습니다.
MiPlatform과 가장 호환이 잘되는 웹에디터는 뭔가요?

2.13.3MSIE(웹브라우저)

마이플랫폼에서 MSIE 컴포넌트를 이용하여 웹 페이지를 띄울 수 있습니다.

MSIE 컴포넌트 추가방법

MSIE를 이용하기 위해서는 MSIE컴포넌트를 추가하여 이용하여야 합니다

그림 2-2820120629_111626587_msie_1

그림 2-2920120629_111650405_msie_2

그림 2-3020120629_111724402_msie_3

function form_OnLoadCompleted(obj)
{
    var strUrl = "http://www.naver.com";  
    MSIE0.Navigate(strUrl); 
    //MSIE0.Navigate("www.naver.com", "", "_blank"); 
    //세번째 파라메터를 _blank 로 하시면 새창으로 뜹니다.
}

그림 2-3120120629_111755420_msie_4

MSIE 이용하여 html페이지로 값 넘기는 방법

//마이플랫폼 소스
function Button0_OnClick(obj)
{
      var URL = "http://172.10.11.171:8080/tobehye/controll/postdata_test.jsp";
      var Headers = "Content-Type: application/x-www-form-urlencoded";
      var PostData = TextToBin("UserID=한글한글&DataID=TOBE1234&PrcKey=7777");
      MSIE0.Navigate(URL, "", "_self",PostData,Headers); 
}
소스 : postdata_test.jsp
 
<%@ page contentType="text/html;charset=EUC-KR" %>
<%@ page language="java"%>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Enumeration" %>
<%@ page import="java.sql.*" %>
<html>
<head>
</head>
<body>
<%
String UserID = new String( request.getParameter("UserID").getBytes("8859_1"),"EUC-KR");  //한글처리방법
out.println("UserID ==>"+UserID); 
String DataID = request.getParameter("DataID"); 
out.println("DataID ==>"+DataID); 
String PrcKey = request.getParameter("PrcKey"); 
out.println("PrcKey ==>"+PrcKey); 
%>
</body>
</html>

그림 2-3220120629_111837821_msie_5

MSIE 이용하여 html페이지의 함수 호출 및 html 값 전달

//마이플랫폼 소스
 
function form_OnLoadCompleted(obj)
{
    var strUrl = "http://localhost:8080/tobehye/controll/test01.html";  
    //jsp경로 지정해줍니다.
    MSIE0.Navigate(strUrl); 
}
function Button1_OnClick(obj) //  xml 페이지에서  msie에 연결된 html 페이지로 값 전달
{  
   var webForm = MSIE0.Document.forms.namedItem("webform"); // Form을 찾음.
   webForm.elements.namedItem("FxmlURL").value = '값전달';
}
function Button2_OnClick(obj) //xml페이지에서 msie에 연결된 html페이지의 함수 호출
{
      var objDocument = MSIE0.Document;
      var objHtmlElementCollection = objDocument.All();
      var Item0;
      Item0 = objHtmlElementCollection.item("btnok");
      Item0.Click();
}
//HTML 소스
<html>
<script language="javascript">
function aaa()
{
       alert("호출완료");
}
</script>
</head>
<form name="webform">
 <input type="hidden" id="btnok" value="" name='ok' onClick="javascript:aaa();"/>  
<TABLE cellpadding="0" cellspacing="0" border="0" width="100%" height="100%">
<TR>
       <TD>
             <input type="text" value="" size="60" name="FxmlURL"/>
       </TD>
</TR>
</TABLE>
</form>
</html>

MSIE 이용하여 html페이지에서 마이플랫폼으로 값 전달

MSIE를 이용하여 연결된 html 페이지에서 마이플랫폼으로 값을 전달할 수 있습니다.
사용예) MISE의 TitleChange 이벤트를 이용하여 마이플랫폼에서 값을 받을 수 있습니다.
var chk;
function MSIE0_TitleChange(obj,Text)
{
    if( chk != Text ) { 
        trace(">>>>>>" + Text);   //test12345
        chk = Text; 
    }
}
<script language="javascript">
function bbb()
{
       document.title = "test12345";
}
</script>
html페이지에서 넘길값이 여러개일 경우 구분자를 두어 붙여서 넘기시고 마이플랫폼에서 구분자를 기준으로 잘라 사용하시면 되겠습니다.
MSIE 컴포넌트 추가하는방법
MSIE컴포넌트 이용하여 마이플랫폼에서 jsp페이지의 함수 호출방법
MSIE컴포넌트 이용하여 마이플랫폼에서 jsp페이지로 값 전달방법
MSIE컴포넌트 이용하여 jsp페이지에서 마이플랫폼으로 값 전달방법

MSIE(웹브라우저) 사용시 TitleChange 이벤트의 Text에 대한 길이제한

MSIE를 통해서 얻을 수 있는 Title의 길이는 최대 259까지 Text값으로 들어옵니다.
실제 일반 웹브라우저의 경우에는 96자리까지 표현이  되지만  마이플랫폼에서 
MSIE를 통해 페이지를 호출하고 호출된 페이지에서 Title이 변경되는 순간 MSIE의 
TitleChange에 Text값이 들어오는데 이때는 259까지 받을 수 있습니다.
//사용 예)
function AxMsie0_TitleChange(obj,Text)
{
    trace(text + "==" + length(Text));
}
MSIE의 TitleChange이벤트에 값 전달시 길이제한이 있나요?

MSIE(브라우저) 컴포넌트를 이용하여 웹 페이지 표현시 border 없애는 방법

MSIE를 이용하여 웹브라우저를 호출하는 경우 디폴트 화면이 아래와 같이 표현이 됩니다.

그림 2-3320120430_153445073_pid_6

위의 border를 없애는 방법은 MiPlatfom이 호출하는 페이지 즉 html소스에 다음과 같은 옵션이 들어가야 합니다. 
 
1안) <body style="border:0"    ...
2안) <html style="border:0" >
둘 중 한 가지 방법을 선택하시면 됩니다.
MSIE(웹브라우저컴포넌트) 사용시 Border를 없애는 방법?

MSIE를 이용한 사진 표현 샘플

첨부한 샘플에 대한 소스 설명

function html_Viewer_OnLoadCompleted(obj)
{
   //폼의 onLoadComplated에서 blank페이지를 생성합니다. 
   AxMsie0.Navigate2("about:blank", ,"_self", "", "");  
}
// MSIE의 DocumentComplate이벤트에서 브라우저 표현에 대한 옵션을 설정할 수 있습니다. 
function AxMsie0_DocumentComplete(obj,pDisp,URL)
{
   AxMsie0.Document.body.Scroll = "no";    
   AxMsie0.Document.body.leftmargin = "0"; 
   AxMsie0.Document.body.topmargin = "0";   
}
function Button0_OnClick(obj)
{
   // MSIE 의 innerHTML기능을 이용하여 이미지를 표현합니다. 
   AxMsie0.Document.body.innerHTML = "<img src='http://www.miplatform.co.kr/Miplatform/NewHome/images/main/main_image_help.gif' width='100'>";   
   //height를 설정하지 않은 이유는 width만 설정하면 height는 자동 비율에 의해 사이즈가 표현이 가능합니다. 
}
//전체소스
 
<?xml version="1.0" encoding="utf-8"?>
<Window>
<Form Height="543" Id="html_Viewer" Left="8" OnLoadCompleted="html_Viewer_OnLoadCompleted" PidAttrib="7" Title="html_Viewer" Top="8" Ver="1.0" Width="800" WorkArea="true">
   <Datasets>
      <Dataset Auto="false" DataSetType="Dataset" Id="dsMain">
         <Contents>
              <colinfo id="name" size="256" summ="default" type="STRING"/>
              <colinfo id="content" size="256" summ="default" type="STRING"/>
              <record>
                           <content>http://blogthumb2.naver.net/data44/2008/12/28/67/a4b7_sinimint_my_ej.jpg?type=r2</content>
                            <name>네이버 검색이미지1</name>
              </record>
              <record>
                           <content>http://blogthumb2.naver.net/data44/2008/12/14/19/17_llllllean.jpg?type=r2</content>
                            <name>네이버 검색이미지2</name>
              </record>
              <record>
                           <content>http://cafethumb2.naver.net/data38/2008/12/19/275/%BB%E7%C1%F8_347_apdlemqhdl.jpg?type=r2</content>
                            <name>네이버 검색이미지3</name>
              </record>
         </Contents>
      </Dataset>
   </Datasets>
   <AxMsie Bottom="176" DocumentComplete="AxMsie0_DocumentComplete" FullScreen="true" Height="120" Id="AxMsie0" Left="24" Right="128" Silent="true" Top="56" Width="104"></AxMsie>
   <Image FillType="STRETCH" Height="45" Id="Image0" Left="510" TabOrder="2" Top="35" Width="93"></Image>
   <Button Height="42" Id="Button0" Left="144" OnClick="Button0_OnClick" TabOrder="3" Text="innerHTML" Top="48" Width="115"></Button>
</Form>
<Script><![CDATA[
function html_Viewer_OnLoadCompleted(obj)
{
  AxMsie0.Navigate2("about:blank", ,"_self", "", "");  
}
function AxMsie0_DocumentComplete(obj,pDisp,URL)
{
  AxMsie0.Document.body.Scroll = "no";    
  AxMsie0.Document.body.leftmargin = "0"; 
  AxMsie0.Document.body.topmargin = "0";     
}
function Button0_OnClick(obj)
{
  AxMsie0.Document.body.innerHTML = "<img src='http://www.miplatform.co.kr/Miplatform/NewHome/images/main/main_image_help.gif' width='100'>";
}   
]]></Script>
</Window>

참고사항

사용 예)
//HTML
AxMsie0.Document.body.innerHTML = "<html><title>test</title><body>테스트</body></html>";
//무비파일
AxMsie0.Document.body.innerHTML = ‘<embed src="http://xxxx.동영상.wmv" width="100%" height="100%"></embed><PARAM NAME="AutoStart" VALUE="true">’;
사진보여주는 기능
Window7 동영상 재생문의

MSIE를 통해 호출 시 데이터 전달(POST)방법

var URL = "http://172.10.2.46:8080/miplatform/msiepost.jsp";
var PostData = TextToBin("ID=userID1111&PWD=password");  
//TextToBin을 해 주어야 Post로 정상적으로 전달됨
var Headers = "Content-Type: application/x-www-form-urlencoded";
AxMsie0.Navigate(URL, "", "", PostData, Headers);

참고사항

Get방식으로 호출하고자 한다면 URL뒤에 ?를 통해 값 전달이 가능합니다.
MSIE를 통해 호출시 POST 데이터 전달방법

MSIE에서 사용할 수 있는 함수 및 간략설명

* 아래 사이트를 참조하세요..
* http://msdn.microsoft.com/en-us/library/aa752043(VS.85).aspx