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

使用 TreeView 瀏覽檔案目錄樹 (C++ Builder)

     編輯:VC 教學

功能概述

利用 TTreeView + TImageList 實作類似總管的目錄樹:根節點為「我的電腦」,子節點列出所有磁碟機 (A: 起),展開節點時遞迴列出子目錄。

核心程式碼

FormCreate 初始化

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    CurrentDir = GetCurrentDir();
    UpdateTreeView();
    UpdateListView(); // 假設同步顯示檔案列表
}

建立磁碟機節點

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

    drvNode = TreeView1->Items->AddChild(root, "A:\\");
    drvNode->ImageIndex = drvNode->SelectedIndex = 2;
    AddDirectory("A:\\", drvNode);

    for (int i = 1; i < DriveComboBox1->Items->Count; i++) {
        AnsiString drv = AnsiString(char('B'+i)) + ":\\";
        drvNode = TreeView1->Items->AddChild(root, drv);
        drvNode->ImageIndex = drvNode->SelectedIndex = 3;
        AddDirectory(drv, drvNode);
    }
}

遞迴列出子目錄

void TForm1::AddDirectory(AnsiString path, TTreeNode *parent)
{
    TSearchRec sr;
    TTreeNode *node;
    if (FindFirst(path + "*.*", faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                node = TreeView1->Items->AddChild(parent, sr.Name);
                node->ImageIndex = 0; node->SelectedIndex = 4;
                // AddDirectory(path + sr.Name + "\\", node); // 如需深層遞迴請啟用
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
    }
}

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

void __fastcall TForm1::TreeView1Changing(TObject *Sender, TTreeNode *Node, bool &AllowChange)
{
    Screen->Cursor = crHourGlass;
    // 組合完整路徑
    AnsiString fullPath = Node->Text;
    for (TTreeNode *p = Node->Parent; p && p->Level > 0; p = p->Parent) {
        AnsiString txt = p->Text;
        if (txt.SubString(txt.Length(),1) != "\\") txt += "\\";
        fullPath = txt + fullPath;
    }
    if (fullPath.SubString(fullPath.Length(),1) != "\\") fullPath += "\\";

    // 針對尚未載入子節點的項目 (Count==0) 進行載入
    for (int j = 0; j < Node->Count; j++) {
        TTreeNode *child = Node->Item[j];
        if (child->Count == 0) {
            TSearchRec sr;
            if (FindFirst(fullPath + child->Text + "\\*.*", faAnyFile, sr) == 0) {
                do {
                    if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                        child->ImageIndex = 0; child->SelectedIndex = 4;
                        TreeView1->Items->AddChild(child, sr.Name);
                    }
                } while (FindNext(sr) == 0);
                FindClose(sr);
            }
        }
    }
    Screen->Cursor = crDefault;
}

此法採延遲載入,展開時才讀取子目錄,效能優於一次性遞迴全盤。可搭配 TDriveComboBox 取得磁碟機清單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved