Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c