Post

파일을 읽어 트리 구성하기

트리를 구성할 때 좀더 유연성을 제공하기 위해 파일을 읽어서 트리를 구성하기로 했다.

파일은 아이템 텍스트 , 아이템 데이터와 아이템들의 상관관계를 담고 있다.

1
2
3
4
아이템 텍스트 : 아이템 데이터
{
    자식 아이템들(자식 아이템 또한 아이템 텍스트 : 아이템 데이터의 형식을 지닌다.)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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));
        }
    }
}