Когда ваш компьютер говорит "Вставьте диск #2", не торопитесь, сначала выньте диск номер один... даже если вы уверены, что сможете засунуть туда оба.
Самый простой способ - это при запуске программы найти все каталоги на диске и засунуть их в TreeView. Но у этого способа есть несколько недостатков. Во-первых, он долгий, особенно, если включен zif. Во-вторых, даже если закрыть и открыть какую-то папку, она не обновится. Поэтому лучше всего вначале сделать в TreeView список дисков со значком "+", то есть указать, что на диске есть каталоги. Это не всегда верно, но проверять, правда ли это, долго из-за дисковода. При попытке раскрыть каталог или диск программа ищет подкаталоги и добавляет их в ListView. В каждом подкаталоге программа пытается найти хотя бы один подкаталог. В зависимости от результатов поиска "+" появляется или нет. В этой программе используются иконки из файла FileCtrl.res, находящемся в каталоге "Delphi5\lib".
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 thenbeginrepeatif (sr.Attr and faDirectory > 0) and DirectoryName(sr.name) thenbegin
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 thenbeginrepeatif (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;
endelse
ParentNode.HasChildren := false;
FindClose(sr);
end;
procedure TForm1.FormCreate(Sender: TObject);
const
IconNames: array [0..6] ofstring = ('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) dobegin
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' dobegin
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;
Статья TreeView каталогов - как в левой части проводника раздела Файловая система Директории может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
:: 2009-08-11 22:51:35 :: re:TreeView каталогов - как в левой части проводника
пишу:
procedure TForm1.FormCreate(Sender: TObject);
var
DriveType, i: integer;
begin
TreeView1.Items.BeginUpdate;
for i := 0 to 25 do
begin
DriveType := GetDriveType(PChar(i));
if DriveType = 1 then continue;
end;
end;
запускаю, выскакивает ошибка:
First chance exception at $7C81EB33. Exception class EAccessViolation with message \'Access violation at address 7C9012B4 in module \'ntdll.dll\'. Read of address 00000001\'. Process Project1.exe (3440)
че дела?подскажи плиз!!!!
:: 2009-08-12 22:59:42 :: re:TreeView каталогов - как в левой части проводника
1. TreeView1.Items.EndUpdate; - Обязательно должно быть
2. Запусти программу в отладчике, найди строку в которой исключение происходит, скорее всего что-то с памятью перепутал.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.