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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2014, 07:49   #1
Dmitro25
 
Регистрация: 19.11.2010
Сообщений: 7
По умолчанию Как создать уникальную копию record, содержащую вложенные динамические массивы?

Здравствуйте.
У меня в программе имеются записи (records), содержащие динамические типы данных (вложенные динамические массивы, строки).
Иногда возникает необходимость создать полную копию данной записи, чтобы в новой копии все данные были уникальны (т.е. не ссылались на одно место в памяти, как динамические массивы и строки). Это нужно, например, для потокобезопасной работы с данными или для передачи копии данных в процедуру, которая при работе может эти данные менять.
Не работает (как и ожидалось) присваивание записей, не работает также функция Copy.
Подскажите, как сделать копию данных (вручную перебирать уж очень не хочется)?
Код:
procedure TForm1.FormCreate(Sender: TObject);
type
  TMT = record
    a: array of record
      b: array of record
        c: byte;
      end;
    end;
  end;
var
  mr1, mr2: TMT;
begin
  setlength(mr1.a, 1);
  setlength(mr1.a[0].b, 1);
  mr1.a[0].b[0].c := 1;
  mr2 := mr1;
//  mr2.a := copy(mr1.a);
  mr1.a[0].b[0].c := 2;
  caption := format('%d %d', [mr1.a[0].b[0].c, mr2.a[0].b[0].c]);
end;
Dmitro25 вне форума Ответить с цитированием
Старый 08.10.2014, 08:40   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
вручную перебирать уж очень не хочется
А придётся.
Если ещё не поздно переделывать, советую отказаться от такой организации типов и юзать классы и списки.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.10.2014, 09:47   #3
Dmitro25
 
Регистрация: 19.11.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
А придётся.
Если ещё не поздно переделывать, советую отказаться от такой организации типов и юзать классы и списки.
Неужели нет такой функции готовой? Задача вроде бы достаточно актуальная. И ведь самое обидное, что компилятор это мог бы делать, т.к. Finalize(record) и SetLength(record.array) он делает корректно, соответственно, разбирается в том какие данные лежат внутри. Можно, конечно, самому что-нибудь сделать с использованием TypeInfo и т.д., но я думал, что, возможно, уже есть готовое решение, которое не нужно перед использованием ещё долго отлаживать.

А на классы и списки мне переходить не резон, в той задаче, которую я реализую, записи с динамическими структурами подходят больше всего, плюс опять же автоматическое управлением временем жизни, да и в классах всё равно пришлось бы вручную прописывать процедуры клонирования данных.
Dmitro25 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вложенные массивы, вытащить ключи как? bush007 PHP 4 18.06.2014 09:45
Создать копию базы для теста и отладки на MSSQLserv Kaifun SQL, базы данных 2 09.10.2012 07:52
Как придумать уникальную идею? Larboss Свободное общение 21 07.07.2012 17:13
Как создать копию существующего окна? u-a-ulia Общие вопросы C/C++ 0 04.10.2010 17:52
Не могу создать копию проекта John_chek БД в Delphi 4 15.02.2008 15:53