Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2022, 15:54   #1
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию Работа с динамическими многомерными массива - загрузка через файл и запись в record

Здравствуйте мне нужно из текстового файла прочитать массив и каждый элемент записать в record.
Вот структура текстового документа:
Код:
Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [1] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [2] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [3] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [4] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                )

            [5] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [6] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            [7] => Array
                (
                    [title] => Название
                    [text] => Мой текст 1
                    [status] => wait
                    [item] => Array
                        (
                            [text] => Array
                                (
                                    [descirption] => Описание
                                )

                        )

                )

            ..... продолжения массива

)
При прочтения из файла.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
//Вывод файла в Memo1
  AssignFile(f,'data.txt');
  Reset(f);
  ReadLn(f, st);
  Memo1.Lines.Clear;

  while not eof(f) do
  begin
    ReadLn(f, st);
    Memo1.Lines.Add(st)
  end;
  CloseFile(f);
end;
Я получаю текст в Memo1.
screen2.jpg
При нажатии кнопки нужно, чтобы документ открывался и каждый элемент записывался в переменную record. Структуру record я уже составила. Вот как выглядит пример записи и чтения в каждую переменную.
Код:
//Пример записи в массив
procedure TForm1.FormShow(Sender: TObject);
begin
//В ДОКУМЕНТЕ МАССИВ СОСТОИТ ИЗ 10 ЭЛЕМЕНТОВ, устанавливаем SetLength.
SetLength(Data,9);
Data[0].title:='Название';
Data[0].text:='Мой текст';
Data[0].status:='ok';
Data[0].item.text.description:='Описание';
end;
//Пример чтения из массива
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Clear;
Memo2.Lines.Add('title=>'+Data[0].title);
Memo2.Lines.Add('text=>'+Data[0].text);
Memo2.Lines.Add('status=>'+Data[0].status);
Memo2.Lines.Add('Data=>[0]=>item=>text=>description=>'+Data[0].item.text.description);
end;
Как это сделать чтобы документ с массивом считывался и элементы из файла записывались в переменные record? Вот код полностью:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TText=record
      description: String;
  end;

  TItem=record
      text: TText;
  end;
  TIndex=record
         title : String;
         text: String;  
         status : String;
         item:TItem;
      end;
  type
    TData = array of TIndex;

var
  Form1: TForm1;
  Data: TData;
  f  : TextFile;
  st: String;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//Вывод файла в Memo1
  AssignFile(f,'data.txt');
  Reset(f);
  ReadLn(f, st);
  Memo1.Lines.Clear;

  while not eof(f) do
  begin
    ReadLn(f, st);
    Memo1.Lines.Add(st)
  end;
  CloseFile(f);
end;
//Пример записи в массив
procedure TForm1.FormShow(Sender: TObject);
begin
//В ДОКУМЕНТЕ МАССИВ СОСТОИТ ИЗ 10 ЭЛЕМЕНТОВ, устанавливаем SetLength.
SetLength(Data,9);
Data[0].title:='Название';
Data[0].text:='Мой текст';
Data[0].status:='ok';
Data[0].item.text.description:='Описание';
end;
//Пример чтения из массива
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Clear;
Memo2.Lines.Add('title=>'+Data[0].title);
Memo2.Lines.Add('text=>'+Data[0].text);
Memo2.Lines.Add('status=>'+Data[0].status);
Memo2.Lines.Add('Data=>[0]=>item=>text=>description=>'+Data[0].item.text.description);
end;

end.

Последний раз редактировалось BDA; 10.07.2022 в 23:03.
Катя93 вне форума Ответить с цитированием
Старый 10.07.2022, 16:33   #2
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Ув. Катя93! А зачем Вам вообще считывать уже структурированные данные из текстового файла в динамический массив (ARREY)? Считывайте сразу в Record. Загружайте файл в мемо
memo1.lines.loadFromFile('ваш файл'), затем - цикл от 0 до Lines.Сount-1 со считыванием необходимой группы строк в Ваш Record.
Viktor61 вне форума Ответить с цитированием
Старый 10.07.2022, 17:59   #3
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Viktor61, потому, что данные у меня хранятся именно в текстовом файле в виде структуированного массива, поэтому сделать по другому не получится.

Еще забыла упомянуть, что структура в delphi составлена так, что каждый вложенный элемент массива в текстовом файле соответствует вложенности в записи (record), т.е. одни и те же переменные присутствуют как в массиве внешнего файла так и в record, это нужно учитывать при записи (record).
Катя93 вне форума Ответить с цитированием
Старый 10.07.2022, 19:00   #4
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Катя93, покажите, пож-та, структуру, которая должна получиться на выходе.
Viktor61 вне форума Ответить с цитированием
Старый 10.07.2022, 19:16   #5
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

На скриншоте могу показать. Записала только один record, остальное сделала вручную. Загрузка через Memo2. Стрелкой помечено какая запись из текстового документа соотвествует записи в delphi7.
screen3.jpg
На всякий случай прикладываю исходники delphi. Делала в программе delphi 7.
2Array.zip
Думаю этот как-то через цикл делается, только сначала документ следует загрузить. В исходниках уже есть процедура загрузки. Загруженные данные следует раскидать по переменным в record.

Последний раз редактировалось Катя93; 10.07.2022 в 19:18.
Катя93 вне форума Ответить с цитированием
Старый 10.07.2022, 22:58   #6
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Катя93, уточните по структуре. В файле после [title], [text] и т.д. будет только 1 строка или несколько строк с описанием каких-то сведений?
Viktor61 вне форума Ответить с цитированием
Старый 11.07.2022, 00:07   #7
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию unit.zip

Катя93, посмотрите сырой код с переработанным Вашим модулем.
Вложения
Тип файла: zip Unit1.zip (1.6 Кб, 4 просмотров)
Viktor61 вне форума Ответить с цитированием
Старый 11.07.2022, 00:07   #8
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Viktor61, разумеется массив будет дополнятся. Какое-то вообще имеет значение, обычно при разработке кода всегда предусмотрено расширение функционала.
Катя93 вне форума Ответить с цитированием
Старый 11.07.2022, 00:14   #9
Катя93
Пользователь
 
Регистрация: 11.01.2021
Сообщений: 48
По умолчанию

Viktor61, можно узнать почему "сырой", помоему отлично работает? Мне просто нужно пояснение, что не так?
Катя93 вне форума Ответить с цитированием
Старый 11.07.2022, 00:33   #10
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Катя93, "сырой" - потому, что я так и не смог до конца понять какой результат Вы бы хотели получить в результате чтения из файла. В модуле надо "поработать напильником" - поставить блоки защиты от ошибок и т.п. Кстати - не подойдет ли для работы с файлом data.txt механизм типизированного файла? Подумайте, м.б. при соотв. структуре этого файла программа будет работать быстрее? Успехов!
Viktor61 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись и загрузка с бинарного файла массива структур zetaBiT Общие вопросы C/C++ 14 28.08.2011 23:24
Работа с динамическими массивами типа record Олвин Общие вопросы Delphi 8 14.07.2011 01:13
Запись массива с цифрами файл, и его загрузка Kycaka Общие вопросы C/C++ 4 08.06.2009 22:38
Программирование алгоритмов над многомерными динамическими массивами Master23 Общие вопросы C/C++ 2 30.05.2009 04:28