Главная страница
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.031 c
1-53497
Алексей
2004-02-06 08:14
2004.02.17
массив форм


8-53649
Леон
2003-10-13 22:45
2004.02.17
разоряюсь при черно-белой печати на цветные чернила


7-53781
Gaval
2003-12-02 09:55
2004.02.17
Реакция на и зменение контрасности монитора


1-53606
Xizzy
2004-02-07 16:49
2004.02.17
изменить memo


6-53685
webpauk
2003-12-15 13:29
2004.02.17
активность сетевых компов