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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2016, 09:58   #1
phpmullin
Пользователь
 
Регистрация: 03.06.2016
Сообщений: 10
По умолчанию Группировка в virtualtreeview

Добрый день уважаемые программисты и гости форума, в основном решал проблемы сам и постоянно гуглил. Но сдался и решил задать вопрос спецам. Недавно ознакомился с компонентом vtv, вопросов много конечно, но задам главные.



Вот код загрузки файла в список и его парсинг, так же загрузка в дерево:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I2: Integer;
  T: TMyNodeData;
  sl:TstringList;
  i:integer;
  name,pach,razdel,pachtext: TStrings;
  Item: TlistItem;
  xx:string;
begin
  VT.BeginUpdate;
  try
    sl:=TstringList.create; //создаю список (8000 строк)
      sl.LoadFromFile('res\WPI\UserFiles\config.js');
      name := Parse('prog[pn]=[''', ''']', sl.Text); //провожу парсинг
      pach := Parse('cmds[pn]=[''',']',sl.text);
      razdel:=Parse('cat[pn]=[''','''];',sl.text);
      for  i:=0 to sl.Count-1 do
        begin
          if (name <> nil) or (pach<>nil) then
            begin
              try
              T := TMyNodeData.Create; 
              T.Name:= name.Strings[i]; 
              T.Raz:=razdel.Strings[i];
              if (Pos('{x86}',pach.Strings[i])>0) and (Pos('{x64}',pach.Strings[i])>0) then // проверка, все тот же парсинг, все работает на ура.
                begin
                pachtext:=Parse('x86} "%wpipath%\\','"',pach.Strings[i]);
                pachtext.text:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
                T.paching:= sDirectoryEdit1.Text+pachtext.text;
                pachtext:=Parse('"',',',pach.Strings[i]);
                pachtext:=Parse('"','''',pachtext.text);
                T.key:=pachtext.text;

                pachtext:=Parse('x64} "%wpipath%\\','"',pach.Strings[i]);
                pachtext.text:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
                T.paching2:= sDirectoryEdit1.Text+pachtext.text;
                pachtext:=Parse('"',',',pach.Strings[i]);
                pachtext:=Parse('"','''',pachtext.text);

                T.key2:=pachtext.text;
                end
                else if (Pos('{x86}',pach.Strings[i])<=0) and (Pos('{x64}',pach.Strings[i])>0) then
                begin
                pachtext:=Parse('%wpipath%\\','"',pach.Strings[i]);
                pachtext.text:=StringReplace(sDirectoryEdit1.Text+pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
                T.paching:=pachtext.text;
                xx:=pach.Strings[i];
                delete(xx,1,14);
                pachtext:=Parse('"','''',xx);
                T.key:=pachtext.text;

                T.paching2:='';
                T.key2:='';
                end else
                begin
                pachtext:=Parse('%wpipath%\\','"',pach.Strings[i]);
                xx:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
                T.paching:= sDirectoryEdit1.Text+xx;
                xx:=pach.Strings[i];
                delete(xx,1,14);
                pachtext:=Parse('"','''',xx);

                T.key:=pachtext.text;
                T.paching2:='';
                T.key2:='';
                end;
                VT.AddChild(nil, T);
              except
              end;
            end;
        end;
  finally
    VT.EndUpdate;
    name.Free;
    pach.Free;
    sl.Free;
    razdel.Free;
  end;
end;
Вывод в столбцы vtv:

Код:
procedure TForm1.VTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
  P: PMyNodeData;
begin
  P := PMyNodeData(VT.GetNodeData(Node));

  case Column of
   0 : CellText := P.Name;
   1 : CellText := P.Raz;
   2 : CellText := P.paching;
   3 : CellText := P.key;
   4 : CellText := P.paching2;
   5 : CellText := P.key2;
  end;
end;
Хочу сгруппировать по разделам (Офис, мультимедиа)
сортировку по нажатию на заголовок столбца сделал.

Собственно вопрос. Как сгруппировать списки. (Сделать дерево). Заранее огромное спасибо. Буду рад любым советам. Даже Гугл с сылочками. Но конструктивный ответ более устроит. Спасибо!

Возможно мне стоит пересмотреть парсинг, и начать поиск с раздела, а не названия приложения?

Последний раз редактировалось phpmullin; 03.06.2016 в 10:02.
phpmullin вне форума Ответить с цитированием
Старый 03.06.2016, 10:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
VT.AddChild(nil, T);
Код:
mynode:=VT.AddChild(myparentnode, T);
указывать в КАКОЙ ветке создавать -- myparentnode
и запоминать (при необходимости) созданные, чтобы ЕЁ (эту созданную) можно было ПОТОМ указать в качестве корневой(родительской).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.06.2016 в 11:00.
evg_m вне форума Ответить с цитированием
Старый 03.06.2016, 12:33   #3
phpmullin
Пользователь
 
Регистрация: 03.06.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
mynode:=VT.AddChild(myparentnode, T);
указывать в КАКОЙ ветке создавать -- myparentnode
и запоминать (при необходимости) созданные, чтобы ЕЁ (эту созданную) можно было ПОТОМ указать в качестве корневой(родительской).
Спасибо большое! Буду капаться.
phpmullin вне форума Ответить с цитированием
Старый 03.06.2016, 14:58   #4
phpmullin
Пользователь
 
Регистрация: 03.06.2016
Сообщений: 10
По умолчанию Проблема в цикле возможно.

evg_m

при создании формы делаю следующее

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  VT.NodeDataSize := SizeOf(TMyNodeData);
  VST.NodeDataSize := SizeOf(TVSTRecord);
   sl:=TstringList.create;
      sl.LoadFromFile('res\WPI\UserFiles\config.js');
      name1 := Parse('prog[pn]=[''', ''']', sl.Text);
      pach := Parse('cmds[pn]=[''',']',sl.text);
      razdel:=Parse('cat[pn]=[''','''];',sl.text);
end;
Проблемы памяти, ругается на

Код:
xx:=pach.Strings[i];
и ниже на
Код:
Data.ElementKey:=pachtext.text;
вот весь код

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  RootNode, ChildNode: PVirtualNode;
  Data: PVSTRecord;
  i,i2:integer;
  T: TMyNodeData;
  S,C,xx:string;
begin
    for  i:=0 to razdel.Count-1 do
    begin
      RootNode := VST.AddChild(VST.RootNode);
      Data := VST.GetNodeData(RootNode);
      if i=0 then Data.ElementRazdel := razdel.Strings[0];
      S:=razdel.Strings[i];
      i2:=i+1;
   if i2<>razdel.Count then
    begin
     C:=razdel.Strings[i2];
     if S=C then
      begin
      ChildNode := VST.AddChild(RootNode);
      Data := VST.GetNodeData(ChildNode);
      Data.ElementName := name1.Strings[i];
      if (Pos('{x86}',pach.Strings[i])>0) and (Pos('{x64}',pach.Strings[i])>0) then
        begin
          pachtext:=Parse('x86} "%wpipath%\\','"',pach.Strings[i]);
          pachtext.text:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
          Data.ElementPach:= sDirectoryEdit1.Text+pachtext.text;
          pachtext:=Parse('"',',',pach.Strings[i]);
          pachtext:=Parse('"','''',pachtext.text);
          Data.ElementKey:=pachtext.text;
          pachtext:=Parse('x64} "%wpipath%\\','"',pach.Strings[i]);
          pachtext.text:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
          Data.ElementPach2:= sDirectoryEdit1.Text+pachtext.text;
          pachtext:=Parse('"',',',pach.Strings[i]);
          pachtext:=Parse('"','''',pachtext.text);
          Data.ElementKey2:=pachtext.text;
        end
        else if (Pos('{x86}',pach.Strings[i])<=0) and (Pos('{x64}',pach.Strings[i])>0) then
          begin
            pachtext:=Parse('%wpipath%\\','"',pach.Strings[i]);
            pachtext.text:=StringReplace(sDirectoryEdit1.Text+pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
            Data.ElementPach:=pachtext.text;
            xx:=pach.Strings[i];
            delete(xx,1,14);
            pachtext:=Parse('"','''',xx);
            Data.Elementkey:=pachtext.text;
            Data.ElementPach2:='';
            Data.ElementKey2:='';
          end else
          begin
            pachtext:=Parse('%wpipath%\\','"',pach.Strings[i]);
            xx:=StringReplace(pachtext.text, '\\', '\',[rfReplaceAll, rfIgnoreCase]);
            Data.ElementPach:= sDirectoryEdit1.Text+xx;
            xx:=pach.Strings[i];
            delete(xx,1,14);
            pachtext:=Parse('"','''',xx);
            Data.ElementKey:=pachtext.text;
            Data.ElementPach2:='';
            Data.ElementKey2:='';
          end;
      end else Data.ElementRazdel := S;
    end;
  end;
   Data.ElementRazdel := C;
end;




Возможно проблема в цикле, может я что то не догоняю. Заранее огромное спасибо +в карму.


НАШЕЛ проблему, спасибо! Буду думать дальше...

Последний раз редактировалось phpmullin; 03.06.2016 в 15:27.
phpmullin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу скачать VirtualTreeView glassyeyes Компоненты Delphi 1 30.01.2015 09:23
VirtualTreeView bilibian Общие вопросы Delphi 6 06.08.2014 17:02
Dragdrop в Virtualtreeview NaumOff Компоненты Delphi 0 14.11.2012 00:01
VirtualTreeView vs. Delphi XE Kasyan666 Компоненты Delphi 6 30.06.2011 15:54
Работа с VirtualTreeView Mitron Общие вопросы Delphi 31 20.07.2010 13:45