Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите сделать временную копию объекта


Страницы:   1 2

newid ©   (2005-01-30 23:14:00) 

может, вопрос совсем несерьезный, но не получается что-то...
нужно создать временную копию объекта ("резервную копию", из которой можно будет восстановить состояние исходного объекта при необходимости), при этом объект может быть экземпляром одного из нескольких наследников общего дедушки, т.е. точно класс объекта не знаем.
такое:
obj2 := obj1;
try
DoSome(obj1);
except
obj1 := obj2;
end;
само собой не катит, потому что с сылками работаем.
как вообще оперировать объектами в Object Pascal?


New11   (2005-02-02 14:25:00) [1]

реализуй для своих классов метод Assign, как и было сказано. Самый внятный подход. А c использованием TypInfo получишь кучу глюков, тем паче что он не документирован.


Amoeba   (2005-02-02 14:17:00) [2]


> newid   (02.02.05 13:53) [23]
> да, кстати, а каких-нибудь готовых отлаженных библиотек
> на эту тему нет в природе?

IMHO таких нет.


newid   (2005-02-02 13:53:00) [3]

да, кстати, а каких-нибудь готовых отлаженных библиотек на эту тему нет в природе?


Просто Джо   (2005-02-01 03:07:00) [4]


> единственный более-менее разумный подход...


Мне лично он кажется наиболее "системным", универсальным что-ли.


newid   (2005-01-31 19:33:00) [5]


> [19] GuAV ©


>  [20] Просто Джо ©

получается, сохранять в потоке -- единственный более-менее разумный подход...


Просто Джо   (2005-01-31 19:12:00) [6]

http://www.rsdn.ru/article/delphi/serialization.xml


GuAV   (2005-01-31 19:06:00) [7]


> ткните меня носом в какие-нибудь исходники, где
> подобные механизмы реализованы

TStream.WriteComponent;


newid   (2005-01-31 16:38:00) [8]


> [14] jack128 ©   (31.01.05 16:02)
> Эти лишние операции существенно снижают производительность
> твоей программы?

нет, существенно не снижают. но ведь разумнее на "клиенте" эти вещи делать, согласись.
ладно. ткните меня носом в какие-нибудь исходники, где подобные механизмы реализованы


jack128   (2005-01-31 16:36:00) [9]

Gloomer ©   (31.01.05 16:12) [15]
о1 и о2 не относятся к одному типу.

ошибаешся.
А вот при таком
arr1: array of Integer;
arr2: array of Integer; действительно к разным типам


У   (2005-01-31 16:15:00) [10]

>Gloomer ©   (31.01.05 16:12) [15]
>Если я не ошибаюсь,
ты ошибаешься


Gloomer   (2005-01-31 16:12:00) [11]

>newid   (30.01.05 23:43) [2]

Если я не ошибаюсь, то при определении
var
o1: TSomeObject;
o2: TSomeObject;

о1 и о2 не относятся к одному типу. Попробуй лучше
var o1, o2: TSomeObject;


jack128   (2005-01-31 16:02:00) [12]

pasha_golub ©   (31.01.05 11:37) [12]
А можно ситуацию подробней описать. Имею ввиду, зачем нужен резервный экземпляр? При каких таких раскладах? У меня даже мысли накакой нету.


Ну, например, для реализации механизма транзакций..
newid   (31.01.05 15:48) [13]
а получается, что он решается не так уж просто

В общемслучае он не решается. В часных случаях возможны варианты. Например, для TPersistent можно сохранить состояние в поток, а потом, если нужно, восстановить его..
newid   (31.01.05 15:48) [13]
как это делается при инициализации, но ведь лишние операции ввода-вывода...

Эти лишние операции существенно снижают производительность твоей программы?


newid   (2005-01-31 15:48:00) [13]


>  [12] pasha_golub ©   (31.01.05 11:37)
> А можно ситуацию подробней описать

можно. резервный экземляр нужен, если пользователь работает с объектом, может менять его данные. а сам объект (его состояние) хранится постоянно где-то. ну начал юзер редактировать данные, вместо подтверждения изменений -- передумал, отменил изменения. объект (вернее его отображение) должен вернуться в прежнее состояние. можно, конечно, восстановить из места постоянного храниения, как это делается при инициализации, но ведь лишние операции ввода-вывода...
да кучу всяких подобных ситуаций можно придумать. мне кажется, что это вообще рабочая ситуация, с которой постоянно приходится сталкиваться.
вообще-то я полагал, что этот вопрос только от моего недостатка знаний, а получается, что он решается не так уж просто. или вообще не решается?...


pasha_golub   (2005-01-31 11:37:00) [14]

А можно ситуацию подробней описать. Имею ввиду, зачем нужен резервный экземпляр? При каких таких раскладах? У меня даже мысли накакой нету.


Erik1   (2005-01-31 11:23:00) [15]

Лучше логику ререработать, чем создовать механизм сохранения объектов. Небывает таких методов которые все даные сразу должны портить.


jack128   (2005-01-31 07:59:00) [16]

newid   (31.01.05 7:22) [8]
мне кажется, нужно с памятью работать. что-то типа:

Нет. Вот как раз в этом случае так делать не надо. см
хм ©   (31.01.05 2:19) [5] можно использовать CopyMemory, если в объекте нет указателейобъекты - это тоже указатели.


ЮЮ   (2005-01-31 07:58:00) [17]

А не лучше вместо
obj2 := obj1;
try
 DoSome(obj1);
except
 obj1 := obj2;
end;

DoSome сделать виртуальным методом и уже в нем, реально зная, что можно "попортить", и делать необходимый "сохранения" и, собственно, откат в случае неудачи?


newid   (2005-01-31 07:22:00) [18]


>  [6] Просто Джо ©   (31.01.05 03:29)
> Проще всего, неверное, унаследовать все классы от TPersistent.

можно. тут еще проблема: одно или несколько свойств объекта сами могут быть объектами. как такие свойства буду сохраняться?
мне кажется, нужно с памятью работать. что-то типа:

sz := o1.InstanceSize;
p2 := AllocMem(sz);
CopyMemory(p2, o1, sz);
DoSome(o1);
CopyMemory(o1, p2, sz);
FreeMem(p2, sz);

только это не работает. потому что неправильно написано. научил бы кто-нибудь правильно такое делать


Просто Джо   (2005-01-31 03:35:00) [19]


> [6] Просто Джо ©   (31.01.05 03:29)


Блин, заработался. Имелся в виду TComponent.


Просто Джо   (2005-01-31 03:29:00) [20]

Проще всего, неверное, унаследовать все классы от TPersistent. Далее, все свойства, которые нужно сохранять/восстанавливать сделать Pusblished. После этого использовать стандартные возможности стриминга для ТПерсистент.
Впрочем, в этом решении, как в остальных также много подводных камней. Но - лиха беда начало! :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо