Главная страница
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
14-53755
CS
2004-01-27 21:01
2004.02.17
Хостинг


14-53736
raptorus
2004-01-28 16:27
2004.02.17
Приветствую всех, нужна дока по RAVE Reports, подскажите где


1-53573
абырвалГ
2004-02-08 15:34
2004.02.17
Последняя видемая строка


1-53512
JediMaster
2004-02-05 17:02
2004.02.17
Поиск слова


11-53444
EAccessViolation
2003-05-24 13:31
2004.02.17
MainMenu???!