Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2011, 17:33   #11
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Вот пытаючь получить иеррархию всех каталогов диска D:\
Не судите строго, я только учусь. . Делаю я это следующим образом:
Код:
procedure Dir(Patch: string; at: integer; F: TSearchRec; N: TTreeNode);
begin
  if FindFirst(Patch + '*.*', at, F) = 0
    then
      if ((F.Attr and faDirectory) = faDirectory)
         and (F.Name <> '.') and (F.Name <> '..')
        then
          begin
            ND:=Form1.TreeView1.Items.AddChild(ND,F.Name);
            Dir(Patch + '\', at, f, ND);
            ND:=ND.Parent;
          end;

  while FindNext(F) = 0 do Dir(Patch+F.Name, at, f, ND);
  FindClose(F);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  S: TSearchRec;
begin
  TreeView1.Items.Clear;
  ND:=TreeView1.Items.AddChild(nil,'D:\');
  if FindFirst('D:\*.*',faAnyFile,S) = 0
    then
        repeat
          if ((S.Attr and faDirectory) = faDirectory) and
             (S.Name <> '.') and (S.Name <> '..')
             then Dir('D:\' + S.Name, faAnyFile, S, ND);
        until FindNext(S) <> 0;
  FindClose(S);
end;
Вообщем, после клика button1 в TreeView1 получаем всю иерархию диска D:\. Правда работает это так доооооолго, что пропадает все желание пользоваться этим произведением искусства. . Может кто подскажет, как можно сократить время?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 19.02.2011, 17:40   #12
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
как можно сократить время
строить не всё дерево сразу, а по мере того, как юзер открывает в нем ветки. Так работает стандартный Explorer, кстати )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось artemavd; 19.02.2011 в 20:18.
veniside вне форума Ответить с цитированием
Старый 19.02.2011, 17:45   #13
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> как можно сократить время

строить не всё дерево сразу, а по мере того, как юзер открывает в нем ветки. Так работает стандартный Explorer, кстати )
хм... надо подумать над этим
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 19.02.2011, 17:53   #14
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Можно по-простому, во все ветки добавлять детей-пустышек, которые при первом открытии ветки-родителя будут заменяться на реальные подкаталоги. Если подкаталогов нет, юзер будет немного озадачен исчезновением [+] у ветки.

А если делать красиво, то сканировать на 1 уровень глубже, чем текущая ветка, чтобы вместо пустышек добавлять реальные подкаталоги.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 19.02.2011 в 17:55.
veniside вне форума Ответить с цитированием
Старый 19.02.2011, 18:02   #15
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
А если делать красиво, то сканировать на 1 уровень глубже, чем текущая ветка, чтобы вместо пустышек добавлять реальные подкаталоги.
да, да, мысль мне понятна . Правда придется отказаться от возможности раскрыть все ветки сразу.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 19.02.2011, 18:10   #16
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Почему отказаться. ExpandAll() никто не отменял. Если юзер захочет -- путь раскрывает хоть по-одной, хоть все сразу. Естественно во втором случае прийдётся обождать. А если по мере длительного сканирования периодически вызывать ProcessMessages(), то и юзер скучать не будет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.02.2011, 20:19   #17
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

А что, взять компонент ShellTreeView и настроить его уже не модно? И кода не надо никакого, и отобразится что и как надо.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.02.2011, 20:28   #18
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А что, взять компонент ShellTreeView и настроить его уже не модно? И кода не надо никакого, и отобразится что и как надо.
Наверное модно. Просто я это делаю в целях самообразования.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 19.02.2011, 20:30   #19
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Это конечно полезно, но нет ничего плохого и в том, чтобы пользоваться уже готовым. Если у вас время на написание программы достаточно много, то можно и самому делать. В ином случае, думаю, что лучше было бы воспользоваться готовым компонентом.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.02.2011, 21:02   #20
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот рабочии пример по вашеи теме
Код:
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;

end.
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Специальные каталоги Бутаков_Сергей Общие вопросы Delphi 2 07.12.2009 07:30
Вычислить сумму элементов матрицы, расположенные на главной диагонали и выше нее MariyaVo Паскаль, Turbo Pascal, PascalABC.NET 9 10.05.2009 21:19
ПОЛУЧИТЬ ВСЕ СИМВОЛЫ, РАСПОЛОЖЕННЫЕ МЕЖДУ ПЕРВОЙ И ПОСЛЕДНЕЙ ТОЧКАМИ MMARKIN Паскаль, Turbo Pascal, PascalABC.NET 7 13.04.2009 09:48
Каталоги в TreeView Airou Общие вопросы Delphi 27 03.12.2008 22:31
Получить сообщение о новом диске Comer_Jus Общие вопросы Delphi 2 11.08.2008 15:26