Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.84.25.165] |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#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. |