트리를 구성할 때 좀더 유연성을 제공하기 위해 파일을 읽어서 트리를 구성하기로 했다.
파일은 아이템 텍스트 , 아이템 데이터와 아이템들의 상관관계를 담고 있다.
아이템 텍스트 : 아이템 데이터
{
자식 아이템들(자식 아이템 또한 아이템 텍스트 : 아이템 데이터의 형식을 지닌다.)
}
<예>
Symbols : -1
{
Assemblies : -1
{
Equipment : -1
{
Pump01 : -1
Pump02 : -1
Pump03 : -1
}
Instrumentation : -1
{
Flow01 : -1
Rval01 : -1
Temp01 : -1
}
Piping : -1
{
Blnk01 : -1
Blnk02 : -1
Control01 : -1
Control02 : -1
Control03 : -1
}
}
BOOL CDCL_Main::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
CString rModulePath = GetModulePath();
if('\\' != rModulePath.Right(1)) rModulePath += "\\";
CString rSymbolTreeDataFile = rModulePath + "Execute.dat";
//////////////////////////////////////////////////////////////////////////
ifstream file(rSymbolTreeDataFile.operator LPCTSTR());
CreateExecuteNode(NULL , file);
file.close();
m_selectExec.SelectItem(m_selectExec.GetRootItem());
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/// 재귀 호출을 사용한 아이템 생성
void CDCL_Main::CreateExecuteNode(HTREEITEM hParent, ifstream &file)
{
char szBuf[MAX_PATH];
HTREEITEM hItem = NULL;
while(file.good() && !file.eof())
{
file.getline(szBuf , MAX_PATH);
if('\0' == szBuf[0]) continue;
CString rStr(szBuf);
rStr.TrimLeft(" ");
rStr.TrimLeft("\t");
rStr.TrimRight(" ");
rStr.TrimRight("\t");
if("}" == rStr) break;
if("{" == rStr)
{
CreateExecuteNode(hItem , file);
}
else if("" != rStr)
{
//////////////////////////////////////////////////////////////////////////
/// parse symbol name and code
vector<string> oResult;
CTokenizer<CIsFromString>::Tokenize(oResult , rStr.operator LPCTSTR() , CIsFromString(":"));
rStr = oResult[0].c_str();
rStr.TrimLeft(" ");
rStr.TrimLeft("\t");
rStr.TrimRight(" ");
rStr.TrimRight("\t");
CString* rPara = new CString(oResult[1].c_str());
rPara->TrimLeft(" ");
rPara->TrimLeft("\t");
rPara->TrimRight(" ");
rPara->TrimRight("\t");
m_lstPara.push_back(rPara);
//////////////////////////////////////////////////////////////////////////
TV_INSERTSTRUCT TI;
TI.hParent = hParent;
TI.item.mask = TVIF_TEXT;
TI.item.pszText = const_cast<char*>(rStr.operator LPCTSTR());
hItem = m_selectExec.InsertItem(&TI);
m_selectExec.SetItemState(hItem , INDEXTOSTATEIMAGEMASK(0), TVIS_STATEIMAGEMASK );
m_selectExec.SetItemData(hItem , (DWORD)(rPara));
}
}
}
댓글
댓글 쓰기