Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-53793
Blamyr
2003-11-30 22:55
2004.02.17
Копирование файлов


1-53617
Александр
2004-02-07 12:58
2004.02.17
Как добится чтобы размер окна приложения...


14-53737
}|{yk
2004-01-28 14:36
2004.02.17
Дайджесты на CD


1-53518
Genry
2004-02-05 15:43
2004.02.17
Зарегистрирован ли COM-объект ?


3-53383
denis24
2004-01-27 13:31
2004.02.17
Параметры в query





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский