Дерево каталогів, delphisite

Сьогодні поговоримо про те, як за допомогою 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;