|
|
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Господа знатоки, если кто в курсе - скажите, пожалуйста, можно ли в SynEdit подменить весь текст так, чтобы он считал, что это именно редактирование. Тупое присвоение Text := '' он понимает как новый текст, при этом теряются все Undo. Я попробовал выделить весь текст и подменить SelText. Это работает, но при этом пометка текста также запоминается, как отдельная операция, и по Undo он восстанавливает это выделение. Не то, чтобы это смертельно, но некрасиво, хотелось бы этого избежать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 20:06 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur, Что конкретно ты хочешь получить? Чтобы при замене SynEdit.Text:='.......' он в Undo ничего не складывал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 20:08 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
DarkMaster, наоборот. Чтобы он считал, что подмена текста - это вариант изменения и чтобы можно было по Undo возвратить предыдущий текст ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 20:15 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur, Если тебе нужно только то, что ты описал в начале - просто подправь исходники SynEdit. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Коротко: если операция удаления - то Undo вызывается повторно (рекурсивно, однократно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 20:58 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, по-моему, это не совсем то, что нужно (либо я чего-то не догоняю). Я так понимаю, ты дал вариант сброса пометки блока. На Undo это не совсем удобно, блок я мог выставить и сам, руками, тогда сбрасывать его по Undo не надо, в этом случае все правильно. Я просто хочу вариант (очень желательно, штатный - трудно поверить, что его нет совсем), когда полная подмена текста воспринимается просто как очередное изменение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 21:26 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Код: pascal 1. 2. 3. 4. 5. 6. Тебя в этом коде ну вот вообще ничего не смущает?.. Почему не просто: Код: pascal 1. 2. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 21:51 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur, Это редактор, операция "замена текста" вызывается только после выделения текста, который заменяется. Так сделано (1). "Софтовая" операция .Text := '***' вызывает, кроме всего прочего, и ClearUndo. Так сделано (2). Но ты можешь определить собственный обработчик OnCleared для свойства Lines контрола. Код: pascal 1. Код: pascal 1. 2. - в котором не очищать буфер Undo. Однако, сохранения буфера Undo недостаточно: в буфере Undo не хранится весь текст, а только "дельта" - операции. То есть, придется где-то сохранять и весь буфер. И тебе придется дополнить формат операций Undo и, соответственно, их обработку по Ctrl+Z/+R. Не очень сложно. А зачем тебе вообще эта головная боль? "Подмена текста" выполняется при инициализации контрола, какие там могут быть Undo? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 21:59 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
alekcvp, в том месте. где многоточие - ъъъъъ Код: pascal 1. Item меняется. Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:03 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, конкретно в моем случае я периодически выполняю конвертацию текста из одной кодировки в другую. И хочу иметь возможность откатить конвертацию. А операция замены текста может выполняться и иначе - например, несколько раз нажать в нужном месте Delete и ввести новый текст. При этом выделение вовсе необязательно, а редактор считает текст изменившимся - со всеми вытекающими из этого последствиями. Правда, при этом сохранится и соответствующее количество Undo, конечно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:07 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur, Либо я мало что понял, либо ты натягиваешь сову на глобус..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:38 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur ъъъъъ, конкретно в моем случае я периодически выполняю конвертацию текста из одной кодировки в другую. И хочу иметь возможность откатить конвертацию. А операция замены текста может выполняться и иначе - например, несколько раз нажать в нужном месте Delete и ввести новый текст. При этом выделение вовсе необязательно, а редактор считает текст изменившимся - со всеми вытекающими из этого последствиями. Правда, при этом сохранится и соответствующее количество Undo, конечно... Я бы сделал функцию конвертации с двумя параметрами: (1) исходный код символа и (2) код после конвертации. А класс контрола редактора дополнил бы методом - функцией высшего порядка, в которую бы передавал функцию конвертации. И этот метод последовательно обрабатывал бы все символы тестового буфера и буферов Undo-Redo. Таким образом, undo-redo остался бы неизменным при смене кодировки, а саму кодировку бы менял "внешней" командой, без Ctrl/Z/R. Так, например, в Notepad++ сделано: undo/redo сам по себе, кодировка - сама по себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:43 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
DarkMaster, может быть... На самом деле, проблема решена. Я нашел, в какой момент сбросить выделение, меня это вполне устраивает. Всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:43 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur DarkMaster, может быть... На самом деле, проблема решена. Я нашел, в какой момент сбросить выделение, меня это вполне устраивает. Всем спасибо И тут не расскажешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:44 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, а можно как-то узнать текущий индекс UndoList, чтобы проверить ChangeReason? P. S. Могу рассказать. Дело в том, что я нашел способ отловить именно тот Undo, который возвращает текст к состоянию до конвертации. Пока я просто по умолчанию считаю, что он возвращает этот текст помеченным и снимаю пометку. Но хотелось бы понять, с каким именно айтемом из андулиста я в данный момент имею дело и проверить его ChangeReason - так, по-моему, будет красивее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 22:50 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur как-то узнать текущий индекс UndoList "Текущий" - то этот, который находится сверху. :) Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 23:16 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
S_Gur, или Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 23:18 |
|
||
|
Полная замена текста в SynEdit
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, Странно... Наверное, я еще не все понял. После Undo PeekItem Nil, UndoList.ItemCount 0, но текст все равно выделенный. Видимо, SelectAll, который я вызываю перед заменой текста, не входит в UndoList. Ладно, это уже не настолько важно - выделение я сбрасываю. Еще раз спасибо за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2020, 23:26 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2037824]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
9ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 464ms |

| 0 / 0 |
