Сьогодні поговоримо про те, як за допомогою TreeView зробити дерево каталогів, тобто щось, на кшталт лівій частині Провідника. Найпростіший спосіб - це при запуску програми знайти всі каталоги на диску і засунути їх в TreeView. Але у цього способу є кілька недоліків. По-перше, він довгий, особливо, якщо включений zif. По-друге, навіть якщо закрити і відкрити якусь папку, вона не оновиться. Тому краще всього спочатку зробити в TreeView список дисків із позначкою "+", тобто вказати, що на диску є каталоги. Це не завжди вірно, але перевіряти, чи правда це, довго через дисковода. При спробі розкрити каталог або диск програма шукає підкаталоги і додає їх в ListView. У кожному підкаталозі програма намагається знайти хоча б один підкаталог. Залежно від результатів пошуку "+" з'являється чи ні.
У цій програмі використовуються іконки з файлу FileCtrl.res, що знаходиться в каталозі "Delphi5 \ lib".
implementation
procedure Level # 40; ParentNode: TTreeNode # 41; ;
function DirectoryName # 40; name: string # 41 ;. boolean;
result: = # 40; name <> '.' # 41; and # 40; name <> '..' # 41; ;
sr, srChild: TSearchRec;
path: = node. Text + '\' + path;
node: = node. Parent;
until node = nil;
if FindFirst # 40; path + '*. *'. faDirectory, sr # 41; = 0 then begin
if # 40; sr. Attr and faDirectory <> 0 # 41; and DirectoryName # 40; sr. Name # 41; then begin
node: = Form1. TreeView1. Items. AddChild # 40; ParentNode, sr. Name # 41; ;
node. ImageIndex: = 0;
node. SelectedIndex: = 1;
node. HasChildren: = false;
if FindFirst # 40; path + sr. Name + '\ *. *'. faDirectory, srChild # 41; = 0 then begin
if # 40; srChild. Attr and faDirectory <> 0 # 41; and DirectoryName # 40; srChild. Name # 41;
then node. HasChildren: = true;
until # 40; Find # 40; srChild # 41; <> 0 # 41; or node. HasChildren;
FindClose # 40; srChild # 41; ;
until Find # 40; sr # 41; <> 0;
end else ParentNode. HasChildren: = false;
FindClose # 40; sr # 41; ;
procedure TForm1. FormCreate # 40; Sender: TObject # 41; ;
IconNames: array # 91; 0. 6 # 93; of string = # 40; 'CLOSEDFOLDER'. 'OPENFOLDER',
'FLOPPY'. 'HARD'. 'NETWORK'. 'CDROM'. 'RAM' # 41; ;
bm, mask: TBitmap;
TreeView1. Items. BeginUpdate;
TreeView1. Images: = TImageList. CreateSize # 40; 16. 16 # 41; ;
bm: = TBitmap. Create;
mask: = TBitmap. Create;
for i: = low # 40; IconNames # 41; to high # 40; IconNames # 41; do begin
bm. Handle: = LoadBitmap # 40; HInstance, PChar # 40; IconNames # 91; i # 93; # 41; # 41; ;
mask. Assign # 40; bm # 41; ;
mask. Mask # 40; clBlue # 41; ;
TreeView1. Images. Add # 40; bm, mask # 41; ;
for c: = 'A' to 'Z' do begin
DriveType: = GetDriveType # 40; PChar # 40; s # 41; # 41; ;
if DriveType = 1 then continue;
node: = Form1. TreeView1. Items. AddChild # 40; nil. s # 41; ;
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;
node. SelectedIndex: = node. ImageIndex;
node. HasChildren: = true;
TreeView1. Items. EndUpdate;
procedure TForm1. TreeView1Expanding # 40; Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean # 41; ;
TreeView1. Items. BeginUpdate;
Level # 40; node # 41; ;
TreeView1. Items. EndUpdate;