Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Undo   Найти похожие ветки 

 
hexone ©   (2004-02-09 14:55) [0]

Добрый день/ночь.
Имеется задача сделать Undo в программе. Но Undo собственно класса, реализующего интерфейс. На изменение любого свойства класса, сам класс запоминается в глобальном стеке.
При вызове метода Undo, последний "засунутый" класс должен скопировать свое содержимое в текущий (пересозданный в этом Undo). Возможно ли просто скопировать кусок памяти из стекового класса в собственный, не "поедет" ли Vtable?
С благодарностью приму другие предложения.


 
Mystic ©   (2004-02-09 15:13) [1]

А зачем? Запоминать класс довольно долго, проще сделать реверсивный Lister всех изменений --- изменено свойство Name (cтарое значение OldValue). Создай абстрактный класс

TChangeHistory = class/interface
protected
property AuditInfo[I: Integer]: TChangeInfo;
property Capacity: Integer; // (Size or count)
property Position: Integer;
property ItemCount: Integer;
public
procedure AuditChange(Info: TChangeInfo); // Для тебя имя стойства и старое значение
procedure Undo;
procedure Redo;
procedure Clear;
property CultivatedClass: TObject;
end;

procedure TChangeHistory.Undo;
begin
Assert(Position > 0);
ProcessChange(AuditInfo[I]); // меняем местами старое значение (из AuditInfo[I]) и текущее (из CultivatedClass)
Position := Position - 1;
end;

procedure TChangeHistory.Redo;
begin
Assert(Position < ItemCount - 1);
ProcessChange(AuditInfo[I]); // меняем местами старое значение (из AuditInfo[I]) и текущее (из CultivatedClass)
Position := Position + 1;
end;


 
hexone ©   (2004-02-09 15:17) [2]

Угу, понятно. Спасибо. По сути ProcessChange проверяет изменились или нет? Если да, то восстанавливает. Правильно я понял?


 
Mystic ©   (2004-02-09 15:26) [3]

Нет. Например, была история измений


Исходные данные
P1 = 0
P2 = 0

Свойство | Новое значение
P1 23
P1 45
P2 25
P2 57
P3


Эти изменения надо записать как

P1 (0)
P1 (23)
P2 (0)
P2 ( 25) <- Position

Класс: P1 = 45, P2 = 57


После Undo возникает ситуация:

P1 (0)
P1 (23)
P2 (0) <- Position
P2 ( 57)
Класс: P1 = 45, P2 = 25


ProcessChange должен обменять выделеные жирным текущее значение свойства (P2) и старое значение в базе (P1)

Далее

Undo

P1 (0)
P1 (23) <- Position
P2 (25)
P2 (57)
Класс: P1 = 45, P2 = 0


Еще Undo

P1 (0) <- Position
P1 (45)
P2 (25)
P2 (57)
Класс: P1 = 23, P2 = 25


Redo

P1 (0)
P1 (23) <- Position
P2 (25)
P2 (57)
Класс: P1 = 45, P2 = 0


И т. д.


 
Mystic ©   (2004-02-09 15:32) [4]

Исправление по ходу

procedure TChangeHistory.Redo;
begin
Assert(Position < ItemCount - 1);
Position := Position + 1;
ProcessChange(AuditInfo[I]); // меняем местами старое значение (из AuditInfo[I]) и текущее (из CultivatedClass)
end;


Идея, я думаю, понятна...



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.02 c
1-53624
R
2004-02-06 15:56
2004.02.17
Как импортировать ссылку в мемо из браузера


6-53679
Shaman O Mega
2003-10-23 14:39
2004.02.17
ip в TIdTCPServer при подключение клиента


1-53477
Dmitriy
2004-02-06 12:48
2004.02.17
Цикл по Edit ам...


4-53818
Mohamed
2003-12-11 23:09
2004.02.17
Stop watch


1-53555
Воа
2004-02-05 12:51
2004.02.17
TColor -> HTML цвета