Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Мне нужно добавить дочерний элемент в список. Перепробовала много вариантов.
Вот простой код (потом я собираюсь добавлять элементы через цикл). //РОДИТЕЛЬСКИЕ ЭЛЕМЕНТЫ TreeView1.Items.Add(Node, 'Data[1]'); TreeView1.Items.Add(Node, 'Data[2]'); TreeView1.Items.Add(Node, 'Data[3]'); TreeView1.Items.Add(Node, 'Data[4]'); TreeView1.Items.Add(Node, 'Data[5]'); TreeView1.Items.Add(Node, 'Data[6]'); if TreeView1.Items.Item[0].Level = 0 then begin item := TreeView1.Items.Item[0]; TreeView1.Items.AddChild(item, 'Item1'); TreeView1.Items.AddChild(item, 'Item2'); end; if TreeView1.Items.Item[1].Level = 0 then begin item := TreeView1.Items.Item[1]; TreeView1.Items.AddChild(item, 'Item1'); TreeView1.Items.AddChild(item, 'Item2'); end; Нужно добавлять в первый и второй родительский элемент, но добавляется почему-то только первый, если убрать первое условие, где проверка осуществляется на уровень первого элемента, то добавляется во второй родительский элемент, стоит вернуть первое условие, то добавление происходит в первый родительский элемент. Как сделать добавление в первое и второй родительский элемент? Потом я буду это выводить в цикле. Также мне важно знать как добавить в дочерний элементы (созданные в родительских элементах) еще одни дочернии элементы. Пример на картинке. Прикреплённый файлscreen4.jpg (11,22 Кбайт, скачиваний: 9) |
Сообщ.
#2
,
|
|
|
procedure TForm1.Button1Click(Sender: TObject); var Node: TTreeNode; begin Node := TreeView1.Items.Add(nil, 'Data[1]'); TreeView1.Items.AddChild(Node, 'Item1'); // Data[1] -> Item1 Node := TreeView1.Items.AddChild(Node, 'Item2'); // Data[1] -> Item2 TreeView1.Items.AddChild(Node, 'Item1'); // Data[2] -> Item2 -> Item1 TreeView1.Items.AddChild(Node, 'Item2'); // Data[2] -> Item2 -> Item2 TreeView1.Items.AddChild(Node, 'Item3'); // Data[2] -> Item2 -> Item3 TreeView1.Items.AddChild(Node, 'Item4'); // Data[2] -> Item2 -> Item4 Node := TreeView1.Items.Add(nil, 'Data[2]'); TreeView1.Items.AddChild(Node, 'Item1'); // Data[2] -> Item1 TreeView1.Items.AddChild(Node, 'Item2'); // Data[2] -> Item2 TreeView1.Items.Add(nil, 'Data[3]'); TreeView1.Items.AddChild(Node, 'Item3'); // Data[2] -> Item3 TreeView1.Items.AddChild(Node, 'Item4'); // Data[2] -> Item4 Node := TreeView1.Items.Add(nil, 'Data[4]'); TreeView1.Items.Add(nil, 'Data[5]'); TreeView1.Items.AddChild(Node, 'Item1'); // Data[4] -> Item1 TreeView1.Items.AddChild(Node, 'Item2'); // Data[4] -> Item2 TreeView1.Items.Add(nil, 'Data[6]'); TreeView1.Items.AddChild(Node, 'Item3'); // Data[4] -> Item3 TreeView1.Items.AddChild(Node, 'Item4'); // Data[4] -> Item4 end; Прикреплённый файлTTreeView.png (20,74 Кбайт, скачиваний: 59) |
Сообщ.
#3
,
|
|
|
macomics, спасибо после вашего примера я сразу поняла как выводить через цикл.
|
Сообщ.
#4
,
|
|
|
Вот так можно перечислить Node одного уровня без проверки Level
Node := Node.GetNextChild(Node); Node := TreeView1.Itemsю.GetFirstNode; repeat // Действия над текущим Node Node := Node.GetNextChild(Node); until Node = nil; |
Сообщ.
#5
,
|
|
|
Как поменять данные в дереве изменив только один Index. Допустим у меня данные однотипные и структура выглядит как массив, соответственно в каждом родителе содержатся одинаковы набор данных. Мне нужно изменить скажем во втором родителе, один текст. Я пыталась сделать это вот так.
TreeView1.Items[1].Item[2].Item[0].Text:='ok'; //Где Items[1] - массив Data1 //Item[2] - массив Status //Item[0] - текст В итоге я получаю ошибку. Цитата List Index out of bounds (1) Как мне изменить данные, поменяв только один Index, допустим вот здесь. Прикреплённый файлscreen5.jpg (20,93 Кбайт, скачиваний: 56) |
Сообщ.
#6
,
|
|
|
Это все потому, что вы обращаетесь со TreeView как с массивом. Хотя элементы в Items и индексируются линейно, но они организованы в древовидную структуру и не привязаны к индексам в Items строго. Для работы с элементами описанной мной ранее структуры попробуйте сделать так.
Node := TreeView1.Items.GetFirstNode; // Data[1] // ^-- В этом Items элементы индексируются линейно вне зависимости от уровня вложенности. GetFirstNode вернет старший корневой элемент. Caption := Node.Item[1].Item[2].Text; // Data[1] -> Item2 -> Item3 А вот элементы в объекте Node.Item уже представляют из себя массив дочерних элементов без вложений. |
Сообщ.
#7
,
|
|
|
У Node нет свойства Items (список на картинке).
Прикреплённый файлscreen6.jpg (14,65 Кбайт, скачиваний: 52) |
Сообщ.
#8
,
|
|
|
TreeView1.TopItem.getNextSibling.Item[2].Item[0].text:='ok'; |
Сообщ.
#9
,
|
|
|
Цитата TreeView1.TopItem.getNextSibling.Item[2].Item[0].text:='ok'; Поменять параметры "индекса" не получается при попытке выдает ошибку: Цитата List Index out of bounds (1) Это фиксированные параметры индекса, которые не меняются. Моя цель, чтобы в таймере каждую секунду проходился про древовидному списку и менял значение на ok, разумеется через таймер. Количество данных практически одинаковое. Дерево на картинке: Прикреплённый файлscreen7.jpg (33,89 Кбайт, скачиваний: 61) |
Сообщ.
#10
,
|
|
|
unit unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Timer1: TTimer; TreeView1: TTreeView; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public Node: TTreeNode; end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); var i: LongInt; begin with TreeView1.Items do begin Node := Add(nil, 'Data[1]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := Add(nil, 'Data[2]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := Add(nil, 'Data[3]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := Add(nil, 'Data[4]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := Add(nil, 'Data[5]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := Add(nil, 'Data[6]'); AddChild(Node, 'Title1'); AddChild(Node, 'Text1'); Node := AddChild(Node, 'Status'); AddChild(Node, 'wait'); Node := GetFirstNode; end; TreeView1.FullExpand; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Node.Items[2].Items[0].Text := 'ok'; Node := Node.GetNextChild(Node); if Node = nil then Timer1.Enabled := False; end; initialization {$I unit3.lrs} end. Прикреплённый файлTreeView1.png (16,96 Кбайт, скачиваний: 48) |
Сообщ.
#11
,
|
|
|
macomics, ваш пример заработал, Node я определяю также:
Цитата Node: TTreeNode; Единственное отличие свойство Items нужно заменить на Item. Вот так: Цитата Node.Item[2].Item[0].Text := 'ok'; Так как у меня не Lazarus, а Delphi7. |
Сообщ.
#12
,
|
|
|
Действительно отличаются. Откопал свою старую книгу, по которой начинал изучать Delphi 7 и там у TTreeNode описан массив Item, а в Lazarus под Linux Items. Но это не страшно.
Цитата Katerina1993 @ Цитата Node.Item[2].Item[0].Text := 'ok'; Так как у меня не Lazarus, а Delphi7. Вот поэтому то я и упомянул Lazarus. Я знаю, что у вас Delphi 7. |
Сообщ.
#13
,
|
|
|
Создала еще вложенный дочерний элемент под название img, в нем будет содержаться данные о некоторых картинках, ключевое слово big(будет еще small, т.е. два варианта). Количество big в Data[0..9] означает количество изображений. Пример на картинке.
Прикреплённый файлscreen8.jpg (32,53 Кбайт, скачиваний: 58) У big есть два параметра type1 и wait. Wait – это что-то вроде status, у родительского элемента data. Здесь он будет принимать два параметра wait и ok. Мне нужно запустить дополнительные цикл, который будет проходить по всем изображением внутри всех родительских элементов Data[0..9] и ставить ok. Только это процедура должна проходить соблюдая чередность, сначала везде проставиться ok у картинок Data[0], закончив устанавливать параметр у картинок Data[0], переходить к Data[1] и т.д. Интервал прохождения одна секунда, если 5 изображений то время затрачено 5 секунд. На счет статуса (status) Data, он будет принимать три параметра ok, wait и current. Большинство из них параметр wait, как на скриншоте. Прикреплённый файлscreen9.jpg (36,86 Кбайт, скачиваний: 53) После завершения прохода одного из родительского элемента ему автоматически присваивается status ok. При переходе на следующий уровень Data[1] или Data[2] им присваивается статус– current (текущий), он может быть один в дереве, пока идет процесс текущего родительского объекта. Это можно увидеть на картинке ниже. Прикреплённый файлscreen10.jpg (36,69 Кбайт, скачиваний: 49) После прохождения по картинкам, статус меняется на “ok”, т.е. процесс завершен. Разумеется само дерево было сделано для наглядности, в основном все переменные я собираюсь хранить в массиве (record). Как мне примерно сделать такие проходы много-уровневые с изменением статуса? Вот мой код: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; TreeView1: TTreeView; Label1: TLabel; procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } vetka,text,data1,item1,Node,Node3: TTreeNode; end; TText=record description: String; end; TItem=record text: TText; end; TSmall=record status:String; width:Integer; height:Integer; type1:String; end; TBig=record status:String; width:Integer; height:Integer; type1:String; end; TImage=record big:TBig; small:TSmall; end; TIndex=record title : String; text: String; status : String; item:TItem; img:array of TImage; end; type TData = array of TIndex; var Form1: TForm1; Data: TData; st: String; t:Integer = 0; Index:Integer = 0; MaxSet:Integer=0; implementation {$R *.dfm} //Пример записи в массив procedure TForm1.FormShow(Sender: TObject); var i,j: Integer; vetka,text,data1,item1,Node,Node1,Node2: TTreeNode; begin for I := Low(Data) to High(Data) do begin data1:=TreeView1.Items.Add(nil,'Data['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(data1,'Title'+IntToStr(i+1)); Node:=TreeView1.Items.AddChild(Node,Data[i].title); Node:=TreeView1.Items.AddChild(data1,'Text'+IntToStr(i+1)); Node:=TreeView1.Items.AddChild(Node,Data[i].text); Node:=TreeView1.Items.AddChild(data1,'Status'+IntToStr(i+1)); Node:=TreeView1.Items.AddChild(Node,Data[i].status); Node:=TreeView1.Items.AddChild(data1,'item0'); Node:=TreeView1.Items.AddChild(Node,'Text'); Node:=TreeView1.Items.AddChild(Node, 'Description'); Node:=TreeView1.Items.AddChild(Node,Data[i].item.text.description); Node1:=TreeView1.Items.AddChild(data1,'img'); for J := Low(Data[i].img) to High(Data[i].img) do begin Node2:=TreeView1.Items.AddChild(Node1,'big'); Node:=TreeView1.Items.AddChild(Node2,Data[i].img[j].big.status); Node:=TreeView1.Items.AddChild(Node2,Data[i].img[j].big.type1); end; end; Node3 := TreeView1.Items.GetFirstNode; end; procedure TForm1.FormCreate(Sender: TObject); begin //В ДОКУМЕНТЕ МАССИВ СОСТОИТ ИЗ 10 ЭЛЕМЕНТОВ, устанавливаем SetLength. SetLength(Data,9); //Резервируем место для нового массива где будут хранится дополнительные данные //ДОПОЛНИТЕЛЬНЫЕ ДАННЫЕ ПОМЕЧЕНЫ КОММЕНТАРИИ НИЖЕ SetLength(Data[0].img,5); SetLength(Data[1].img,3); SetLength(Data[2].img,4); SetLength(Data[3].img,2); SetLength(Data[4].img,7); SetLength(Data[5].img,3); SetLength(Data[6].img,4); SetLength(Data[7].img,8); SetLength(Data[8].img,3); SetLength(Data[9].img,4); Data[0].title:='Название'; Data[0].text:='Мой текст'; Data[0].status:='current'; Data[0].item.text.description:='Описание 1'; //Data[0] --> img[0..4] ******************************************************** Data[0].img[0].big.type1:='test1'; Data[0].img[1].big.type1:='test2'; Data[0].img[2].big.type1:='test3'; Data[0].img[3].big.type1:='test4'; Data[0].img[4].big.type1:='test5'; Data[0].img[0].big.status:='wait'; Data[0].img[1].big.status:='wait'; Data[0].img[2].big.status:='wait'; Data[0].img[3].big.status:='wait'; Data[0].img[4].big.status:='wait'; //END DATA[0] --> img[0..4]***************************************************** Data[1].title:='Название 1'; Data[1].text:='Мой текст 1'; Data[1].status:='wait'; Data[1].item.text.description:='Описание 2'; //Data[1] --> img[0..2] ******************************************************** Data[1].img[0].big.type1:='test1'; Data[1].img[1].big.type1:='test2'; Data[1].img[2].big.type1:='test3'; Data[1].img[0].big.status:='wait'; Data[1].img[1].big.status:='wait'; Data[1].img[2].big.status:='wait'; //END DATA[1] --> img[0..2] **************************************************** Data[2].title:='Название 2'; Data[2].text:='Мой текст 2'; Data[2].status:='wait'; Data[2].item.text.description:='Описание 3'; //Data[2] --> img[0..3] ******************************************************** Data[2].img[0].big.type1:='test1'; Data[2].img[1].big.type1:='test2'; Data[2].img[2].big.type1:='test3'; Data[2].img[3].big.type1:='test4'; Data[2].img[0].big.status:='wait'; Data[2].img[1].big.status:='wait'; Data[2].img[2].big.status:='wait'; Data[2].img[3].big.status:='wait'; //END DATA[2] --> img[0..3] **************************************************** Data[3].title:='Название 3'; Data[3].text:='Мой текст 3'; Data[3].status:='wait'; Data[3].item.text.description:='Описание 4'; //Data[3] --> img[0..1] ******************************************************** Data[3].img[0].big.type1:='test1'; Data[3].img[1].big.type1:='test2'; Data[3].img[0].big.status:='wait'; Data[3].img[1].big.status:='wait'; //END DATA[3] --> img[0..1] **************************************************** Data[4].title:='Название 4'; Data[4].text:='Мой текст 4'; Data[4].status:='wait'; Data[4].item.text.description:='Описание 5'; //Data[4] --> img[0..6] ******************************************************** Data[4].img[0].big.type1:='test1'; Data[4].img[1].big.type1:='test2'; Data[4].img[2].big.type1:='test3'; Data[4].img[3].big.type1:='test4'; Data[4].img[4].big.type1:='test5'; Data[4].img[5].big.type1:='test6'; Data[4].img[6].big.type1:='test7'; Data[4].img[0].big.status:='wait'; Data[4].img[1].big.status:='wait'; Data[4].img[2].big.status:='wait'; Data[4].img[3].big.status:='wait'; Data[4].img[4].big.status:='wait'; Data[4].img[5].big.status:='wait'; Data[4].img[6].big.status:='wait'; //END DATA[4] --> img[0..6] **************************************************** Data[5].title:='Название 5'; Data[5].text:='Мой текст 5'; Data[5].status:='wait'; Data[5].item.text.description:='Описание 6'; //Data[5] --> img[0..2] ******************************************************** Data[5].img[0].big.type1:='test1'; Data[5].img[1].big.type1:='test2'; Data[5].img[2].big.type1:='test3'; Data[5].img[0].big.status:='wait'; Data[5].img[1].big.status:='wait'; Data[5].img[2].big.status:='wait'; //END DATA[5] --> img[0..2] **************************************************** Data[6].title:='Название 6'; Data[6].text:='Мой текст 6'; Data[6].status:='wait'; Data[6].item.text.description:='Описание 7'; //Data[6] --> img[0..3] ******************************************************** Data[6].img[0].big.type1:='test1'; Data[6].img[1].big.type1:='test2'; Data[6].img[2].big.type1:='test3'; Data[6].img[3].big.type1:='test4'; Data[6].img[0].big.status:='wait'; Data[6].img[1].big.status:='wait'; Data[6].img[2].big.status:='wait'; Data[6].img[3].big.status:='wait'; //END DATA[6] --> img[0..3] **************************************************** Data[7].title:='Название 7'; Data[7].text:='Мой текст 7'; Data[7].status:='wait'; Data[7].item.text.description:='Описание 8'; //Data[7] --> img[0..7] ******************************************************** Data[7].img[0].big.type1:='test1'; Data[7].img[1].big.type1:='test1'; Data[7].img[2].big.type1:='test1'; Data[7].img[3].big.type1:='test1'; Data[7].img[4].big.type1:='test1'; Data[7].img[5].big.type1:='test1'; Data[7].img[6].big.type1:='test1'; Data[7].img[7].big.type1:='test1'; Data[7].img[0].big.status:='wait'; Data[7].img[1].big.status:='wait'; Data[7].img[2].big.status:='wait'; Data[7].img[3].big.status:='wait'; Data[7].img[4].big.status:='wait'; Data[7].img[5].big.status:='wait'; Data[7].img[6].big.status:='wait'; Data[7].img[7].big.status:='wait'; //END DATA[7] --> img[0..7] **************************************************** Data[8].title:='Название 8'; Data[8].text:='Мой текст 8'; Data[8].status:='wait'; Data[8].item.text.description:='Описание 9'; //Data[8] --> img[0..2] ******************************************************** Data[8].img[0].big.type1:='test1'; Data[8].img[1].big.type1:='test1'; Data[8].img[2].big.type1:='test1'; Data[8].img[0].big.status:='wait'; Data[8].img[1].big.status:='wait'; Data[8].img[2].big.status:='wait'; MaxSet:=5; Label1.Caption:='Макс '+IntToStr(MaxSet)+' сек: '+IntToStr(t); //END DATA[8] --> img[0..2] **************************************************** //Data[9].img[0].big.type1:='test1'; //Data[9].img[1].big.type1:='test1'; //Data[9].img[2].big.type1:='test1'; //Data[9].img[3].big.type1:='test1'; //Data[9].img[0].big.status:='wait'; //Data[9].img[1].big.status:='wait'; //Data[9].img[2].big.status:='wait'; //Data[9].img[3].big.status:='wait'; //******************************************************** end; procedure TForm1.Timer1Timer(Sender: TObject); begin inc(t); if t>MaxSet then begin inc(Index); t:=1; Node3.Item[2].Item[0].text:='ok'; Node3 := Node3.GetNextChild(Node3); end; Label1.Caption:='Макс '+IntToStr(MaxSet)+' сек: '+IntToStr(t); if Node3 = nil then Timer1.Enabled := False; end; end. |
Сообщ.
#14
,
|
|
|
Так в чем собственно проблема. Вместе с Node определяете переменную Index типа Integer и в ней осуществляете проход по картинкам.
procedure TForm1.Timer1Timer(Sender: TObject); begin with Node.Item[3] do begin if Index < Count then Item[Index].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index); if Index >= Count then repeat with Node.Item[2] do begin Text := 'ok'; // Data[Node] -> Status Node := Node.GetNextChild(Node); // Data[Node++] -- Переходим к следующей Text := 'current'; // Data[Node] -> Status Index := Low(Node.Item); end; until Count > 0; // Пройти все Data[Node], у которых нет картинок, без задержки. // Чтобы на каждой Data[Node] Без картинок задержаться на 1 интервал таймера просто // уберите цикл repeat ... until Count > 0 оставив внутреннее содержимое без цикла. end; end; Node := TreeView1.Items.GetFirstNode; Node.Item[2].Text := 'current'; Index := Low(Node.Item); Timer1.Enabled := True; // Запустили таймер |
Сообщ.
#15
,
|
|
|
Цитата Low(Node.Item) Не работает, я уже создала новый проект, чтобы протестировать отдельно эту функцию. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) TreeView1: TTreeView; Button1: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Node1:TTreeNode; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin Node1 := TreeView1.Items.GetFirstNode; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(Low(Node1.Item))); ShowMessage(Node1.Item[1].text); Node1 := Node1.GetNextChild(Node1); if Node1 = nil then Button1.Enabled := False; end; end. Получаю сообщение об ошибке. Цитата [Error] Unit1.pas(36): '[' expected but ')' found |