На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
> Как добавить дочерний элемент threeview?
    RusSun, я понимаю, что массив у меня не совсем правильно реализован. Просто я пока еще не знаю как составить массив из записей, при условии когда в одну запись record, вложен еще один массив, например с картинками и как правильно установить setLength, когда изначально количество картинок неизвестно, например их может быть 2,3 или 5, поэтому нужно как-то сделать массив динамическим, а setLength чтобы мог работать с заранее неизвестным количеством изображений. Единственное что приходит на ум это в главном record где содержится массив с картинками добавить еще одну переменную, например countImg и присваивать ей значение количество картинок, потом использовать эту переменную в setLength вот так.
    ExpandedWrap disabled
      TImage=record
            big:TBig;
            small:TSmall;
            countImg:Integer; //<-- количество картинок
        end;
    Сообщение отредактировано: Katerina1993 -
      ExpandedWrap disabled
        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;

        macomics,

        Добавила функцию для создания массива и переделала код под себя. Столкнулась с такой проблемой, что в дереве у картинок status не выводится. Протестировала и присвоила любое значение status в функции NewTImage оно выводится, но стоит записать вот так:
        Цитата
        status:=big[i].status;,

        то значение пустое, хотя я обращаюсь к записи
        Цитата
        TImageData = packed record
        куда отправляется значение статуса картинки. Вот мой код полностью.
        ExpandedWrap disabled
          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.
          На 96 строке скорее всего надо написать так
          ExpandedWrap disabled
            bigImg:=_bigImg;

          Функция NewTImage это и есть конструктор. Зачем вы добавили дополнительный конструктор. Функция NewTImage должна вызываться в конструкторе и больше ни где! Она выделяет память и инициализирует некоторые значения в полях получившейся структуры. После этого вы можете обращаться к полям структуры без вызова этой функции.
          ExpandedWrap disabled
            ShowMessage(Data[0].big[0].status);
          Сообщение отредактировано: macomics -
            Цитата
            Зачем вы добавили дополнительный конструктор.

            Я не до конца поняла как конструктор работает. Он устанавливает значение для определенного количества изображений, но здесь также следует учитывать, что картинки вложены в массив data. Это значит что массив многомерный. Как с этим быть?
            Например
            Data[0].img[0..9] <--выбор картинки.
              Вот такую структуру данных создает функция NewTImage в моем исходном варианте
              ExpandedWrap disabled
                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 и в таких же пределах
                // изменяется Номер столбца. Значение не инициализировано, но место зарезервировано для загрузки картинки

              В вашем случае это будет такая структура
              ExpandedWrap disabled
                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 = ??? <- Это значение не инициализировано
              В моей исходной структуре данных только значения в массивах для хранения картинок не инициализируются. Но в вашей структуре остается очень много незаполненных значений, которые вы вручную заполняете после.
              Для того, чтобы не печатать лишний текст используйте для заполнения структуры конструкцию
              ExpandedWrap disabled
                with Data[0] do begin
                //  Далее к полям Data[0] можно обращаться напрямую
                  sLength := 5;
                end;


              Добавлено
              Попробую кратко объяснить что делает эта строка
              ExpandedWrap disabled
                Data[0].NewTImage.big[0].status:='wait';
              Она создает мою структуру вызывая конструктор NewTImage. Далее вы обращаетесь к полю этой новой структуры big и выбираете из массива элемент с нулевым индексом. В этом элементе обращаетесь к полю status устанавливая его значение в 'wait'. Но после этого моя конструкция ни где не сохраняется и следующая строка
              ExpandedWrap disabled
                Data[0].NewTImage.big[1].status:='wait';
              Выделяет новую структуру, с которой происходит тоже самое, что и с первой. И вторая структура тоже ни где не сохраняется. и т. д. для каждой из похожих на эти строчек.

              Посмотрите мой пример еще раз. На 63 строке я приводил строчку, которая использует мою функцию правильно. Вы потеряли Image :=
              Сообщение отредактировано: macomics -
                Все разобралась, теперь работает.
                ExpandedWrap disabled
                  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.
                Сообщение отредактировано: Katerina1993 -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:
                Страницы: (3) 1 2 [3]  все


                Рейтинг@Mail.ru
                [ Script execution time: 0,0576 ]   [ 16 queries used ]   [ Generated: 7.11.24, 09:48 GMT ]