TreeView

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

TreeView

Сообщение arriah »

Привет всем.

Помогите с динамическим созданием TreeView

Есть INI файл в которм прописаны секции и параметры. В каждой секции есть параметр name и link

Программа должна "прочесть" ini, из name сделать корневые узлы TreeView.
Потом полчить файл по линку, пропарсить его и внести в дерево в соответствуещего родителя name
Должно что-то подобное получится

Код: Выделить всё

name1
   param1
   param2
   param3
name2
   param4
   param5
name3
   param6


По name я дерево построил, а как теперь определить родителя и вставить туда нужные данные?
Я сделал так:

Код: Выделить всё

For i:=0 to TreeView1.Items.Count-1 do begin
   Node:=TreeView1.Items.Item[i];
   HTTP.HTTPMethod('GET',IniFile.ReadString(INIStr[i],'link',''));
   DataLink.LoadFromStream(HTTP.Document);
   For k:=0 to DataLink.Count-1 do
    if pos('<title>',DataLink[k])>0 then TreeView1.Items.AddChild(Node,DataLink[k]);
  end;           


Но у меня получается чушь какая-то:

Код: Выделить всё

name1
   param1
      param4
        param6
     param5
   param2
   param3
name2
name3


То есть данные из link name2, считают своим родителем param1 из name1

Помогите разобраться
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Код: Выделить всё

 if pos('<title>',DataLink[k])>0 then TreeView1.Items.AddChild(Node,DataLink[k]);

ты создаешь подпункт и переходишь на него (уже он становится текущим.). Просто далее перейди на уровень выше (или запомни текущий пункт и в цикле возвращайся к нему.)
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

о своей зачачей справился. Но появилась другая проблема.

На данный момент TreeView сроится по данным из файлов, имена которые я выбираю в комбобох. Строится все нормально, без ошибок.

Далее в процедуре TreeView1Change пишу следующее:

Код: Выделить всё

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 Edit1.Text:=TreeView1.Items.Item[node.AbsoluteIndex+1].Text;
end;


В принципе ничего необычного, Запускаю приложение, из бокса выбираю имя файла, жму на кнопку получить данные - строится дерево. Клацаю по элементам - вижу как меняется текс в Edit1.. все хорошо! НО...

Как только я выбираю из бокса другой файл с данными и жму кнопку получить данные - тут же получаю AV на строке 1112 (вот фукция - звездочкой помечена строка на которой крэшится)

Код: Выделить всё

function TTreeNode.GetAbsoluteIndex: Integer;
// - first node has index 0
// - the first child of a node has an index one bigger than its parent
// - a node without children has an index one bigger than its previous brother
var
  ANode: TTreeNode;
begin
  Result:=-1;
  ANode:=Self;
  repeat
    inc(Result);
    while ANode.FPrevBrother<>nil do begin
      ANode:=ANode.FPrevBrother;
      inc(Result,ANode.FSubTreeCount); ****************
    end;
    ANode:=ANode.Parent;
  until ANode=nil;
end;                   


Перед созданием дерева выполняю TreeView1.Items.Clear, но это не помогает.

Я так понимаю освобождается не вся память, при перестроении дерева? Как правильно выполнить очистку TreeView?
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

FPrevBrother может ссылаться на уже убитую ноду. Ссылка (указатель) есть, а объект уже убит.
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

serbod писал(а):FPrevBrother может ссылаться на уже убитую ноду. Ссылка (указатель) есть, а объект уже убит.

И как этого можно избежать?
При построении деревая не использую никаких указателей.. обычное добавлене add и addchild
Alex. S
новенький
Сообщения: 39
Зарегистрирован: 22.08.2015 10:37:00

Сообщение Alex. S »

arriah, может зря лезу, но когда я создавал TreeView, использовал чистый WinApi, и сам вёл список узлов (Node), может Вам тоже завести такой список, и работать с ним?
Ответить