Как реализовать несколько Undo/Redo?

У меня есть форма с 4 полями редактирования и памяткой, и я пытаюсь понять, как реализовать несколько повторов отмены, например:

Поэтому, если пользователь вводит текст в редактировании 3,1,2, памятке, а затем редактировании 4, я хочу отменить в обратном порядке, а также повторить в исходном порядке.

Однако я не совсем уверен, как отследить заказ. Любая помощь в этом будет оценена

Я использую Делфи 7


person colin    schedule 02.07.2012    source источник
comment
См. шаблон разработки команд и Шаблон дизайна Memento.   -  person NGLN    schedule 04.07.2012


Ответы (3)


Самый простой способ — зафиксировать любое изменение в любом включенном элементе управления и записать состояние (содержимое, выделение, положение курсора) всех четырех элементов управления вместе. Делайте это для каждого изменения, и у вас будет стек отмены. Теперь, когда вам нужно отменить операцию, вы восстанавливаете все элементы управления в их сохраненное состояние.

Эта схема может быть довольно ресурсоемкой, и после ее реализации вы захотите оптимизировать ее, сохранив только разницу или последнюю операцию, выполненную для определенного элемента управления. Проблемы

(а) стандартное редактирование/памятка не даст вам информации о том, что именно изменилось, поэтому вам нужно будет как-то вычислить изменение (например, сравнив его с ранее записанным состоянием, но это означает, что вам нужно будет «перестроить " содержимое из начального состояния и через все изменения, затем сравните состояние current-1 с текущим состоянием, чтобы узнать изменение,

(b) стандартные элементы управления сами обрабатывают операцию отмены, и пользователь может отменить один элемент управления, нарушив таким образом порядок вашего стека отмены.

Может быть, вы можете использовать какой-нибудь сторонний элемент управления редактированием/заметкой, который будет более терпимым к вашим потребностям и позволит вам контролировать операции отмены/повторения. Например, однажды я создал элемент управления TElEdit для ElPack (теперь LMD ElPack принадлежит LMD Innovative), и этот элемент управления, помимо других функций, имел стек отмены/возврата, и я знаю, как TElEdit может помочь вам с небольшими изменениями исходного кода. Возможно, вы захотите проверить TElEdit или другой подобный компонент, чтобы увидеть, что они могут вам предложить.

person Eugene Mayevski 'Callback    schedule 02.07.2012
comment
Техника обратной дельты уменьшит скорость отмены изменений текста, начиная с последней версии. - person mjn; 02.07.2012

Используйте для этого Шаблон команды. Я не буду объяснять всю концепцию, так как их уже много, но хороший пример можно найти здесь, и есть много других, если вы ищете "Шаблон команды отменить повторить"

person Alan Clark    schedule 04.07.2012

используйте элемент управления TClientDataSet в качестве хранилища памяти и 4 элемента управления tdbedit. См. метод возврата TClientDataSet, undolastchange.

person Zozito    schedule 02.07.2012