отмена в своём контроле
От: VVVa  
Дата: 30.11.21 16:14
Оценка:
собственно подскажите как делают CTRL+Z и CTRL+Y в своём контроле (наподобии RitchTextBox)
неужели на одну отмену весь текст сохраняют ... или как-то по другому?
Re: отмена в своём контроле
От: Mr.Delphist  
Дата: 30.11.21 16:36
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>собственно подскажите как делают CTRL+Z и CTRL+Y в своём контроле (наподобии RitchTextBox)

VVV>неужели на одну отмену весь текст сохраняют ... или как-то по другому?

https://en.wikipedia.org/wiki/Memento_pattern
Re: отмена в своём контроле
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 30.11.21 17:32
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>собственно подскажите как делают CTRL+Z и CTRL+Y в своём контроле (наподобии RitchTextBox)

VVV>неужели на одну отмену весь текст сохраняют ... или как-то по другому?
Вы имеете в виду механизм Undo/Redo?
Как делают в контроле не подскажу, а вот в редакторе VS, сохраняется diff на каждую операцию, т.е. если очень примитивно, то:
— все операции сводятся к замене (т.е. вставка это замена пустой строки на то, что вставляют, а удаление — удаляемого текста на пустую строку)
— запоминается цепочка изменений и последнее (текущее) состояние

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

P.S. На самом деле, такая схема там получилось не только из-за Undo/Redo, там больше решали несколько иную проблему, но тем не менее.
P.P.S. Если вдруг вам станет интересно, можете посмотреть мою недавнюю заметку на тему ITextBuffer (но там, конечно больше про внешнее API, чем про внутреннее устройство)
Re: отмена в своём контроле
От: Kolesiki  
Дата: 01.12.21 10:16
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>собственно подскажите как делают CTRL+Z и CTRL+Y в своём контроле (наподобии RitchTextBox)

VVV>неужели на одну отмену весь текст сохраняют ... или как-то по другому?

Сам же догадался — конечно, работают с "изменениями"! Вставил строку — записал команду "вставка". Сменил стиль — ещё записал. А потом эти записи в стеке раскручиваешь в обратном порядке (при undo). Ничего сложного, просто кропотливая работа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.