Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение TreeView в текст [D6]


Danco ©   (2010-05-06 17:11:00) 

Добрый вечер! Помогите разораться с компонентом TreeView.

Дерево выглядит примерно так:

0
---0
---1
---2
------0
------1
1
---0
---1
------0
------1
---------0
---------1
---------2
---2
---3

Как сохранить в текстовый файл или просто вывести в memo поле в таком варианте:

0;0
0;1
0;2
0;2;0
0;2;1
1;0
1;1
1;1;0
1;1;1
1;1;1;0
1;1;1;1
1;1;1;2
1;2
1;3

Заранее спасибо!


danco   (2010-05-07 02:04:00) [1]


> xayam ©   (06.05.10 21:08) [9]


Спасибо большое! Все работает! Примногом благодарен!


xayam   (2010-05-06 21:30:00) [2]

Хотя можно просто так написать

procedure TForm1.Button1Click(Sender: TObject);
begin
          RecurceTree(TreeView1.Items.Item[0]);
end;

и в дереве сделать корневой элемент, в который вложены все подразделы.


xayam   (2010-05-06 21:11:00) [3]

не оптимально написано, но я просто не помню как получить корневой узел дерева. Если знаешь, то последняя процедура должна быть примерно такой (без цикла):

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
         RecurceTree(Tree_View_Root_Node);
end;


xayam   (2010-05-06 21:08:00) [4]


> С рекрусивными процедурами не разобрался

Вот так потестируй на разных данных, вроде должно работать, если я не ошибся:

procedure TForm1.RecurceTree(Node: TTreeNode);
var s: string;
    curr: TTreeNode;
begin
    if Node.HasChildren then Node:= Node.getFirstChild
    else  exit;
    while Node <> nil do begin
          curr:= Node;
          s:= curr.Text + ';';
          while curr.Parent <> nil do begin
                curr:= curr.Parent;
                s:= curr.Text + ';' + s;
          end;
          Memo1.Lines.add( s );
       if Node.HasChildren then RecurceTree(Node);
          Node:= Node.getNextSibling;
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
     for i:= 0 to TreeView1.Items.Count - 1 do
     if TreeView1.Items[i].Parent = nil
     then begin
          Memo1.Lines.add( TreeView1.Items.Item[i].Text + ';' );
          RecurceTree(TreeView1.Items.Item[i])
     end;
end;


danco   (2010-05-06 19:31:00) [5]

С рекрусивными процедурами не разобрался, попробовал через Items, получилось, но никак до ума не могу довести.

procedure TForm1.Button1Click(Sender: TObject);
var
 i,l,pl,
 ListLevel, IndexLevel: Integer;
 s,sp: String;
begin
 for i:=0 to TreeView1.Items.Count-1 do
 begin
   ListLevel:=TreeView1.Items.Item[i].Level;
   IndexLevel:=TreeView1.Items.Item[i].Index;

   if ListLevel = 0 then
   begin
     s:='';
     l:=0;
   end
     else
       begin
         if l<ListLevel then
           s:=s+TreeView1.Items.Item[i-1].Text+':'
             else
               if l>ListLevel then
               begin
                 l:=l-ListLevel;
                 sp:=s;
                 s:='';
                 for pl:=0 to l do
                 begin
                  s:=s+Copy(sp,1,pos(':',sp));
                  Delete(sp,1,pos(':',sp));
                 end;
               end;
         l:=ListLevel;
       end;

   ListBox1.Items.Add(s+TreeView1.Items.Item[i].Text);
 end;
end;


Тыкните пальцем пожалуйста где недочет, я слепой видимо. Или сразу мне в глаз, прозрею может =)))


MBo   (2010-05-06 17:57:00) [6]

>Получилось перебрать только все дерево по порядку.
уже ведь подсказали, что нужно использовать рекурсивную процедуру.

можно и итеративно в цикле по Items, только лишнюю работу придется делать - пробегать по Parent-ам


danco   (2010-05-06 17:52:00) [7]

Это просто сохранение TreeView в текстовой файл, а мне нужно в определенном формате описанным выше.

for i:=0 to TreeView1.Items.Count-1 do
 begin
   ListBox1.Items.Add(TreeView1.Items.Item[i].Text);
end;


Получилось перебрать только все дерево по порядку.


xayam   (2010-05-06 17:40:00) [8]

Ну это просто пример рекурсии, можешь под себя подправить, если лень, то можно упростить до предела:

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TFileStream;
begin
  F := TFileStream.Create('c:\TreeView.txt', fmCreate or fmShareCompat);
  try
    F.WriteComponent(TreeView1);
  finally
    F.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  F: TFileStream;
begin
  F := TFileStream.Create('c:\TreeView.txt', fmOpenRead or fmShareDenyWrite);
  try
    F.ReadComponent(TreeView1);
  finally
    F.Free;
  end;
end;


danco   (2010-05-06 17:32:00) [9]


> Рекурсия?


function Save2File(Sender:TTreeView): Boolean;
var
F: HFile;

procedure item2file(ind:cardinal);
var
 len:cardinal;
 path: String;
begin
 while ind<>0 do
   begin
     path := sender.TVItemPath(ind,"\");
     len :=length(path) ;
     FileWrite( F, len,4);
     FileWrite( F, path[1], len );
     if Sender.TVItemChild[ind]<>0 then item2file(Sender.TVItemChild[ind]);
     ind := sender.TVItemNext[ind];
   end;
 end;

begin
 result := false;
 F := FileCreate("Base.dat", ofOpenWrite or ofCreateAlways);// or ofShareExclusive ofShareDenyRead or ofShareDenyWrite
 if F = INVALID_HANDLE_VALUE then Exit;
 item2file(Sender.TVRoot);
 FileClose( F );
 result := true;
end;


Данный код работать не хочет, т.к. в данный пример для компонента TKOLTreeView

Или я что-то недопонимаю?


xayam   (2010-05-06 17:27:00) [10]

И потом там вроде есть
TreeView1.SaveToFile();
TreeView1.LoadFromFile();


xayam   (2010-05-06 17:23:00) [11]

Рекурсия?

http://www.delphimaster.net/view/11-1204867469


Danco   (2010-05-06 17:23:00) [12]

Для более нормального понимания:

Погода
---Разная
---Спортивная
---Антисанитарная
------Политичски
------Факторитически
Температура
---Анамальная
---Мировая
------Адекватная
------Шумная
---------Средне
---------Норма
---------Сильно
---Метежная
---Индустриальная

--->

Погода;Разная
Погода;Спортивная
Погода;Антисанитарная
Погода;Антисанитарная;Политичски
Погода;Антисанитарная;Факторитически
Температура;Анамальная
Температура;Мировая
Температура;Мировая;Адекватная
Температура;Мировая;Шумная
Температура;Мировая;Шумная;Средне
Температура;Мировая;Шумная;Норма
Температура;Мировая;Шумная;Сильно
Температура;Метежная
Температура;Индустриальная


Наверх

Титульная страница Поиск, карта сайта Написать письмо