Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11639
Последний выпуск: 19.06.2015

Дерево каталогов

Сегодня поговорим о том, как при помощи TreeView сделать дерево каталогов, то есть нечто, вроде левой части Проводника. Самый простой способ - это при запуске программы найти все каталоги на диске и засунуть их в 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 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://delphi4all.narod.ru/
Email: delphi4all@narod.ru

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
38K
04 апреля 2008 года
Lena11
0 / / 04.04.2008
+1 / -0
Мне нравитсяМне не нравится
4 апреля 2008, 12:52:06
а как создать дерево каталогов 3 уровня??
2.
14K
23 октября 2006 года
Pheonix
31 / / 23.10.2006
+1 / -0
Мне нравитсяМне не нравится
24 октября 2006, 16:01:17
Как сделать то же, только что бы сканировались все папки и открывались?
3.
Аноним
Мне нравитсяМне не нравится
3 мая 2005, 08:49:19
Ага! Как это сделать используя средства Win API?
4.
Аноним
Мне нравитсяМне не нравится
15 октября 2004, 09:17:58
а как сделать дерево каталгов в Visual C++?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог