首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 使用 TreeView 瀏覽目錄結構

     編輯:關於C++

遞歸掃描磁碟目錄並動態建立 TreeView 節點

範例展示啟動時建立「我的電腦」根節點,列出所有磁碟機 (A: 為軟碟機圖示,其餘為硬碟圖示),並遞歸掃描子目錄 (僅顯示第一層,展開時再載入下一層)。

初始化 (FormCreate)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    CurrentDir = GetCurrentDir();
    UpdateTreeView();
    UpdateListView(); // 配合 ListView 顯示檔案 (程式碼略)
}

建立樹狀結構 (UpdateTreeView)

void __fastcall TForm1::UpdateTreeView()
{
    TTreeNode *rNode, *mNode;
    TreeView1->Items->Clear();
    rNode = TreeView1->Items->Add(NULL, "我的電腦");
    rNode->ImageIndex = rNode->SelectedIndex = 1; // 我的電腦圖示

    mNode = TreeView1->Items->AddChild(rNode, "A:");
    mNode->ImageIndex = mNode->SelectedIndex = 2; // 軟碟機圖示
    AddDirectory("A:", mNode);

    for (int i = 1; i < DriveComboBox1->Items->Count; i++) {
        AnsiString drv = AnsiString(char('B' + i)) + ":";
        mNode = TreeView1->Items->AddChild(rNode, drv);
        mNode->ImageIndex = mNode->SelectedIndex = 3; // 硬碟圖示
        AddDirectory(drv, mNode);
    }
}

遞歸掃描目錄 (AddDirectory)

void TForm1::AddDirectory(AnsiString path, TTreeNode *fNode)
{
    TSearchRec sr;
    TTreeNode *mNode;
    if (FindFirst(path + "\\*.*", faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                mNode = TreeView1->Items->AddChild(fNode, sr.Name);
                mNode->ImageIndex = 0; mNode->SelectedIndex = 4; // 資料夾圖示
                // 註解掉遞歸呼叫,改由展開事件動態載入
                // AddDirectory(path + "\\" + sr.Name, mNode);
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
    }
}

節點展開時動態載入子目錄 (OnChanging)

void __fastcall TForm1::TreeView1Changing(TObject *Sender, TTreeNode *Node, bool &AllowChange)
{
    Screen->Cursor = crHourGlass;
    TSearchRec sr; TTreeNode *NodeTmp = Node;
    AnsiString DirName, DirTmp;

    // 組合完整路徑
    DirName = Node->Text;
    for (int i = Node->Level; i > 1; i--) {
        NodeTmp = NodeTmp->Parent;
        DirTmp = NodeTmp->Text;
        if (DirTmp.SubString(DirTmp.Length(), 1) != "\\") DirTmp += "\\";
        DirName.Insert(DirTmp, 0);
    }
    if (DirName.SubString(DirName.Length(), 1) != "\\") DirName += "\\";

    // 掃描該節點下的子目錄
    for (int j = 0; j < Node->Count; j++) {
        if (Node->Item[j]->Count == 0) { // 尚未載入
            if (FindFirst(DirName + Node->Item[j]->Text + "\\*.*", faAnyFile, sr) == 0) {
                do {
                    if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                        Node->Item[j]->ImageIndex = 0;
                        Node->Item[j]->SelectedIndex = 4;
                        TreeView1->Items->AddChild(Node->Item[j], sr.Name);
                    }
                } while (FindNext(sr) == 0);
                FindClose(sr);
            }
        }
    }
    Screen->Cursor = crDefault;
}

優點

  • 啟動快:僅掃描第一層目錄。
  • 展開時才載入下一層,記憶體佔用低。
  • 搭配 TDriveComboBox 自動取得磁碟機清單。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved