Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Как сделать что бы папочки отображались в TreeView
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Алексеев Николай Алексеев Николай вне форума
Member
 
Сообщений: 830
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2004
По умолчанию Как сделать что бы папочки отображались в TreeView - 03.01.2005, 21:39

Я в отчании!
Короче есть файл типа:

Цитата:
COMMONGRAPHICSAVIS
COMMONGRAPHICSBITMAPSASSORTED
COMMONGRAPHICSBITMAPSGAUGE
SHAREDODBC
SHAREDOLEDB
Так фот... мне нуно, что бы папочки отображались в TreeView притом, чтобы они не повторялись и лежали там где нужно...
Плпылся написать... вот что получилось:

Код:
function checkdir(dir:string):boolean;
var
 j:integer;
begin
result:=false;
for j:=1 to 10000 do
 if dirm[j] = dir then begin result:=true; break; end;

end;

procedure CreateChildDir(cap:string);
var
 i,j,q:integer;
 s:string;
begin
if slash(cap) = false then dir:=dirs;
for i:=1 to length(cap) do
 if cap[i] = '' then begin
  s:=cap;
  delete(s,i,length(s)-i+1);
  delete(cap,1,i+1);
  if checkdir(s) = false then
   begin
    dirn:=dirn+1;
    dirm[dirn]:=s;
    dirchild:=Form1.TreeView1.Items.AddChild(dir,s);
   end;
  CreateChildDir(cap);
  break;
 end;
end;

procedure CreateDir(cap:string);
var
 i,j,q:integer;
 s:string;
begin
s:='';
for i:=1 to length(cap) do
 if cap[i] = '' then begin
  s:=cap;
  delete(s,i,length(s));
  delete(cap,1,i);
  if checkdir(s) = false then
   begin
    dirn:=dirn+1;
    dirm[dirn]:=s;
    dir:=Form1.TreeView1.Items.AddNode(dir,dirs,s,nil,naadd);
   end;
  CreateChildDir(cap);
  break;
 end;
end;



procedure view;
var
 s:string;
 list:TStrings;
 i:integer;
begin
 nodes:=TTreeNodes.Create(form1.TreeView1);
 dirs:=TTreeNode.create(nodes);
 dir:=TTreeNode.create(nodes);
 dirchild:= TTreeNode.create(nodes);
 list:= TStringList.Create;
 list.LoadFromFile('c:tft.txt');
 for i:=0 to list.Count-1 do
 begin
   if slash(list.Strings[i]) then CreateItem(list.Strings[i]);
   if slash(list.Strings[1]) = false then CreateDir(list.Strings[1])
 end;
end;
За код не ругать, что не вообще такой не такой, а помочь! Чего я непраильно делаю? Я уже над этим часов 5 бьюсь как рыба об лёд!
Ответить с цитированием
  (#2 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 04.01.2005, 20:21

Класс! Такая несложная на первый взгляд задача на деле оказывается далеко не самой простой.
Посмотри мой вариант решения:

Код:
  src: array[0..4] of string = (
   'COMMONGRAPHICSAVIS', 'COMMONGRAPHICSBITMAPSASSORTED',
   'COMMONGRAPHICSBITMAPSGAUGE', 'SHAREDODBC', 'SHAREDOLEDB');

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

  procedure StrToTreeView(s: string);

    function StringBreak(var s: string; sep: string = ''): string;
    var
      i: integer;
    begin
      i := pos(sep, s);
      if i = 0 then begin Result := ''; exit; end;
      Result := copy(s, 1, i-1);
      Delete(s, 1, i);
    end;

    function FindNode(Parent: TTreeNode; text: string): TTreeNode;
    var
      curr: TTreeNode;
    begin
      Result := nil;
      if Parent <> nil then
        curr := Parent.getFirstChild
      else
        curr := tv.Items.GetFirstNode;

      while curr <> nil do begin
        if curr.Text = text then begin Result := Curr; exit; end;
        curr := Parent.GetNextChild(curr);
      end;
    end;

  var
    Node, Node2: TTreeNode;
    text: string;
    b: boolean;
  begin
    b := true;
    text := StringBreak(s);
    node2 := FindNode(nil, text);
    node := node2;
    while (node <> nil) and b do begin
      node2 := node;
      b := s <> '';
      text := StringBreak(s);
      node := FindNode(node2, text);
    end;

    while b do begin
      node2 := tv.Items.AddChild(node2, text);
      b := s <> '';
      text := StringBreak(s);
    end;
  end;

var
  i: integer;
begin
  for i := 0 to High(src) do
    StrToTreeView(src[i]);
Ответить с цитированием
  (#3 (permalink)) Старый
Алексеев Николай Алексеев Николай вне форума
Member
 
Сообщений: 830
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.06.2004
По умолчанию 04.01.2005, 21:47

Ещё один вариантик:

Код:
procedure FillTreeViewWithFiles(TreeView1 : TTreeView; Strs : TStringList);
Var
  CachedStrs: TStringList; // CachedStrs вводится для ускорения поиска 
                           // в уже готовом дереве.

  Procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: String); 
    Function FindNodeWithText(AParent: TTreeNode; Const S: String): TTreeNode;
    Var
      K : Integer;
      fStr : String;
      tmpNode: TTreeNode;
    Begin
      Result := Nil;
      fStr := S + IntToStr(Integer(AParent));
      K := CachedStrs.IndexOf(fStr);
      If K > -1 Then
        Result := Pointer(CachedStrs.Objects[K])
      Else
      Begin
        If AParent <> Nil Then
          tmpNode := AParent.getFirstChild
        Else
          tmpNode := TreeView1.Items.GetFirstNode;
        While tmpNode <> Nil Do
        Begin
          If tmpNode.Text = S Then
          Begin
            Result := tmpNode;
            CachedStrs.AddObject(fStr, Pointer(tmpNode));
            break;
          End;
          tmpNode := tmpNode.getNextSibling;
        End;
      End
    End;

  Var
    prefix: String;
    ID : Integer;
    aNode : TTreeNode;
  Begin
    If S = '' Then Exit;
    ID := Pos('', S);
    prefix := '';
    If ID > 0 Then
      prefix := Copy(S, 1, ID - 1)
    Else
    Begin
      prefix := S;
      S := '';
    End;

    aNode := FindNodeWithText(ParentNode, prefix);

    If aNode = Nil Then
    Begin
      aNode := TreeView1.Items.AddChild(ParentNode, prefix);
    End;

    AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));

  End;


Var K: Integer;
Begin

  CachedStrs := TStringList.Create;
  CachedStrs.Duplicates := dupIgnore;
  CachedStrs.Sorted := True;

  Try

    TreeView1.Items.BeginUpdate;
    TreeView1.SortType := stNone;

    For K := 0 To Strs.Count - 1 Do
      AddItem(0, Nil, Strs[K]);

  Finally
    TreeView1.Items.EndUpdate;
    CachedStrs.Free;
  End;
End;
Использование:

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var Strs : TStringList; i:integer;
begin
  Strs := TStringList.Create;
  try
   Strs.LoadFromFile('C:tft.txt');
   FillTreeViewWithFiles(TreeView1,Strs);
  finally
   Strs.Free;
  end;
end;
Наиболее рациональный метод.... Находил компонент для такого дела но обрабатывает файл в 260КБ за 6 минут, а это за 10 секунд)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы видеоролики отображались в виде эскизов? Клим Процессоры 0 08.11.2011 21:47
Странный TreeView ГС ТОФ Delphi 0 19.02.2010 08:53
Как сделать развлетвленный TreeView JoGi Delphi 6 08.06.2007 11:40
Как записать Memo в TreeView что бы в TreeView был перенос строк zettambov C++ Builder 4 02.04.2007 09:44
Таблица в которой есть столбцы типа memo отображались на форме eva001 C++ Builder 6 07.03.2006 08:10
Как сделать что-бы при выборе какого нибудь элемента из TreeView в Memo добавлялся те SilentmaN Delphi 8 05.01.2006 22:27
Как программно сделать, чтобы после вставления СD, в ListBoxe отображались треки imported_WanteD C++ Builder 0 07.11.2005 11:28
treeview контрол imported_ламер PHP 1 09.05.2005 20:35
как сделать, чтобы в программе русские символы отображались корректно Malnor Вопросы начинающих программистов 1 31.08.2004 23:53
Как сделать чтобы при инициализации формы записи из TQuery отображались в TListView Anonymous Delphi 3 14.04.2003 15:30
Фон TreeView как сделать Anonymous WinAPI 0 22.09.2002 21:43



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов