Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > VirtualStringTree помогите с загруской


Автор: Sanchezzz 6.12.2007, 19:51
Помогите реализовать загрузку дерева данными сохранения их..
данные такие.

Код

type
 PitemsNode=^TitemsNode;
   TitemsNode= record
  Dsc,        //описание
  EMail,      
  Name,       //имя
  tip: string;//тип група или запись
  CroupInc:integer; //номер узла 
  Enabled, Editable: Boolean;
  ImageIndex: Integer;//номер картинки
  end;


VirtualStringTree создаю колонки с именами заголовков Name, EMail, Dsc, tip


данные гружу из ini файла такого содержания для групп я сделал 
[0]
Dsc=
Name=группа 1
ImageIndex=-1
[1]
Dsc=
Name=группа 2
ImageIndex=-1
итд.

гружу так.
Код

public
procedure GROUPLoadFromFile(pFilename: string);


procedure TForm1.GROUPLoadFromFile(pFilename: string);
var
  t_ini: TIniFile;
  i: Integer;
  t_strs: TStringList;
  t_section: string;
  t_nodedate: PitemsNode;
  t_node: PVirtualNode;

begin
    t_ini := TIniFile.Create(pFilename);
    t_strs := TStringList.Create;
    try
      t_ini.ReadSections(t_strs);//считываем все секцие
      for i := 0 to t_strs.Count - 1 do
      begin
        t_section := IntToStr(i);номер секцие
       Form1.MRAVS.BeginUpdate;
       t_node := VS.AddChild(nil);
       t_nodedate:= VS.GetNodeData(t_node);
       if Assigned(t_nodedate) then
        with t_nodedate^ do
    begin
       t_nodedate.NameNick:=t_ini.Readstring(t_section, 'Name', 'Plaise_Rename_Group'+inttostr(i));
       t_nodedate.Dsc:=t_ini.Readstring(t_section, 'Dsc', 'Description'+inttostr(i));
       t_nodedate.EMail:='';
       t_nodedate.tip:='Group';//это тип группа или запись
       t_nodedate.CroupInc:=i;
       t_nodedate.ImageIndex:= -1;
          end;
       VS.EndUpdate;
         end;
    finally
      FreeAndNil(t_ini);
      FreeAndNil(t_strs);
    end;
end;
---

далее сама проблема для меня 
есть еoе один ini файл который нужно грузить после загрузки групп.
примерно такого содержания
[0]
name=петя
Email=WWW@hotmail.com
Dsc=описания
Group=группа 1 ; в какой групе 
[1]
итд...

в общем мне нужно загрузить в группы из ini файла данные вот такого содержания нужно чтоб получилось

-группа 1
  |-петя
  |-редиска
+группа 2
-группа 3
  |-Алексей


Автор: AriX 6.12.2007, 21:17
В соседнем топике почти такая же проблема, http://forum.vingrad.ru/forum/topic-185601.html#

Автор: Sanchezzz 6.12.2007, 21:55
совсем другая.. ему нужно древо каталогов получить. мне загрузить еще один список по группам.
и сохранить. если это данные а не группа.

Автор: Pavelbej 6.12.2007, 22:54
Ну так добавь имя групы, а потом из той же секции добавь нужные данные в дочерние узлы:

Код

  Node1:=VT.AddChild(VT.FocusedNode);
  Date := VT.GetNodeData(Node1);
  if Assigned(Date) then
    with Date^ do
                begin
                    Group:=Ее имя;   //Добавляешь имя групы
                end;
   //Дальше уже добавляеш Петю...
   node2:=VT.AddChild(node1);
   ...   


Если не правильно понял проблему, прошу простить.

Автор: AriX 7.12.2007, 17:21
Sanchezzz
Совершенно тот же алгоритм по получению нода, когда известен путь до него.

Автор: Sanchezzz 8.12.2007, 19:25
я вроде все хорошо расписал выше. ладно заход номер 2.
после того как загрузятся группы мне нужно загрузить из другого ини файла дынные. 
вот такого содержания 
[0]
name=петя
Email=WWW@hotmail.com
Dsc=описания
Group=группа 1 ; в какой групе// это имя куда нужно вставить нод.


как найти в списке древа по имени name узел и получить индекс или указатель 
чтоб можно было добавить в него свой нод данных.
VT.FocusedNode не подходит.

Автор: Pavelbej 9.12.2007, 01:15
Вот как я сделал. Не совсем красиво, но работает:


Код

function TForm1.FindNodeSelect(ANode: PVirtualNode; const APattern: WideString): PVirtualNode;
var
    NextNode: PVirtualNode;
    PhoneNode: PLinksCollector;
begin
    Result := nil;
    NextNode := ANode.FirstChild;
    if Assigned(NextNode) then
      repeat
        PhoneNode := VTCateg.GetNodeData(NextNode);
        if Assigned(PhoneNode) then
          if PhoneNode^.Category = APattern then
            begin
              Result := NextNode;
              Exit;
            end;
        Result := FindNodeSelect(NextNode, APattern);

        NextNode := NextNode.NextSibling;
      until  NextNode = nil;
end;


Код

var data: string;
      str: TStrings;
      FoundNode: PVirtualNode;
begin
...
   if Path<>'' then    // Это заранее сохраненный путь из VTCateg.Path(node,0, ttnormal,'\')
   //Например у нас в Path есть путь Categories\Music\Rock\Nickelback\
    begin
       str:=TStringList.Create;
       data:='';
       try
       for i:=1 to length(Path) do  //Начинаем читать путь и в список добавляем отдельно каждое имя
        if Path[i]<>'\' then
           data:=data+Path[i]
        else
           begin
            str.Add(data);
            data:='';
           end;
       if VTCateg.RootNodeCount > 0 then
        begin
          FoundNode:=VTCateg.RootNode;    //Присваиваем  FoundNode -    RootNode
          for y:=1 to str.Count-1 do        //Так как первое имя из списка и есть  RootNode,
                                                           //начинаем читать со второго     
            begin
              data:=(str[y]);   // Теперь получаем из списка, имена по очереди
              FoundNode := FindNodeSelect(FoundNode, data);   // Если нашли, то выделяем, раскрываем...
              if Assigned(FoundNode) then                                    // И так до последнего
                begin
                    VTCateg.Selected[FoundNode] := True;
                    VTCateg.FocusedNode:=FoundNode;
                    VTCateg.Expanded[FoundNode]:=true;
                end;
            end;
        end;
       finally
          str.Free;
       end;
    end;


Надеюсь поможет? Или снова не то?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)