TreeView — дерево каталогов
TreeView — дерево каталогов
TreeView - дерево каталогов Самый простой способ - это при запуске программы найти все каталоги на диске и засунуть их в treeview. Но у этого способа есть несколько недостатков. Во-первых, он долгий, особенно, если включен zif. Во-вторых, даже если закрыть и открыть какую-то папку, она не обновится. Поэтому лучше всего вначале сделать в treeview список дисков со значком "+", то есть указать, что на диске есть каталоги. Это не всегда верно, но проверять, правда ли это, долго из-за дисковода. При попытке раскрыть каталог или диск программа ищет подкаталоги и добавляет их в listview. В каждом подкаталоге программа пытается найти хотя бы один подкаталог. В зависимости от результатов поиска "+" появляется или нет. В этой программе используются иконки из файла filectrl.res, находящемся в каталоге "delphi5lib". implementation {$r *.dfm} {$r filectrl} procedure nextlevel(parentnode: ttreenode); function directoryname(name: string): boolean; begin result := (name > '.') and (name > '..'); end; var sr, srchild: tsearchrec; node: ttreenode; path: string; begin node := parentnode; path := ''; repeat path := node.text + '' + path; node := node.parent; until node = nil; if findfirst(path + '*.*', fadirectory, sr) = 0 then begin repeat if (sr.attr and fadirectory > 0) and directoryname(sr.name) then begin node := form1.treeview1.items.addchild(parentnode, sr.name); node.imageindex := 0; node.selectedindex := 1; node.haschildren := false; if findfirst(path + sr.name + '*.*', fadirectory, srchild) = 0 then begin repeat if (srchild.attr and fadirectory > 0) and directoryname(srchild.name) then node.haschildren := true; until (findnext(srchild) > 0) or node.haschildren; end; findclose(srchild); end; until findnext(sr) > 0; end else parentnode.haschildren := false; findclose(sr); end; procedure tform1.formcreate(sender: tobject); const iconnames: array [0..6] of string = ('closedfolder', 'openfolder', 'floppy', 'hard', 'network', 'cdrom', 'ram'); var c: char; s: string; node: ttreenode; drivetype: integer; bm, mask: tbitmap; i: integer; begin treeview1.items.beginupdate; treeview1.images := timagelist.createsize(16, 16); bm := tbitmap.create; mask := tbitmap.create; for i := low(iconnames) to high(iconnames) do begin bm.handle := loadbitmap(hinstance, pchar(iconnames[i])); bm.width := 16; bm.height := 16; mask.assign(bm); mask.mask(clblue); treeview1.images.add(bm, mask); end; for c := 'a' to 'z' do begin s := c + ':'; drivetype := getdrivetype(pchar(s)); if drivetype = 1 then continue; node := form1.treeview1.items.addchild(nil, s); case drivetype of drive_removable: node.imageindex := 2; drive_fixed: node.imageindex := 3; drive_remote: node.imageindex := 4; drive_cdrom: node.imageindex := 5; else node.imageindex := 6; end; node.selectedindex := node.imageindex; node.haschildren := true; end; treeview1.items.endupdate; end; procedure tform1.treeview1expanding(sender: tobject; node: ttreenode; var allowexpansion: boolean); begin treeview1.items.beginupdate; node.deletechildren; nextlevel(node); treeview1.items.endupdate; end; Автор: Даниил Карапетян Источник: http://program.dax.ru