Страница 1 из 1

TreeView

СообщениеДобавлено: 06.12.2016 17:48:37
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

Помогите разобраться

Re: TreeView

СообщениеДобавлено: 06.12.2016 17:58:01
Лекс Айрин
Код: Выделить всё
if pos('<title>',DataLink[k])>0 then TreeView1.Items.AddChild(Node,DataLink[k]);

ты создаешь подпункт и переходишь на него (уже он становится текущим.). Просто далее перейди на уровень выше (или запомни текущий пункт и в цикле возвращайся к нему.)

Re: TreeView

СообщениеДобавлено: 07.12.2016 16:47:36
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?

Re: TreeView

СообщениеДобавлено: 08.12.2016 10:49:07
serbod
FPrevBrother может ссылаться на уже убитую ноду. Ссылка (указатель) есть, а объект уже убит.

Re: TreeView

СообщениеДобавлено: 08.12.2016 13:23:52
arriah
serbod писал(а):FPrevBrother может ссылаться на уже убитую ноду. Ссылка (указатель) есть, а объект уже убит.

И как этого можно избежать?
При построении деревая не использую никаких указателей.. обычное добавлене add и addchild

Re: TreeView

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