Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.161.95] |
|
Сообщ.
#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 Кбайт, скачиваний: 60) |
Сообщ.
#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 Кбайт, скачиваний: 58) |
Сообщ.
#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 Кбайт, скачиваний: 53) |
Сообщ.
#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 Кбайт, скачиваний: 63) |
Сообщ.
#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 Кбайт, скачиваний: 49) |
Сообщ.
#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 Кбайт, скачиваний: 59) У 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 Кбайт, скачиваний: 54) После завершения прохода одного из родительского элемента ему автоматически присваивается status ok. При переходе на следующий уровень Data[1] или Data[2] им присваивается статус– current (текущий), он может быть один в дереве, пока идет процесс текущего родительского объекта. Это можно увидеть на картинке ниже. Прикреплённый файлscreen10.jpg (36,69 Кбайт, скачиваний: 50) После прохождения по картинкам, статус меняется на “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 |
Сообщ.
#16
,
|
|
|
Тогда просто присваивайте 0 вместо Low(Node.Item).
|
Сообщ.
#17
,
|
|
|
Почти получилось, пришлось переделать индексы под свой вариант иначе выдовало ошибку, однако при прохожде картинок когда завершается цикл и происходи переход на следующую data, все равно статус у предыдущего элемента (родителя) остается current, хотя автоматически должен быть ok.
Однако если убрать эту строчку (она указана стрелкой в коде), то программа присваивает предыдущему значению ok. Хотя последовательность действий нужно сделать так сначала wait, потом когда дойдет очередь до элемента (родителя) current и только после прохождения всех итераций в родительском элементе сделать статус ok. Я не знаю может следует добавить еще какое-нибудь условие? with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat with Node3.Item[2] do begin Item[0].Text := 'ok'; // Data[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Data[Node++] -- Переходим к следующей Item[0].Text := 'current'; <--- ВОТ ЭТУ СТРОЧКУ Index1 := Low(0); end until Count > 0; end; |
Сообщ.
#18
,
|
|
|
Добавьте к коду запуска таймера следующий фрагмент.
Node := TreeView1.Items.GetFirstNode; if Node3 <> nil then Node3.Item[2].Text := 'current'; // Установить у Data[0] -> Status = current Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Item[0].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; // Всем картинкам тоже установить статус wait Node3 := Node3.GetNextChild(Node3); end; Index1 := 0; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер procedure TForm1.Timer1Timer(Sender: TObject); begin with Node3.Item[4] do begin if Index < Count then Item[Index1].Item[0].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then with Node3.Item[2] do begin Text := 'ok'; // У этой Data все картинки закончились. Изменяем статус Data c current на ok одновременно с установкой статуса у последней картинки в ok Node3 := Node3.GetNextChild(Node3); // -- Переходим к следующей Text := 'current'; // У следующей Data изменяем статус из wait в current одновременно с изменением статуса у последней картинки у предыдущей Data и изменением статуса предыдущей Data из current на ok Index1 := 0; // Сброс счетчика картинок end; end; end; Node := TreeView1.Items.GetFirstNode; if Node3 <> nil then Node3.Item[2].Text := 'current'; // Установить у Data[0] -> Status = current Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Item[0].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; // Всем картинкам тоже установить статус wait Node3 := Node3.GetNextChild(Node3); end; Index1 := -1; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер // ... procedure TForm1.Timer1Timer(Sender: TObject); begin case Index1 of -2: begin Node3.Item[2].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; end; -1: Node3.Item[2].Text := 'ok'; else with Node3.Item[4] do begin if Index < Count then Item[Index1].Item[0].Text := 'ok'; if Index1 >= Count then Index1 := -3; // Потом все равно будет inc(Index1) и значение станет -2. Как раз первый вариант case Index1 of end; inc(Index1); end; |
Сообщ.
#19
,
|
|
|
Я сейчас посмотрел несколько сайтов по конструкции FOR почитала документацию и не нашла пример такой конструкции.
for Index1 := 0 to Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; Вы уверены, что здесь нет ошибки. Может такая конструкция используется в более поздней версии Delphi но у меня выдает ошибку. Цитата [Error] Unit1.pas(115): Incompatible types: 'Integer' and 'procedure, untyped pointer or untyped parameter' |
Сообщ.
#20
,
|
|
|
Это все из-за сонного состояния. Набирал в браузере. Естественно не допечатал кусок.
for Index1 := 0 to Node3.Count - 1 do Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; |
Сообщ.
#21
,
|
|
|
Вроде получилось, в коде есть некоторая проблема, например в Timer когда проходит итерация, вы используете with Node3.Item[2] do begin, при этом вызываете в дальнейшем text, это понятно так как with присоединяет компонент к свойствам. Однако из-за этого почему-то предыдущий элемент не заменяется на ok, а по прежнему остается current, но если вместо этого:
with Node3.Item[2] do begin Text := 'ok'; // У этой Data все картинки закончились. Изменяем статус Data c current на ok одновременно с установкой статуса у последней картинки в ok Node3 := Node3.GetNextChild(Node3); // -- Переходим к следующей Text := 'current'; // У следующей Data изменяем статус из wait в current одновременно с изменением статуса у последней картинки у предыдущей Data и изменением статуса предыдущей Data из current на ok Index1 := 0; // Сброс счетчика картинок end; Заменить на это, то все работает: with Node3.Item[2] do begin //Изменила некоторые параметры, так как у меня другой уровень вложенности дерева Node3.Item[2].Item[0].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); Node3.Item[2].Item[0].Text := 'current'; Index1 := 0; end; В FormShow у меня другой уровень вложенности, поэтому я код изменила. while Node3 <> nil do begin Node3.Item[2].Item[0].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Count - 1 do Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; Node3 := Node3.GetNextChild(Node3); end; Index1 := 0; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер Добавлено Я проверила еще раз на самом деле первоначальный вариант, через repeat ... until был более правильный, потому что без него итерация над картинками происходит только Data[0], потом процесс останавливается. repeat...util, нужно только слегка изменить на основе предыдущего фрагмента кода. procedure TForm1.Timer1Timer(Sender: TObject); begin //ShowMessage(IntToStr(Node3.Item[4].Count)); with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat with Node3.Item[2] do begin Node3.Item[2].Item[0].Text := 'ok'; // Data[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Data[Node++] -- Переходим к следующей Node3.Item[2].Item[0].Text := 'current'; Index1 := Low(0); end until Count > 0; end; end; |
Сообщ.
#22
,
|
|
|
Проверила полностью, ошибка правда в конце появляется, по завершению всех процессов.
Прикреплённый файлscreen11.jpg (43,26 Кбайт, скачиваний: 49) |
Сообщ.
#23
,
|
|
|
Таймер надо останавливать, когда переход к следующему Data не удался (конец списка)
if Node3 = nil then Timer1.Enabled := False else Node3.Item[2].Item[0].Text := 'current'; Но раз не работает, тогда его тоже убирайте. procedure TForm1.Timer1Timer(Sender: TObject); begin //ShowMessage(IntToStr(Node3.Item[4].Count)); with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat Node3.Item[2].Item[0].Text := 'ok'; // Data[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Data[Node++] -- Переходим к следующей if Node3 = nil then begin Timer1.Enabled := False; break; end else begin Node3.Item[2].Item[0].Text := 'current'; Index1 := 0; end; until Node3.Item[4].Count > 0; end; end; |
Сообщ.
#24
,
|
|
|
Я сейчас разбираю вот этот код.
case Index1 of -2: begin Node3.Item[2].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; end; -1: Node3.Item[2].Text := 'ok'; else with Node3.Item[4] do begin if Index < Count then Item[Index1].Item[0].Text := 'ok'; //ShowMessage(IntToStr(Index1)); if Index1 >= Count then begin Index1 := -3; // Потом все равно будет inc(Index1) и значение станет -2. Как раз первый вариант case Index1 of end; end; inc(Index1); В процедуре FormShow, добавлен Index1 := -1;, это значит что Timer прибавит единицу и продолжит с нуля и если например количество картинок у меня 5, то проход по всем картинкам завершится на цифре 4. Значит вот это условие, никогда не сработает. if Index1 >= Count then begin Index1 := -3; // Потом все равно будет inc(Index1) и значение станет -2. Как раз первый вариант case Index1 of end; В итоге Index1 продолжает увеличения и сейчас я постоянно получаю ошибку выхода из диапазона. Цитата List index out of bounds (0) |
Сообщ.
#25
,
|
|
|
else пропустил. Там все нормально должно быть вот так
Node := TreeView1.Items.GetFirstNode; if Node3 <> nil then Node3.Item[2].Text := 'current'; // Установить у Data[0] -> Status = current Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Item[2].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; // Всем картинкам тоже установить статус wait Node3 := Node3.GetNextChild(Node3); end; Index1 := -1; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер // ... procedure TForm1.Timer1Timer(Sender: TObject); begin case Index1 of -1: Node3.Item[2].Text := 'current'; else with Node3.Item[4] do // Так лучше, чтобы не было лишней задержки. if Index1 >= Count then begin Node3.Item[2].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; Index1 := -2; // Потом все равно будет inc(Index1) и значение станет -1. Как раз первый вариант case Index1 of end else Item[Index1].Item[0].Text := 'ok'; end; inc(Index1); end; |
Сообщ.
#26
,
|
|
|
Я опять изменила свой код в соотвествии со своим уровнем вложенности.
Вот пример, без задержки между переходами родительских элементов. with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat Node3.Item[2].Item[0].Text := 'ok'; // Data[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Data[Node++] -- Переходим к следующей if Node3 = nil then begin Timer1.Enabled := False; break; end else begin Node3.Item[2].Item[0].Text := 'current'; Index1 := 0; end; until Node3.Item[4].Count > 0; end; С задержкой между переходами родительских элементов. case Index1 of -1: Node3.Item[2].Item[0].Text := 'current'; else with Node3.Item[4] do begin // Так лучше, чтобы не было лишней задержки. if Index1 >= Count then begin Node3.Item[2].Item[0].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; Index1 := -2; // Потом все равно будет inc(Index1) и значение станет -1. Как раз первый вариант case Index1 of end else Item[Index1].Item[0].Text := 'ok'; end; end; inc(Index1); |
Сообщ.
#27
,
|
|
|
unit unit3; {$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 Node3: TTreeNode; Index1: LongInt; end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); var i: LongInt; m, n: TTreeNode; begin with TreeView1.Items do begin n := Add(nil, 'Data[1]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); n := AddChild(n, 'img'); m := AddChild(n, 'index[0]'); AddChild(m, ''); m := AddChild(n, 'index[1]'); AddChild(m, ''); m := AddChild(n, 'index[2]'); AddChild(m, ''); m := AddChild(n, 'index[3]'); AddChild(m, ''); n := Add(nil, 'Data[2]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); n := AddChild(n, 'img'); m := AddChild(n, 'index[0]'); AddChild(m, ''); m := AddChild(n, 'index[1]'); AddChild(m, ''); m := AddChild(n, 'index[2]'); AddChild(m, ''); m := AddChild(n, 'index[3]'); AddChild(m, ''); m := AddChild(n, 'index[4]'); AddChild(m, ''); m := AddChild(n, 'index[5]'); AddChild(m, ''); m := AddChild(n, 'index[6]'); AddChild(m, ''); n := Add(nil, 'Data[3]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); n := AddChild(n, 'img'); m := AddChild(n, 'index[0]'); AddChild(m, ''); m := AddChild(n, 'index[1]'); AddChild(m, ''); n := Add(nil, 'Data[4]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); m := AddChild(n, 'img'); n := Add(nil, 'Data[5]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); n := AddChild(n, 'img'); m := AddChild(n, 'index[0]'); AddChild(m, ''); m := AddChild(n, 'index[1]'); AddChild(m, ''); m := AddChild(n, 'index[2]'); AddChild(m, ''); m := AddChild(n, 'index[3]'); AddChild(m, ''); m := AddChild(n, 'index[4]'); AddChild(m, ''); m := AddChild(n, 'index[5]'); AddChild(m, ''); n := Add(nil, 'Data[6]'); AddChild(n, 'Title1'); AddChild(n, 'Text1'); m := AddChild(n, 'Status'); AddChild(m, ''); AddChild(n, 'Other'); n := AddChild(n, 'img'); m := AddChild(n, 'index[0]'); AddChild(m, ''); m := AddChild(n, 'index[1]'); AddChild(m, ''); m := AddChild(n, 'index[2]'); AddChild(m, ''); m := AddChild(n, 'index[3]'); AddChild(m, ''); m := AddChild(n, 'index[4]'); AddChild(m, ''); end; TreeView1.FullExpand; Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Node3.Items[2].Text := 'current'; // Установить у Data[0] -> Status = current for i := 0 to Node3.Items[4].Count - 1 do Node3.Items[4].Items[i].Items[0].Text := 'wait'; // Всем картинкам тоже установить статус wait Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Items[2].Items[0].Text := 'wait'; // У все последующих сбросить статус в wait for i := 0 to Node3.Items[4].Count - 1 do Node3.Items[4].Items[i].Items[0].Text := 'wait'; // Всем картинкам тоже установить статус wait Node3 := Node3.GetNextChild(Node3); end; Index1 := -1; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер end; procedure TForm1.Timer1Timer(Sender: TObject); begin case Index1 of -1: Node3.Items[2].Items[0].Text := 'current'; else with Node3.Items[4] do // Так лучше, чтобы не было лишней задержки. if Index1 >= Count then begin Node3.Items[2].Items[0].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; Index1 := -2; // Потом все равно будет inc(Index1) и значение станет -1. Как раз первый вариант case Index1 of end else Items[Index1].Items[0].Text := 'ok'; end; inc(Index1); end; initialization {$I unit3.lrs} end. |
Сообщ.
#28
,
|
|
|
Спасибо, вот мой вариант под Delphi7.
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; Button1: TButton; 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; Index1:Integer = 0; MaxSet:Integer=0; FullView:Boolean; implementation {$R *.dfm} //Пример записи в массив procedure TForm1.FormShow(Sender: TObject); var i,j,Index1: 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)); Node:=TreeView1.Items.AddChild(Node,Data[i].title); Node:=TreeView1.Items.AddChild(data1,'Text['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Data[i].text); Node:=TreeView1.Items.AddChild(data1,'Status['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Data[i].status); Node:=TreeView1.Items.AddChild(data1,'item['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,'Text'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node, 'Description'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node,Data[i].item.text.description); Node1:=TreeView1.Items.AddChild(data1,'img['+IntToStr(i)+']'); 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; if Node3 <> nil then Node3.Item[2].Item[0].Text := 'current'; // Установить у Data[0] -> Status = current Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Item[2].Item[0].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Count - 1 do Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; Node3 := Node3.GetNextChild(Node3); end; Index1 := 0; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер FullView:=True; 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 //***************************** //*1 Вариант //***************************** //ShowMessage(IntToStr(Node3.Item[4].Count)); with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Data[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat Node3.Item[2].Item[0].Text := 'ok'; // Data[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Data[Node++] -- Переходим к следующей if Node3 = nil then begin Timer1.Enabled := False; break; end else begin Node3.Item[2].Item[0].Text := 'current'; Index1 := 0; end; until Node3.Item[4].Count > 0; end; //***************************** //*2 Вариант //***************************** {case Index1 of -1: Node3.Item[2].Item[0].Text := 'current'; else with Node3.Item[4] do begin // Так лучше, чтобы не было лишней задержки. if Index1 >= Count then begin Node3.Item[2].Item[0].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; Index1 := -2; // Потом все равно будет inc(Index1) и значение станет -1. Как раз первый вариант case Index1 of end else Item[Index1].Item[0].Text := 'ok'; end; end; inc(Index1);} //***************************************************** if FullView then begin TreeView1.FullExpand; FullView:=False; end; end; end. |
Сообщ.
#29
,
|
|
|
Цитата Katerina1993 @ Спасибо, вот мой вариант под Delphi7. В Цитата Katerina1993 @ procedure TForm1.FormCreate(Sender: TObject); строка 147 SetLength(Data[9].img,4); Не закомментировано, поэтому даст access violation. Скрытый текст First chance exception at $768FC3A2. Exception class EAccessViolation with message 'Access violation at address 004055A9 in module 'Project1.exe'. Read of address 6572436A'. Process Project1.exe (3916) У Вас "Data[8]" используется +, а "Data[9]" -> уже закомментировано ниже по коду, не используется. |
Сообщ.
#30
,
|
|
|
Цитата RusSun @ В Цитата Katerina1993 @ Вчера, 16:40 procedure TForm1.FormCreate(Sender: TObject); строка 147 CollapsedWrap disabledLine numbers on SetLength(Data[9].img,4); Не закомментировано, поэтому даст access violation. Скорее надо на 135 строке //В ДОКУМЕНТЕ МАССИВ СОСТОИТ ИЗ 10 ЭЛЕМЕНТОВ, устанавливаем SetLength. SetLength(Data,9); |
Сообщ.
#31
,
|
|
|
RusSun, я понимаю, что массив у меня не совсем правильно реализован. Просто я пока еще не знаю как составить массив из записей, при условии когда в одну запись record, вложен еще один массив, например с картинками и как правильно установить setLength, когда изначально количество картинок неизвестно, например их может быть 2,3 или 5, поэтому нужно как-то сделать массив динамическим, а setLength чтобы мог работать с заранее неизвестным количеством изображений. Единственное что приходит на ум это в главном record где содержится массив с картинками добавить еще одну переменную, например countImg и присваивать ей значение количество картинок, потом использовать эту переменную в setLength вот так.
TImage=record big:TBig; small:TSmall; countImg:Integer; //<-- количество картинок end; |
Сообщ.
#32
,
|
|
|
TImagePixel = packed record case Byte of 0: ( Blue: Byte; Green: Byte; Red: Byte; Alpha: Byte; ); 1: ( color: TColor; ); end; TImageData = packed record Width: LongInt; Height: LongInt; Pixels: array of array of TImagePixel; end; TBig = array of TImageData; TSmall = array of TImageData; TImage = packed record big: TBig; small: TSmall; countImg: Integer; end; TSize = packed record Width: LongInt; Height: LongInt; end; function GetTSize(aWidth: LongInt; aHeight: LongInt): TSize; inline; begin with Result do begin Width := aWidth; Height := aHeight; end; end; function NewTImage(count: LongInt; smallImg: TSize; bigImg: TSize): TImage; inline; var i: LongInt; begin with Result do begin countImg := count; SetLength(big, count); SetLength(small, count); for i := Low(small) to High(small) do with small[i] do begin Width := smallImg.Width; Height := smallImg.Height; SetLength(Pixels, smallImg.Width, smallImg.Height); end; for i := Low(big) to High(big) do with big[i] do begin Width := bigImg.Width; Height := bigImg.Height; SetLength( Pixels, bigImg.Width, bigImg.Height); end; end; end; procedure TForm1Create(Sender: TObject); var Image: TImage; begin Image := NewTImage(10, GetTSize(16, 16), GetTSize(256, 256)); // Выделит 10 маленьких изображений и 10 больших изображений. Общий объем выделенной памяти: // sizeof(Image.big) = 4 // sizeof(Image.small) = 4 // sizeof(Image.countImg) = 4 // i in [0 .. 9] x { // sizeof(Image.big[i].Width) = 4 // sizeof(Image.big[i].Height) = 4 // sizeof(Image.big[i].Pixels) = 4 // j in [0 .. 255] * k in [0 .. 255] x { // sizeof(Image.big[i].Pixels[j,k].color) = 4 // } // sizeof(Image.small[i].Width) = 4 // sizeof(Image.small[i].Height) = 4 // sizeof(Image.small[i].Pixels) = 4 // j in [0 .. 15] * k in [0 .. 15] x { // sizeof(Image.small[i].Pixels[j,k].color) = 4 // } // } // Итого = 12 + 10 * (12 + 256 * 256 * 4 + 12 + 16 * 16 * 4) = 2640372 = 2 Mb + 530 kb + 212 bytes end; |
Сообщ.
#33
,
|
|
|
macomics, Добавила функцию для создания массива и переделала код под себя. Столкнулась с такой проблемой, что в дереве у картинок status не выводится. Протестировала и присвоила любое значение status в функции NewTImage оно выводится, но стоит записать вот так: Цитата status:=big[i].status;, то значение пустое, хотя я обращаюсь к записи Цитата куда отправляется значение статуса картинки. Вот мой код полностью.TImageData = packed record unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Button1: TButton; TreeView1: TTreeView; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TImagePixel = packed record case Byte of 0: ( Blue: Byte; Green: Byte; Red: Byte; Alpha: Byte; ); 1: ( color: TColor; ); end; TImageData = packed record Width: LongInt; Height: LongInt; status:String; type1:String; Pixels: array of array of TImagePixel; end; TBig = array of TImageData; TSmall = array of TImageData; TText=record description: String; end; TItem=record text: TText; end; TImage = packed record big: TBig; small: TSmall; countImg: Integer; //status: String; end; TSize = packed record Width: LongInt; Height: LongInt; Big1 : array of TBig; end; TData = class private sLength : Integer; title : String; text: String; smallImg: TSize; bigImg: TSize; status:String; item:TItem; public constructor Create(_Length:Integer; _smallImg: TSize; _bigImg: TSize); function NewTImage(): TImage; end; var Form1: TForm1; Data : Array Of TData; implementation {$R *.dfm} constructor TData.Create(_Length:Integer;_smallImg: TSize; _bigImg: TSize); begin inherited Create; sLength:=_Length; smallImg:=_smallImg; smallImg:=_bigImg; end; function TData.NewTImage(): TImage; var i: LongInt; begin with Result do begin countImg := sLength; SetLength(big, sLength); SetLength(small, sLength); for i := Low(small) to High(small) do with small[i] do begin Width := smallImg.Width; Height := smallImg.Height; status:=small[i].status; type1:=small[i].type1; SetLength(Pixels, smallImg.Width, smallImg.Height); end; for i := Low(big) to High(big) do with big[i] do begin Width := bigImg.Width; Height := bigImg.Height; status:=big[i].status; type1:=big[i].type1; SetLength( Pixels, bigImg.Width, bigImg.Height); end; end; end; function GetTSize(aWidth: LongInt; aHeight: LongInt): TSize; begin with Result do begin Width := aWidth; Height := aHeight; end; end; procedure TForm1.FormCreate(Sender: TObject); begin setLength(Data,10); Data[0]:=TData.Create(5, GetTSize(16, 16), GetTSize(256, 256)); Data[0].title:='Название'; Data[0].text:='Мой текст'; Data[0].status:='current'; Data[0].item.text.description:='Описание 1'; Data[0].NewTImage.big[0].status:='wait'; Data[0].NewTImage.big[1].status:='wait'; Data[0].NewTImage.big[2].status:='wait'; Data[0].NewTImage.big[3].status:='wait'; Data[0].NewTImage.big[4].status:='wait'; Data[0].NewTImage.big[0].status:='test1'; Data[0].NewTImage.big[1].status:='test2'; Data[0].NewTImage.big[2].status:='test2'; Data[0].NewTImage.big[3].status:='test3'; Data[0].NewTImage.big[4].status:='test4'; Data[1]:=TData.Create(3, GetTSize(16, 16), GetTSize(256, 256)); Data[1].title:='Название 1'; Data[1].text:='Мой текст 1'; Data[1].status:='wait'; Data[1].item.text.description:='Описание 2'; Data[1].NewTImage.big[0].type1:='test1'; Data[1].NewTImage.big[1].type1:='test2'; Data[1].NewTImage.big[2].type1:='test3'; Data[1].NewTImage.big[0].status:='wait'; Data[1].NewTImage.big[1].status:='wait'; Data[1].NewTImage.big[2].status:='wait'; Data[2]:=TData.Create(4, GetTSize(16, 16), GetTSize(256, 256)); Data[2].title:='test'; 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].NewTImage.big[0].type1:='test1'; Data[2].NewTImage.big[1].type1:='test2'; Data[2].NewTImage.big[2].type1:='test3'; Data[2].NewTImage.big[3].type1:='test4'; Data[2].NewTImage.big[0].status:='wait'; Data[2].NewTImage.big[1].status:='wait'; Data[2].NewTImage.big[2].status:='wait'; Data[2].NewTImage.big[3].status:='wait'; Data[3]:=TData.Create(2, GetTSize(16, 16), GetTSize(256, 256)); 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].NewTImage.big[0].type1:='test1'; Data[3].NewTImage.big[1].type1:='test2'; Data[3].NewTImage.big[0].status:='wait'; Data[3].NewTImage.big[1].status:='wait'; Data[4]:=TData.Create(7, GetTSize(16, 16), GetTSize(256, 256)); 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].NewTImage.big[0].type1:='test1'; Data[4].NewTImage.big[1].type1:='test2'; Data[4].NewTImage.big[2].type1:='test3'; Data[4].NewTImage.big[3].type1:='test4'; Data[4].NewTImage.big[4].type1:='test5'; Data[4].NewTImage.big[5].type1:='test6'; Data[4].NewTImage.big[6].type1:='test7'; Data[4].NewTImage.big[0].status:='wait'; Data[4].NewTImage.big[1].status:='wait'; Data[4].NewTImage.big[2].status:='wait'; Data[4].NewTImage.big[3].status:='wait'; Data[4].NewTImage.big[4].status:='wait'; Data[4].NewTImage.big[5].status:='wait'; Data[4].NewTImage.big[6].status:='wait'; Data[5]:=TData.Create(3, GetTSize(16, 16), GetTSize(256, 256)); 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].NewTImage.big[0].type1:='test1'; Data[5].NewTImage.big[1].type1:='test2'; Data[5].NewTImage.big[2].type1:='test3'; Data[5].NewTImage.big[0].status:='wait'; Data[5].NewTImage.big[1].status:='wait'; Data[5].NewTImage.big[2].status:='wait'; Data[6]:=TData.Create(4, GetTSize(16, 16), GetTSize(256, 256)); 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].NewTImage.big[0].type1:='test1'; Data[6].NewTImage.big[1].type1:='test2'; Data[6].NewTImage.big[2].type1:='test3'; Data[6].NewTImage.big[3].type1:='test4'; Data[6].NewTImage.big[0].status:='wait'; Data[6].NewTImage.big[1].status:='wait'; Data[6].NewTImage.big[2].status:='wait'; Data[6].NewTImage.big[3].status:='wait'; Data[7]:=TData.Create(8, GetTSize(16, 16), GetTSize(256, 256)); 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].NewTImage.big[0].type1:='test1'; Data[7].NewTImage.big[1].type1:='test1'; Data[7].NewTImage.big[2].type1:='test1'; Data[7].NewTImage.big[3].type1:='test1'; Data[7].NewTImage.big[4].type1:='test1'; Data[7].NewTImage.big[5].type1:='test1'; Data[7].NewTImage.big[6].type1:='test1'; Data[7].NewTImage.big[7].type1:='test1'; Data[7].NewTImage.big[0].status:='wait'; Data[7].NewTImage.big[1].status:='wait'; Data[7].NewTImage.big[2].status:='wait'; Data[7].NewTImage.big[3].status:='wait'; Data[7].NewTImage.big[4].status:='wait'; Data[7].NewTImage.big[5].status:='wait'; Data[7].NewTImage.big[6].status:='wait'; Data[7].NewTImage.big[7].status:='wait'; Data[8]:=TData.Create(3, GetTSize(16, 16), GetTSize(256, 256)); Data[8].title:='Название 8'; Data[8].text:='Мой текст 8'; Data[8].status:='wait'; Data[8].item.text.description:='Описание 8'; //Data[8] --> img[0..2] ******************************************************** Data[8].NewTImage.big[0].type1:='test1'; Data[8].NewTImage.big[1].type1:='test1'; Data[8].NewTImage.big[2].type1:='test1'; Data[8].NewTImage.big[0].status:='wait'; Data[8].NewTImage.big[1].status:='wait'; Data[8].NewTImage.big[2].status:='wait'; Data[9]:=TData.Create(4, GetTSize(16, 16), GetTSize(256, 256)); Data[9].title:='Название 9'; Data[9].text:='Мой текст 9'; Data[9].status:='wait'; Data[9].item.text.description:='Описание 9'; //Data[9] --> img[0..3] ******************************************************** Data[9].NewTImage.big[0].type1:='test1'; Data[9].NewTImage.big[1].type1:='test1'; Data[9].NewTImage.big[2].type1:='test1'; Data[9].NewTImage.big[3].type1:='test1'; Data[9].NewTImage.big[0].status:='wait'; Data[9].NewTImage.big[1].status:='wait'; Data[9].NewTImage.big[2].status:='wait'; Data[9].NewTImage.big[3].status:='wait'; end; procedure TForm1.FormShow(Sender: TObject); var i,j,Index1: 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)); Node:=TreeView1.Items.AddChild(Node,Data[i].title); Node:=TreeView1.Items.AddChild(data1,'Text['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Data[i].text); Node:=TreeView1.Items.AddChild(data1,'Status['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Data[i].status); Node:=TreeView1.Items.AddChild(data1,'item['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,'Text'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node, 'Description'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node,Data[i].item.text.description); Node1:=TreeView1.Items.AddChild(data1,'img['+IntToStr(i)+']'); for J := Low(Data[i].NewTImage.big) to High(Data[i].NewTImage.big) do begin // ShowMessage(Data[i].NewTImage.big[j].status); Node2:=TreeView1.Items.AddChild(Node1,'big'); Node:=TreeView1.Items.AddChild(Node2,Data[i].NewTImage.big[j].status); //ЗНАЧЕНИЕ ПУСТОЕ Node:=TreeView1.Items.AddChild(Node2,Data[i].NewTImage.big[j].type1); //ЗДЕСЬ ТОЖЕ ЗНАЧЕНИЕ ПУСТОЕ end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Data[0].NewTImage.big[0].status); //ПРОВЕРКА ПУСТОЕ ЗНАЧЕНИЕ end; end. |
Сообщ.
#34
,
|
|
|
На 96 строке скорее всего надо написать так
bigImg:=_bigImg; Функция NewTImage это и есть конструктор. Зачем вы добавили дополнительный конструктор. Функция NewTImage должна вызываться в конструкторе и больше ни где! Она выделяет память и инициализирует некоторые значения в полях получившейся структуры. После этого вы можете обращаться к полям структуры без вызова этой функции. ShowMessage(Data[0].big[0].status); |
Сообщ.
#35
,
|
|
|
Цитата Зачем вы добавили дополнительный конструктор. Я не до конца поняла как конструктор работает. Он устанавливает значение для определенного количества изображений, но здесь также следует учитывать, что картинки вложены в массив data. Это значит что массив многомерный. Как с этим быть? Например Data[0].img[0..9] <--выбор картинки. |
Сообщ.
#36
,
|
|
|
Вот такую структуру данных создает функция NewTImage в моем исходном варианте
Data[0] := NewTImage(10, GetTSize(16, 16), GetTSize(256, 256)); // Data[0].countImg - количество катринок в массивах big и small (это же значение можно получить через // Length(big) или Length(small) - его можно и не сохранять, но в исходной структуре оно было). // После функции NewTImage равно значению из первого параметра т.е. 10. // Data[0].big[индекс картинки].Width и Data[0].big[индекс картинки].Height - размеры большой картинки // После функции NewTImage равно значению третьего параметра, т.е. Width = 256 и Height = 256 // Data[0].big[индекс картинки].Pixels[Номер строки, Номер столбца].color - цвет пикселя изображения // размером 256 на 256, т.е. Номер строки изменяется в пределах от 0 до 255 и в таких же пределах // изменяется Номер столбца. Значение не инициализировано, но место зарезервировано для загрузки картинки // Data[0].small[индекс картинки].Width и Data[0].small[индекс картинки].Height - размеры малой картинки // После функции NewTImage равно значению второго параметра, т.е. Width = 16 и Height = 16 // Data[0].small[индекс картинки].Pixels[Номер строки, Номер столбца].color - цвет пикселя изображения // размером 16 на 16, т.е. Номер строки изменяется в пределах от 0 до 15 и в таких же пределах // изменяется Номер столбца. Значение не инициализировано, но место зарезервировано для загрузки картинки В вашем случае это будет такая структура Data[0] := TData.Create(5, GetTSize(16, 16), GetTSize(256, 256)); // Data[0].sLength = 4 <- Вы инициализируете это значение в конструкторе // Data[0].title = ??? <- Это значение не инициализировано // Data[0].text = ??? <- Это значение не инициализировано // Data[0].smallImg.Width = 16 <- Вы инициализируете это значение в конструкторе // Data[0].smallImg.Height = 16 <- Вы инициализируете это значение в конструкторе // Data[0].bigImg.Width = 256 <- Вы инициализируете это значение в конструкторе // Data[0].bigImg.Height = 256 <- Вы инициализируете это значение в конструкторе // Data[0].status = ??? <- Это значение не инициализировано // Data[0].item.text = ??? <- Это значение не инициализировано Для того, чтобы не печатать лишний текст используйте для заполнения структуры конструкцию with Data[0] do begin // Далее к полям Data[0] можно обращаться напрямую sLength := 5; end; Добавлено Попробую кратко объяснить что делает эта строка Data[0].NewTImage.big[0].status:='wait'; Data[0].NewTImage.big[1].status:='wait'; Посмотрите мой пример еще раз. На 63 строке я приводил строчку, которая использует мою функцию правильно. Вы потеряли Image := |
Сообщ.
#37
,
|
|
|
Все разобралась, теперь работает.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls; type TForm1 = class(TForm) TreeView1: TTreeView; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } vetka,text,data1,item1,Node,Node3,Node1,Node2: TTreeNode; end; TImagePixel = packed record case Byte of 0: ( Blue: Byte; Green: Byte; Red: Byte; Alpha: Byte; ); 1: ( color: TColor; ); end; TImageData = packed record Width: LongInt; Height: LongInt; status: String; type1: String; Pixels: array of array of TImagePixel; end; TText=record description: String; end; TItem=record text: TText; end; TBig = array of TImageData; TSmall = array of TImageData; TImage = packed record title: String; text: String; status: String; big: TBig; small: TSmall; countImg: Integer; item:TItem; end; TSize = packed record Width: LongInt; Height: LongInt; end; var Form1: TForm1; Image : Array Of TImage; Index1:Integer; implementation {$R *.dfm} function GetTSize(aWidth: LongInt; aHeight: LongInt): TSize; begin with Result do begin Width := aWidth; Height := aHeight; end; end; function NewTImage(count: LongInt; smallImg: TSize; bigImg: TSize): TImage; var i: LongInt; begin with Result do begin countImg := count; SetLength(big, count); SetLength(small, count); for i := Low(small) to High(small) do with small[i] do begin Width := smallImg.Width; Height := smallImg.Height; SetLength(Pixels, smallImg.Width, smallImg.Height); end; for i := Low(big) to High(big) do with big[i] do begin Width := bigImg.Width; Height := bigImg.Height; SetLength( Pixels, bigImg.Width, bigImg.Height); end; end; end; procedure TForm1.FormCreate(Sender: TObject); //Image: TImage; begin setLength(Image,10); Image[0] := NewTImage(4, GetTSize(16, 16), GetTSize(256, 256)); // Выделит 10 маленьких изображений и 10 больших изображений. Общий объем выделенной памяти: // Image[0].countImg := 4; //<- Вы инициализируете это значение в конструкторе Image[0].title := 'Название'; Image[0].text:='Мой текст'; Image[0].status:='current'; Image[0].item.text.description:='Описание 3'; Image[0].big[0].status:='wait'; Image[0].big[1].status:='wait'; Image[0].big[2].status:='wait'; Image[0].big[3].status:='wait'; Image[0].big[0].type1:='test1'; Image[0].big[1].type1:='test2'; Image[0].big[2].type1:='test2'; Image[0].big[3].type1:='test3'; Image[1]:=NewTImage(3, GetTSize(16, 16), GetTSize(256, 256)); Image[1].title:='Название 1'; Image[1].text:='Мой текст 1'; Image[1].status:='wait'; Image[1].item.text.description:='Описание 2'; Image[1].big[0].type1:='test1'; Image[1].big[1].type1:='test2'; Image[1].big[2].type1:='test3'; Image[1].big[0].status:='wait'; Image[1].big[1].status:='wait'; Image[1].big[2].status:='wait'; Image[2]:=NewTImage(4, GetTSize(16, 16), GetTSize(256, 256)); Image[2].title:='test'; Image[2].title:='Название 2'; Image[2].text:='Мой текст 2'; Image[2].status:='wait'; Image[2].item.text.description:='Описание 3'; //Image[2] --> img[0..3] ******************************************************** Image[2].big[0].type1:='test1'; Image[2].big[1].type1:='test2'; Image[2].big[2].type1:='test3'; Image[2].big[3].type1:='test4'; Image[2].big[0].status:='wait'; Image[2].big[1].status:='wait'; Image[2].big[2].status:='wait'; Image[2].big[3].status:='wait'; Image[3]:=NewTImage(2, GetTSize(16, 16), GetTSize(256, 256)); Image[3].title:='Название 3'; Image[3].text:='Мой текст 3'; Image[3].status:='wait'; Image[3].item.text.description:='Описание 4'; //Image[3] --> img[0..1] ******************************************************** Image[3].big[0].type1:='test1'; Image[3].big[1].type1:='test2'; Image[3].big[0].status:='wait'; Image[3].big[1].status:='wait'; Image[4]:=NewTImage(7, GetTSize(16, 16), GetTSize(256, 256)); Image[4].title:='Название 4'; Image[4].text:='Мой текст 4'; Image[4].status:='wait'; Image[4].item.text.description:='Описание 5'; //Image[4] --> img[0..6] ******************************************************** Image[4].big[0].type1:='test1'; Image[4].big[1].type1:='test2'; Image[4].big[2].type1:='test3'; Image[4].big[3].type1:='test4'; Image[4].big[4].type1:='test5'; Image[4].big[5].type1:='test6'; Image[4].big[6].type1:='test7'; Image[4].big[0].status:='wait'; Image[4].big[1].status:='wait'; Image[4].big[2].status:='wait'; Image[4].big[3].status:='wait'; Image[4].big[4].status:='wait'; Image[4].big[5].status:='wait'; Image[4].big[6].status:='wait'; Image[5]:=NewTImage(3, GetTSize(16, 16), GetTSize(256, 256)); Image[5].title:='Название 5'; Image[5].text:='Мой текст 5'; Image[5].status:='wait'; Image[5].item.text.description:='Описание 6'; //Image[5] --> img[0..2] ******************************************************** Image[5].big[0].type1:='test1'; Image[5].big[1].type1:='test2'; Image[5].big[2].type1:='test3'; Image[5].big[0].status:='wait'; Image[5].big[1].status:='wait'; Image[5].big[2].status:='wait'; Image[6]:=NewTImage(4, GetTSize(16, 16), GetTSize(256, 256)); Image[6].title:='Название 6'; Image[6].text:='Мой текст 6'; Image[6].status:='wait'; Image[6].item.text.description:='Описание 7'; //Image[6] --> img[0..3] ******************************************************** Image[6].big[0].type1:='test1'; Image[6].big[1].type1:='test2'; Image[6].big[2].type1:='test3'; Image[6].big[3].type1:='test4'; Image[6].big[0].status:='wait'; Image[6].big[1].status:='wait'; Image[6].big[2].status:='wait'; Image[6].big[3].status:='wait'; Image[7]:=NewTImage(8, GetTSize(16, 16), GetTSize(256, 256)); Image[7].title:='Название 7'; Image[7].text:='Мой текст 7'; Image[7].status:='wait'; Image[7].item.text.description:='Описание 8'; //Image[7] --> img[0..7] ******************************************************** Image[7].big[0].type1:='test1'; Image[7].big[1].type1:='test1'; Image[7].big[2].type1:='test1'; Image[7].big[3].type1:='test1'; Image[7].big[4].type1:='test1'; Image[7].big[5].type1:='test1'; Image[7].big[6].type1:='test1'; Image[7].big[7].type1:='test1'; Image[7].big[0].status:='wait'; Image[7].big[1].status:='wait'; Image[7].big[2].status:='wait'; Image[7].big[3].status:='wait'; Image[7].big[4].status:='wait'; Image[7].big[5].status:='wait'; Image[7].big[6].status:='wait'; Image[7].big[7].status:='wait'; Image[8]:=NewTImage(3, GetTSize(16, 16), GetTSize(256, 256)); Image[8].title:='Название 8'; Image[8].text:='Мой текст 8'; Image[8].status:='wait'; Image[8].item.text.description:='Описание 8'; //Image[8] --> img[0..2] ******************************************************** Image[8].big[0].type1:='test1'; Image[8].big[1].type1:='test1'; Image[8].big[2].type1:='test1'; Image[8].big[0].status:='wait'; Image[8].big[1].status:='wait'; Image[8].big[2].status:='wait'; Image[9]:=NewTImage(4, GetTSize(16, 16), GetTSize(256, 256)); Image[9].title:='Название 9'; Image[9].text:='Мой текст 9'; Image[9].status:='wait'; Image[9].item.text.description:='Описание 9'; //Image[9] --> img[0..3] ******************************************************** Image[9].big[0].type1:='test1'; Image[9].big[1].type1:='test1'; Image[9].big[2].type1:='test1'; Image[9].big[3].type1:='test1'; Image[9].big[0].status:='wait'; Image[9].big[1].status:='wait'; Image[9].big[2].status:='wait'; Image[9].big[3].status:='wait'; end; procedure TForm1.FormShow(Sender: TObject); var i,j,Index1: Integer; //vetka,text,data1,item1,Node: TTreeNode; begin for I := Low(Image) to High(Image) do begin data1:=TreeView1.Items.Add(nil,'Data['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(data1,'Title'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node,Image[i].title); Node:=TreeView1.Items.AddChild(data1,'Text['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Image[i].text); Node:=TreeView1.Items.AddChild(data1,'Status['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,Image[i].status); Node:=TreeView1.Items.AddChild(data1,'item['+IntToStr(i)+']'); Node:=TreeView1.Items.AddChild(Node,'Text'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node, 'Description'+IntToStr(i)); Node:=TreeView1.Items.AddChild(Node,Image[i].item.text.description); Node1:=TreeView1.Items.AddChild(data1,'img['+IntToStr(i)+']'); for J := Low(Image[i].big) to High(Image[i].big) do begin // ShowMessage(Data[i].NewTImage.big[j].status); Node2:=TreeView1.Items.AddChild(Node1,'big'); Node:=TreeView1.Items.AddChild(Node2,Image[i].big[j].status); Node:=TreeView1.Items.AddChild(Node2,Image[i].big[j].type1); end; end; TreeView1.FullExpand; Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Node3.Item[2].Item[0].Text := 'current'; // Установить у Image[0] -> Status = current Node3 := Node3.GetNextChild(Node3); while Node3 <> nil do begin Node3.Item[2].Item[0].Text := 'wait'; // У все последующих сбросить статус в wait for Index1 := 0 to Node3.Item[4].Count - 1 do Node3.Item[4].Item[Index1].Item[0].Text := 'wait'; Node3 := Node3.GetNextChild(Node3); end; Index1 := 0; // Установить начальные значения индексных переменных Node3 := TreeView1.Items.GetFirstNode; if Node3 <> nil then Timer1.Enabled := True; // Запустить таймер end; procedure TForm1.Timer1Timer(Sender: TObject); begin //***************************** //*1 Вариант //***************************** {}with Node3.Item[4] do begin if Index1 < Count then Item[Index1].Item[0].text:='ok'; //Item[Index1].Item[1].Text := 'ok'; // Image[Node] -> Img -> Big[Index] -> Status inc(Index1); if Index1 >= Count then repeat Node3.Item[2].Item[0].Text := 'ok'; // Image[Node] -> Status Node3 := Node3.GetNextChild(Node3); // Image[Node++] -- Переходим к следующей if Node3 = nil then begin Timer1.Enabled := False; break; end else begin Node3.Item[2].Item[0].Text := 'current'; Index1 := 0; end; until Node3.Item[4].Count > 0; end; //***************************** //*2 Вариант //***************************** {case Index1 of -1: Node3.Item[2].Item[0].Text := 'current'; else with Node3.Item[4] do begin // Так лучше, чтобы не было лишней задержки. if Index1 >= Count then begin Node3.Item[2].Item[0].Text := 'ok'; Node3 := Node3.GetNextChild(Node3); if Node3 = nil then Timer1.Enabled := False; Index1 := -2; // Потом все равно будет inc(Index1) и значение станет -1. Как раз первый вариант case Index1 of end else Item[Index1].Item[0].Text := 'ok'; end; end; inc(Index1); } //***************************************************** end; end. |