-
aka © (05.01.18 22:08) [0]У меня получилось реализовать на двух стекахTActionType = (actInsert, actDelete);
TActionRecord = record
ActType: TActionType; {вставили или удалили}
BeginPos: TPoint; {начало блока текста}
EndPos: TPoint; {конец блока текста}
Text: String; {сам текст}
end;
FUndoStack: array of TActionRecord;
FRedoStack: array of TActionRecord;
Если баловаться большими блоками текста, то сильно жрет память, даже если ограничить глубину стека, то все равно блоком может быть весь текст документа и парочка таких блоков это уже много.
Интересуют другие реализации сего дела. Появилась идея хранить первоначальную полную копию исходного документа а в стеках хранить только позиции блоков.
Но возможна ли такая реализация, это еще нужно пораскинуть мозгом.
Вы что думаете? -
DayGaykin © (05.01.18 22:29) [1]Пусть жрет. Забей
-
ухты © (06.01.18 02:43) [2]в файле хранить
-
kilkennycat © (06.01.18 02:49) [3]
> Появилась идея хранить первоначальную полную копию исходного
> документа
а потом ее полностью удалили, заменили на новую, и так 200 раз...
я за [1] и [2]
а вообще в интернете есть много умных статей по андо-редо. даж читал. после прочтения просто отказался от ентого в своем проекте :) -
Eraser © (06.01.18 04:43) [4]
> aka © (05.01.18 22:08)
> то сильно жрет память
зипуй, будет жрать раз в 8 меньше памяти. -
Игорь Шевченко © (06.01.18 10:47) [5]В стеке имеет смысл хранить не исходный материал, а действия над ним, и, соответственно, действия, обратные произведенным.
Например, чтобы отменить команду вставки единственного символа в терабайтный текстовый файл достаточно хранить команду удаления этого символа и позицию. -
aka © (07.01.18 00:12) [6]А пусть пока жрет, работает же.