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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2015, 19:29   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Вопрос Ссылка на объект и клонирование объекта

Доброго времени

Суть:
Есть некий наследник TCustomPreference класса. который, работая в режиме хранения объекта, должен обращаться к объекту если тот есть, и взаимодействовать с ним через реализованные абстрактные методы.

Вопрос:
Как ссылаться на объект?

Моя задача создать настройку, передать ей объект, далее там внутри, с этим объектом работают виртуальные методы. У меня сейчас оно освобождает объект когда это не надо, что рушит программу)

Ну и второе:
В настройке есть 3 состояния:
1. Текущее
2. Предыдущее значение (копия данных до изменения пользователем)
3. Состояние по-умолчанию (данные по умолчанию)

Если с простыми типами(строки, числа и т.д.) все просто, то с объектами сложно
Состояние по умолчанию, думаю реализовать вызовом виртуального objReset у настройки и далее в манипуляции с объектом.

А вот сохранить текущее состояние объекта как предыдущее а затем откатить любые изменения в классе из предыдущего значения - вот это задача. Не создавать же мне 3 экземпляра класса...
Человек_Борща вне форума Ответить с цитированием
Старый 23.09.2015, 19:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
У меня сейчас оно освобождает объект когда это не надо, что рушит программу)
А собсно почему бы это не пофиксить?
Цитата:
вот сохранить текущее состояние объекта как предыдущее а затем откатить любые изменения в классе из предыдущего значения - вот это задача.
Теперь я запутался. Тебе нужно создать механизм Undo?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2015, 20:23   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
А собсно почему бы это не пофиксить?
Вот собственно и проблема в том что я затупил, и не понимаю как сделать ссылку на объект.
Цитата:
Теперь я запутался. Тебе нужно создать механизм Undo?
Да, undo для любого объекта.
Человек_Борща вне форума Ответить с цитированием
Старый 23.09.2015, 20:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А че ссылка на объект - любая инициализированная переменная соответствующего типа и есть ссылка. А вот undo для объекта, да еще любого? undo для экземпляра TADOQuery, например, это чего будет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.09.2015, 20:47   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Не создавать же мне 3 экземпляра класса...
А почему бы и нет? Не такие уж большие расходы. Даже если их будет и более чем три.
В любом случае, что восстановить объект в нужном состоянии хранить ВСЕ промежуточные изменения.
Исходное (нулевое состояние)
+ список выполненных операций (и чем это лучше копий объекта в разных состояниях)
при желании такие изменения можно оформить в виде отдельных классов (объектов) по манипулированию основным.

и проводить регенерацию объекта (установка в нулевое состояние и последовательное изменение состояний до нужного момента).

Хранить все операции отката( т.е. кроме операций по изменению иметь еще и обратные операции (а их ещё надо придумать/описать) а объем они будут занимать такой же как и список выполненных.
тоже можно подумать о классах (объектах) манипуляторах.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 23.09.2015, 20:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Да, undo для любого объекта.
Сериализируй. ИМХО это самое эффективное, что можно придумать. Сериализация в стрим, а с него в файл-кэш. Я бы так сделал. Т.е. каждому объекту, которым будет управлять TCustomPreference прикрутить методы записи и считывания их данных.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 07:09   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Второй вариант тоньше, но сложней в реализации - записывать только изменения. Для этого сложные системы (например файловая система или ОС и даже вроде БД) ведут журналы, в которых отражаются все изменения.
Цитата:
Как ссылаться на объект?
Стандартно - заводите переменную и проверяете на Nil когда надо.
Цитата:
А вот сохранить текущее состояние объекта как предыдущее а затем откатить любые изменения в классе из предыдущего значения - вот это задача. Не создавать же мне 3 экземпляра класса...
Да вообще можно динамический массив состояний запилить, это если по-быстрому на вскидку делать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 24.09.2015 в 07:12.
Utkin вне форума Ответить с цитированием
Старый 24.09.2015, 13:59   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Да, сериализация самый лучший вариант ) Отмена изменений - банально с диска перезагрузить данные в объект. А это уже реализовано) Спасибо. Разобрался.
Человек_Борща вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на объект не указывает на экземпляр объекта. Таксист C# (си шарп) 2 23.07.2015 23:46
ссылка на объект не указывает на экземпляр объекта kalipta C# (си шарп) 1 16.12.2014 14:58
ссылка на объект не указывает на экземпляр объекта aliqulu C# (си шарп) 3 16.03.2014 12:17
В экземпляре объекта не задана ссылка на объект. Madmaxisss C# (си шарп) 2 17.08.2013 09:25
Ссылка на объект не указывает на экземпляр объекта. Kazbek17 C# (си шарп) 11 08.02.2012 18:56