TreeView

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

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

TreeView

Сообщение arriah » 06.12.2016 17:48:37

Привет всем.

Помогите с динамическим созданием 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

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

Re: TreeView

Сообщение Лекс Айрин » 06.12.2016 17:58:01

Код: Выделить всё
if pos('<title>',DataLink[k])>0 then TreeView1.Items.AddChild(Node,DataLink[k]);

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

Re: TreeView

Сообщение arriah » 07.12.2016 16:47:36

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

На данный момент 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?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TreeView

Сообщение serbod » 08.12.2016 10:49:07

FPrevBrother может ссылаться на уже убитую ноду. Ссылка (указатель) есть, а объект уже убит.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: TreeView

Сообщение arriah » 08.12.2016 13:23:52

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

И как этого можно избежать?
При построении деревая не использую никаких указателей.. обычное добавлене add и addchild
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TreeView

Сообщение Alex. S » 23.12.2016 11:41:44

arriah, может зря лезу, но когда я создавал TreeView, использовал чистый WinApi, и сам вёл список узлов (Node), может Вам тоже завести такой список, и работать с ним?
Alex. S
новенький
 
Сообщения: 39
Зарегистрирован: 22.08.2015 11:37:00


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru