기본 콘텐츠로 건너뛰기

파일을 읽어 트리 구성하기

트리를 구성할 때 좀더 유연성을 제공하기 위해 파일을 읽어서 트리를 구성하기로 했다.
파일은 아이템 텍스트 , 아이템 데이터와 아이템들의 상관관계를 담고 있다.
아이템 텍스트 : 아이템 데이터
{
             자식 아이템들(자식 아이템 또한 아이템 텍스트 : 아이템 데이터의 형식을 지닌다.)
}

<예>
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));
                                   }
                  }
}


댓글